Hi,

for value-initialization (thus void_type_node as init), explicit should not matter, thus we shouldn't set LOOKUP_ONLYCONVERTING. I also double checked that we do the right thing for testcases like:

struct A {
  explicit A(int = 0);
};

A a1 = 1; /* error */
A a2;     /* Ok */
A a3(2);  /* Ok */

As expected, in such cases init is an INTEGER_CST, a NULL_TREE and a TREE_LIST of a single INTEGER_CST, respectively.

Booted and tested x86_64-linux.

Thanks,
Paolo.

/////////////////////////////
/cp
2013-08-28  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/58255
        * init.c (build_aggr_init): When init == void_type_node do not
        set LOOKUP_ONLYCONVERTING.

/testsuite
2013-08-28  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/58255
        * g++.dg/cpp0x/dc7.C: New.
Index: cp/init.c
===================================================================
--- cp/init.c   (revision 202020)
+++ cp/init.c   (working copy)
@@ -1464,7 +1464,8 @@ build_aggr_init (tree exp, tree init, int flags, t
   TREE_READONLY (exp) = 0;
   TREE_THIS_VOLATILE (exp) = 0;
 
-  if (init && TREE_CODE (init) != TREE_LIST
+  if (init && init != void_type_node
+      && TREE_CODE (init) != TREE_LIST
       && !(TREE_CODE (init) == TARGET_EXPR
           && TARGET_EXPR_DIRECT_INIT_P (init))
       && !(BRACE_ENCLOSED_INITIALIZER_P (init)
Index: testsuite/g++.dg/cpp0x/dc7.C
===================================================================
--- testsuite/g++.dg/cpp0x/dc7.C        (revision 0)
+++ testsuite/g++.dg/cpp0x/dc7.C        (working copy)
@@ -0,0 +1,7 @@
+// PR c++/58255
+// { dg-do compile { target c++11 } }
+
+struct A {
+  explicit A() { }
+  A(int x) : A() { }
+};

Reply via email to