aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-06-11 14:38:52 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-06-11 14:38:52 -0400
commit46e318cff70c1adcb0895092975c72f41f82404c (patch)
tree114290e22c4a703fb765aa1f7cfc1a831e94e76d /gcc
parent641c8da29b8ec191e6e55f829add746f7d52a482 (diff)
downloadgcc-46e318cff70c1adcb0895092975c72f41f82404c.zip
gcc-46e318cff70c1adcb0895092975c72f41f82404c.tar.gz
gcc-46e318cff70c1adcb0895092975c72f41f82404c.tar.bz2
PR c++/86094 - wrong code with defaulted move ctor.
* tree.c (type_has_nontrivial_copy_init): Fix move ctor handling. From-SVN: r261444
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/tree.c2
-rw-r--r--gcc/testsuite/g++.dg/abi/invisiref2.C14
3 files changed, 20 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bdf717f..595a08f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-11 Jason Merrill <jason@redhat.com>
+
+ PR c++/86094 - wrong code with defaulted move ctor.
+ * tree.c (type_has_nontrivial_copy_init): Fix move ctor handling.
+
2018-06-10 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokfndecl): Use the location_t argument in two more places.
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index bbbda7e..156d1e4 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -4135,7 +4135,7 @@ type_has_nontrivial_copy_init (const_tree type)
for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter)
{
tree fn = *iter;
- if (copy_fn_p (fn))
+ if (copy_fn_p (fn) || move_fn_p (fn))
{
saw_copy = true;
if (!DECL_DELETED_FN (fn))
diff --git a/gcc/testsuite/g++.dg/abi/invisiref2.C b/gcc/testsuite/g++.dg/abi/invisiref2.C
new file mode 100644
index 0000000..592d212
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/invisiref2.C
@@ -0,0 +1,14 @@
+// PR c++/86094
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wabi=11 -fdump-tree-gimple" }
+// { dg-final { scan-tree-dump-not "struct S &" "gimple" } }
+
+struct S {
+ S(S&&) = default;
+ int i;
+};
+
+S foo(S s)
+{
+ return s;
+}