From bfa589517b23a771d285e1a0e7cb701b46c63d95 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 9 May 2014 14:16:11 -0400 Subject: [PATCH] DR 5 PR c++/60019 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 | 5 +++++ gcc/cp/call.c | 13 +++++++++++-- gcc/testsuite/g++.dg/init/copy7.C | 9 +++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/copy7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b13bd99..ab3a3f4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2014-05-09 Jason Merrill + 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. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index cff7ef3..187fc77 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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 index 0000000..655fae2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy7.C @@ -0,0 +1,9 @@ +// CWG 5 + +struct C { }; +C c; +struct A { + A(const A&); + A(const C&); +}; +const volatile A a = c; // Okay -- 2.7.4