aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-04-23 16:41:35 -0400
committerJason Merrill <jason@redhat.com>2021-04-27 15:42:40 -0400
commit37846c42f1f5ac4d9ba190d49c4373673c89c8b5 (patch)
tree821c2142813930cca7cb4b70aadd1795a1321731 /gcc
parent37d2b98100cefcb9d312d379473c12aa6d61fc62 (diff)
downloadgcc-37846c42f1f5ac4d9ba190d49c4373673c89c8b5.zip
gcc-37846c42f1f5ac4d9ba190d49c4373673c89c8b5.tar.gz
gcc-37846c42f1f5ac4d9ba190d49c4373673c89c8b5.tar.bz2
c++: -Wdeprecated-copy and using operator= [PR92145]
For the purpose of [depr.impldec] "if the class has a user-declared copy assignment operator", an operator= brought in from a base class with 'using' may be a copy-assignment operator, but it isn't a copy-assignment operator for the derived class. gcc/cp/ChangeLog: PR c++/92145 * class.c (classtype_has_depr_implicit_copy): Check DECL_CONTEXT of operator=. gcc/testsuite/ChangeLog: PR c++/92145 * g++.dg/cpp0x/depr-copy3.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/class.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/depr-copy3.C35
2 files changed, 37 insertions, 1 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 90b3438..2cf527e 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -5670,7 +5670,8 @@ classtype_has_depr_implicit_copy (tree t)
iter; ++iter)
{
tree fn = *iter;
- if (user_provided_p (fn) && copy_fn_p (fn))
+ if (DECL_CONTEXT (fn) == t
+ && user_provided_p (fn) && copy_fn_p (fn))
return fn;
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/depr-copy3.C b/gcc/testsuite/g++.dg/cpp0x/depr-copy3.C
new file mode 100644
index 0000000..c303c9d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/depr-copy3.C
@@ -0,0 +1,35 @@
+// PR c++/92145
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-Wdeprecated-copy" }
+
+struct base
+{
+ base() { }
+ base(const base&) { }
+ base(base&&) { }
+ base& operator=(const base&) { return *this; }
+ base& operator=(base&&) { return *this; }
+};
+
+struct foo : base
+{
+ //using base::base;
+ using base::operator=;
+};
+
+struct bar
+{
+ bar& operator=(foo v)
+ {
+ value = v;
+ return *this;
+ }
+
+ foo value;
+};
+
+int main()
+{
+ foo a;
+ foo{a};
+}