re PR c++/61242 (Bogus "no matching function for call to ‘Foo::Create(<brace-enclosed...
authorJason Merrill <jason@redhat.com>
Wed, 28 May 2014 15:55:03 +0000 (11:55 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 28 May 2014 15:55:03 +0000 (11:55 -0400)
PR c++/61242
* call.c (build_aggr_conv): Ignore passed in flags.
(build_array_conv, build_complex_conv): Likewise.

From-SVN: r211024

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

index 2e9463c..2b7f32f 100644 (file)
@@ -1,3 +1,9 @@
+2014-05-28  Jason Merrill  <jason@redhat.com>
+
+       PR c++/61242
+       * call.c (build_aggr_conv): Ignore passed in flags.
+       (build_array_conv, build_complex_conv): Likewise.
+
 2014-05-23  Jan Hubicka  <hubicka@ucw.cz>
 
        * optimize.c (maybe_thunk_body): Use set_comdat_group.
index 20af0e3..77aa8ca 100644 (file)
@@ -890,7 +890,9 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain)
   if (ctor == error_mark_node)
     return NULL;
 
-  flags |= LOOKUP_NO_NARROWING;
+  /* The conversions within the init-list aren't affected by the enclosing
+     context; they're always simple copy-initialization.  */
+  flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING;
 
   for (; field; field = next_initializable_field (DECL_CHAIN (field)))
     {
@@ -963,6 +965,8 @@ build_array_conv (tree type, tree ctor, int flags, tsubst_flags_t complain)
        return NULL;
     }
 
+  flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING;
+
   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val)
     {
       conversion *sub
@@ -1007,6 +1011,8 @@ build_complex_conv (tree type, tree ctor, int flags,
   if (len != 2)
     return NULL;
 
+  flags = LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING;
+
   FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val)
     {
       conversion *sub
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist84.C b/gcc/testsuite/g++.dg/cpp0x/initlist84.C
new file mode 100644 (file)
index 0000000..4d46746
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/61242
+// { dg-do compile { target c++11 } }
+
+struct Foo
+{
+  struct A
+  {
+    const int &container;
+    const int &args;
+  };
+  static void Create (const A &);
+};
+
+int main ()
+{
+  Foo::Create ({{}, {}});
+}