aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2016-05-23 20:50:10 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2016-05-23 20:50:10 +0000
commit26d6ae55d88dddc2f2f99d9ac7bf11935307b4ec (patch)
tree0b372cc8356ef8c62ff86c557de938fa92ebfe15
parent447caf82a46a3f14ef475897791d11051f2f100c (diff)
downloadgcc-26d6ae55d88dddc2f2f99d9ac7bf11935307b4ec.zip
gcc-26d6ae55d88dddc2f2f99d9ac7bf11935307b4ec.tar.gz
gcc-26d6ae55d88dddc2f2f99d9ac7bf11935307b4ec.tar.bz2
re PR c++/70972 (Inheriting constructors taking parameters by value should move them, not copy)
/cp 2016-05-23 Paolo Carlini <paolo.carlini@oracle.com> PR c++/70972 * method.c (forward_parm): Use cp_build_reference_type. /testsuite 2016-05-23 Paolo Carlini <paolo.carlini@oracle.com> PR c++/70972 * g++.dg/cpp0x/inh-ctor20.C: New. * g++.dg/cpp0x/inh-ctor21.C: Likewise. From-SVN: r236614
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/method.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C16
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C19
5 files changed, 48 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 764754d..6201bda 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
2016-05-23 Paolo Carlini <paolo.carlini@oracle.com>
+ PR c++/70972
+ * method.c (forward_parm): Use cp_build_reference_type.
+
+2016-05-23 Paolo Carlini <paolo.carlini@oracle.com>
+
PR c++/69095
* parser.c (cp_parser_initializer): Use check_for_bare_parameter_packs.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 310e7eb..cd8faaf 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -484,6 +484,8 @@ forward_parm (tree parm)
tree type = TREE_TYPE (parm);
if (DECL_PACK_P (parm))
type = PACK_EXPANSION_PATTERN (type);
+ if (TREE_CODE (type) != REFERENCE_TYPE)
+ type = cp_build_reference_type (type, /*rval=*/true);
exp = build_static_cast (type, exp, tf_warning_or_error);
if (DECL_PACK_P (parm))
exp = make_pack_expansion (exp);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 80b62ad..ef528f2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2016-05-23 Paolo Carlini <paolo.carlini@oracle.com>
+ PR c++/70972
+ * g++.dg/cpp0x/inh-ctor20.C: New.
+ * g++.dg/cpp0x/inh-ctor21.C: Likewise.
+
+2016-05-23 Paolo Carlini <paolo.carlini@oracle.com>
+
PR c++/69095
* g++.dg/cpp0x/variadic168.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C
new file mode 100644
index 0000000..f33056d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor20.C
@@ -0,0 +1,16 @@
+// PR c++/70972
+// { dg-do compile { target c++11 } }
+
+struct moveonly {
+ moveonly(moveonly&&) = default;
+ moveonly() = default;
+};
+
+struct A {
+ A(moveonly) {}
+};
+struct B : A {
+ using A::A;
+};
+
+B b(moveonly{});
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C
new file mode 100644
index 0000000..6465506
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor21.C
@@ -0,0 +1,19 @@
+// PR c++/70972
+// { dg-do run { target c++11 } }
+
+struct abort_on_copy{
+ abort_on_copy(abort_on_copy&&) = default;
+ abort_on_copy(const abort_on_copy&) { __builtin_abort(); }
+ abort_on_copy() = default;
+};
+
+struct A {
+ A(abort_on_copy) {}
+};
+struct B : A {
+ using A::A;
+};
+
+int main() {
+ B b(abort_on_copy{});
+}