public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-6666] c++: Fix erroneous parm comparison logic [PR 98372]
@ 2021-01-14 13:31 Nathan Sidwell
  0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2021-01-14 13:31 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:d61d2a5f3ce9238bad7cbd7733d90c6ec7ae5fbc

commit r11-6666-gd61d2a5f3ce9238bad7cbd7733d90c6ec7ae5fbc
Author: Nathan Sidwell <nathan@acm.org>
Date:   Thu Jan 14 05:15:33 2021 -0800

    c++: Fix erroneous parm comparison logic [PR 98372]
    
    I flubbed an application of De Morgan's law.  Let's just express the
    logic directly and let the compiler figure it out.  This bug made it
    look like pr52830 was fixed, but it is not.
    
            PR c++/98372
            gcc/cp/
            * tree.c (cp_tree_equal): Correct map_context logic.
            gcc/testsuite/
            * g++.dg/cpp0x/constexpr-52830.C: Restore dg-ice
            * g++.dg/template/pr98372.C: New.

Diff:
---
 gcc/cp/tree.c                                |  4 ++--
 gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C |  1 +
 gcc/testsuite/g++.dg/template/pr98372.C      | 28 ++++++++++++++++++++++++++++
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index d339036e88e..3a9a86de34a 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -3841,8 +3841,8 @@ cp_tree_equal (tree t1, tree t2)
 	  /* Module duplicate checking can have t1 = new, t2 =
 	     existing, and they should be considered matching at this
 	     point.  */
-	  && (DECL_CONTEXT (t1) != map_context_from
-	      && DECL_CONTEXT (t2) != map_context_to))
+	  && !(DECL_CONTEXT (t1) == map_context_from
+	       && DECL_CONTEXT (t2) == map_context_to))
 	/* When comparing hash table entries, only an exact match is
 	   good enough; we don't want to replace 'this' with the
 	   version from another function.  But be more flexible
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C
index 04f039fac43..2c9d2f9b329 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-52830.C
@@ -1,5 +1,6 @@
 // PR c++/52830
 // { dg-do compile { target c++11 } }
+// { dg-ice "comptypes" }
 
 template<bool b> struct eif { typedef void type; };
 template<>       struct eif<false> {};
diff --git a/gcc/testsuite/g++.dg/template/pr98372.C b/gcc/testsuite/g++.dg/template/pr98372.C
new file mode 100644
index 00000000000..f1e8b0f3323
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr98372.C
@@ -0,0 +1,28 @@
+// PR 98372 ICE due to incorrect type compare
+// { dg-do compile { target c++11 } }
+
+template <typename _Tp> using remove_pointer_t = typename _Tp ::type;
+template <bool> struct enable_if;
+template <bool _Cond, typename>
+using enable_if_t = typename enable_if<_Cond>::type;
+template <typename> bool is_convertible_v;
+template <typename, unsigned long = 0> class Span;
+template <typename T, unsigned long> class Span {
+  using element_type = T;
+  template <unsigned long N>
+  Span(element_type (&arr)[N],
+       enable_if_t<is_convertible_v<remove_pointer_t<decltype(data(arr))>>,
+                   decltype(nullptr)>);
+};
+template <typename T> class Span<T> {
+  using element_type = T;
+  template <unsigned long N>
+  Span(element_type (&arr)[N],
+       enable_if_t<is_convertible_v<remove_pointer_t<decltype(data(arr))>>,
+                   decltype(nullptr)>);
+};
+
+struct aaa
+{
+  Span<char> data0;
+};


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-01-14 13:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-14 13:31 [gcc r11-6666] c++: Fix erroneous parm comparison logic [PR 98372] Nathan Sidwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).