]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/38380 (explicitly defaulted constructors vs. empty direct initialization)
authorJason Merrill <jason@redhat.com>
Wed, 3 Dec 2008 19:22:08 +0000 (14:22 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 3 Dec 2008 19:22:08 +0000 (14:22 -0500)
        PR c++/38380
        * decl.c (grokdeclarator): Only set DECL_NONCONVERTING_P
        on explicit constructors.
        * pt.c (tsubst_copy_and_build) [CONSTRUCTOR]: Propagate
        CONSTRUCTOR_IS_DIRECT_INIT.

From-SVN: r142404

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist10.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tc1/dr152.C
gcc/testsuite/g++.old-deja/g++.eh/ctor1.C

index 124dc3f959fb67ba27bec8344c3293b7e93d209b..4987ca48687bd63285167dee9984dc3cd912deec 100644 (file)
@@ -1,3 +1,11 @@
+2008-12-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/38380
+       * decl.c (grokdeclarator): Only set DECL_NONCONVERTING_P
+       on explicit constructors.
+       * pt.c (tsubst_copy_and_build) [CONSTRUCTOR]: Propagate
+       CONSTRUCTOR_IS_DIRECT_INIT.
+
 2008-12-02  Jason Merrill  <jason@redhat.com>
 
        PR c++/35782, c++/37860
index d045935445e454c15a931eed777cf5a7bd38be1e..87144324272e96eeeedfbd17e95587cfdc8475a7 100644 (file)
@@ -9099,15 +9099,6 @@ grokdeclarator (const cp_declarator *declarator,
               is called a converting constructor.  */
            if (explicitp == 2)
              DECL_NONCONVERTING_P (decl) = 1;
-           else if (DECL_CONSTRUCTOR_P (decl))
-             {
-               /* A constructor with no parms is not a conversion.
-                  Ignore any compiler-added parms.  */
-               tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (decl);
-
-               if (arg_types == void_list_node)
-                 DECL_NONCONVERTING_P (decl) = 1;
-             }
          }
        else if (TREE_CODE (type) == METHOD_TYPE)
          {
index 8de27a6a91390df3c3ef134bfeb5f94c8801cfbe..db81942eb00e7df890e27fd074a9a5bef4173832 100644 (file)
@@ -11612,6 +11612,7 @@ tsubst_copy_and_build (tree t,
           }
 
        r = build_constructor (init_list_type_node, n);
+       CONSTRUCTOR_IS_DIRECT_INIT (r) = CONSTRUCTOR_IS_DIRECT_INIT (t);
 
        if (TREE_HAS_CONSTRUCTOR (t))
          return finish_compound_literal (type, r);
index e62b98019b9cd5490996329817184554186ec06b..4a574ebdb1698b1fc58c25222a2f7d65182265e0 100644 (file)
@@ -1,3 +1,10 @@
+2008-12-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/38380
+       * g++.dg/cpp0x/initlist10.C: New test.
+       * g++.old-deja/g++.eh/ctor1.C: Default ctor is a candidate too.
+       * g++.dg/tc1/dr152.C: Likewise.
+
 2008-12-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/38360
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist10.C b/gcc/testsuite/g++.dg/cpp0x/initlist10.C
new file mode 100644 (file)
index 0000000..bf955f5
--- /dev/null
@@ -0,0 +1,53 @@
+// PR c++/38380
+// { dg-options "-std=gnu++0x" }
+
+namespace std
+{
+ struct atomic_bool
+  {
+    bool _M_i;
+
+    atomic_bool() = default;
+    ~atomic_bool() = default;
+    atomic_bool(const atomic_bool&) = delete;
+    atomic_bool& operator=(const atomic_bool&) = delete;
+
+    explicit atomic_bool(bool __i) { _M_i = __i; }
+
+    operator bool() const volatile
+    { return true; }
+  };
+}
+
+namespace __gnu_test
+{
+  struct direct_list_initializable
+  {
+    template<typename _Ttype, typename _Tvalue>
+      void 
+      operator()()
+      {
+        struct _Concept
+        {
+          void __constraint()
+          { 
+            _Ttype __v1 = { }; // default ctor
+            _Ttype __v2 { __a };  // single-argument ctor
+          }
+
+          _Tvalue __a;
+        };
+
+        void (_Concept::*__x)() __attribute__((unused))
+          = &_Concept::__constraint;
+      }
+  };
+}
+
+int main()
+{
+  __gnu_test::direct_list_initializable test;
+
+  test.operator()<std::atomic_bool, bool>();
+  return 0;
+}
index a635213b3a7d30248638ff3eefc638f17ea814f7..cac7aacc0ebc2417c1a49d4bc99f0f32f4385f03 100644 (file)
@@ -4,7 +4,7 @@
 
 namespace N1 {
   struct X {
-    X();
+    X();                       // { dg-message "candidate" }
     explicit X(const X&);
   };
   void f(X);
@@ -19,7 +19,7 @@ namespace N1 {
 namespace N2 {
   template <class T>
   struct X {
-    X();
+    X();                       // { dg-message "candidate" }
     explicit X(const X&);
   };
 
index ac2f24f60ceb9ab9e3dab2e0e5482064fd039231..1cd71c4d82a422752651c6b772dde06fba903ebc 100644 (file)
@@ -1,7 +1,7 @@
 // { dg-do assemble  }
 struct A
 {
-  A();
+  A();                         // { dg-message "" } candidate
   A(A&);                       // { dg-message "candidates" } referenced below
 };