DR 5 PR c++/60019
authorJason Merrill <jason@redhat.com>
Fri, 9 May 2014 18:16:11 +0000 (14:16 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 9 May 2014 18:16:11 +0000 (14:16 -0400)
DR 5
PR c++/60019
* call.c (build_user_type_conversion_1): The copy-init temporary
is cv-unqualified.

From-SVN: r210284

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

index b13bd99..ab3a3f4 100644 (file)
@@ -1,5 +1,10 @@
 2014-05-09  Jason Merrill  <jason@redhat.com>
 
+       DR 5
+       PR c++/60019
+       * call.c (build_user_type_conversion_1): The copy-init temporary
+       is cv-unqualified.
+
        PR c++/58714
        * tree.c (stabilize_expr): A stabilized prvalue is an xvalue.
 
index cff7ef3..187fc77 100644 (file)
@@ -3693,11 +3693,20 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags,
       return cand;
     }
 
+  tree convtype;
+  if (!DECL_CONSTRUCTOR_P (cand->fn))
+    convtype = non_reference (TREE_TYPE (TREE_TYPE (cand->fn)));
+  else if (cand->second_conv->kind == ck_rvalue)
+    /* DR 5: [in the first step of copy-initialization]...if the function
+       is a constructor, the call initializes a temporary of the
+       cv-unqualified version of the destination type. */
+    convtype = cv_unqualified (totype);
+  else
+    convtype = totype;
   /* Build the user conversion sequence.  */
   conv = build_conv
     (ck_user,
-     (DECL_CONSTRUCTOR_P (cand->fn)
-      ? totype : non_reference (TREE_TYPE (TREE_TYPE (cand->fn)))),
+     convtype,
      build_identity_conv (TREE_TYPE (expr), expr));
   conv->cand = cand;
   if (cand->viable == -1)
diff --git a/gcc/testsuite/g++.dg/init/copy7.C b/gcc/testsuite/g++.dg/init/copy7.C
new file mode 100644 (file)
index 0000000..655fae2
--- /dev/null
@@ -0,0 +1,9 @@
+// CWG 5
+
+struct C { };
+C c;
+struct A {
+  A(const A&);
+  A(const C&);
+};
+const volatile A a = c;    // Okay