]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/52905 ([C++0x] ice on invalid brace-enclosed initializer of vector of enums)
authorJason Merrill <jason@redhat.com>
Fri, 13 Apr 2012 19:43:47 +0000 (15:43 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 13 Apr 2012 19:43:47 +0000 (15:43 -0400)
PR c++/52905
* call.c (joust): Handle comparing list and non-list ctors.

From-SVN: r186433

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C [new file with mode: 0644]

index 4bb79371109e3cc416be18a757732895d9829d54..e8bcc377fc6c722cc847cca4716dc2567e276ec9 100644 (file)
@@ -1,5 +1,8 @@
 2012-04-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/52905
+       * call.c (joust): Handle comparing list and non-list ctors.
+
        PR c++/52915
        * decl2.c (finish_anon_union): Use cp_finish_decl.
        * error.c (dump_function_name): Avoid showing anonymous "name".
index 3c3dabb74a0ae9576a2a6957b6b41d42d91649c8..46ac55c70fd84b0de65195e7bb7893c9d79d4c66 100644 (file)
@@ -8011,6 +8011,12 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
       int static_1 = DECL_STATIC_FUNCTION_P (cand1->fn);
       int static_2 = DECL_STATIC_FUNCTION_P (cand2->fn);
 
+      if (DECL_CONSTRUCTOR_P (cand1->fn)
+         && is_list_ctor (cand1->fn) != is_list_ctor (cand2->fn))
+       /* We're comparing a near-match list constructor and a near-match
+          non-list constructor.  Just treat them as unordered.  */
+       return 0;
+
       gcc_assert (static_1 != static_2);
 
       if (static_1)
index 587e112626a58617ca95f4fac55f94f0d72677ce..e3ea64acfd27afa1981f1bd0acef20f5b24acc80 100644 (file)
@@ -1,5 +1,8 @@
 2012-04-13  Jason Merrill  <jason@redhat.com>
 
+       PR c++/52905
+       * g++.dg/cpp0x/initlist-ctor1.C: New.
+
        PR c++/52915
        * g++.dg/other/anon-union2.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-ctor1.C
new file mode 100644 (file)
index 0000000..82031cb
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/52905
+// { dg-options -std=c++11 }
+
+#include <initializer_list>
+
+enum E { e1, e2 };
+struct A
+{
+  A(std::initializer_list<E>); // { dg-message "A::A" }
+  A(int, E);                   // { dg-message "A::A" }
+};
+
+A a{e1,2};                     // { dg-error "" }