re PR c++/82401 (error: qsort comparator non-negative on sorted output: 1 in insert_l...
authorJakub Jelinek <jakub@redhat.com>
Wed, 22 Nov 2017 22:35:52 +0000 (23:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 22 Nov 2017 22:35:52 +0000 (23:35 +0100)
PR c++/82401
* name-lookup.c (member_name_cmp): Return 0 if a == b.

* g++.dg/cpp0x/pr82401.C: New test.

From-SVN: r255084

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr82401.C [new file with mode: 0644]

index f97187eaf1cd950d5c42c58b0b7fef8aa0ae032d..59e890f6efddf3df2ad8184d0908d2c305f6970b 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/82401
+       * name-lookup.c (member_name_cmp): Return 0 if a == b.
+
 2017-11-22  David Malcolm  <dmalcolm@redhat.com>
 
        PR c++/62170
index 7c363b0f935e35a730159abad6b1720bd147aa09..9f65c4d7992738d005ceb36e48be75586ce40ff3 100644 (file)
@@ -1469,7 +1469,10 @@ member_name_cmp (const void *a_p, const void *b_p)
      how we order these.  Use UID as a proxy for source ordering, so
      that identically-located decls still have a well-defined stable
      ordering.  */
-  return DECL_UID (a) < DECL_UID (b) ? -1 : +1;
+  if (DECL_UID (a) != DECL_UID (b))
+    return DECL_UID (a) < DECL_UID (b) ? -1 : +1;
+  gcc_assert (a == b);
+  return 0;
 }
 
 static struct {
index 36867c5990fb687bc2c05969fa30cd48127f8416..726773bee0d1fc6689502491d209127ee79f55c5 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/82401
+       * g++.dg/cpp0x/pr82401.C: New test.
+
 2017-11-22  David Malcolm  <dmalcolm@redhat.com>
 
        PR tree-optimization/82588
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr82401.C b/gcc/testsuite/g++.dg/cpp0x/pr82401.C
new file mode 100644 (file)
index 0000000..52d40e0
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/82401
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+template <typename T> struct A
+{
+  enum E : T;
+  void h ();
+};
+template <typename T> enum A<T>::E : T { e1, e2 };
+template <> enum A<long long>::E : long long {};
+template <typename T> struct C
+{
+  enum class E : T;
+};
+C<int>::E c3 = C<int>::E::e1;  // { dg-error "is not a member of" }