diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-11-06 20:33:39 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-11-06 20:34:58 +0100 |
commit | 6c282c14d1be0bba2bf5d49acd074b349f28ad17 (patch) | |
tree | 5c8590e41a86a244c3d5733147adc9572933f50e | |
parent | 556ab5125912fa2233986eb19d6cd995cf7de1d2 (diff) | |
download | gcc-6c282c14d1be0bba2bf5d49acd074b349f28ad17.zip gcc-6c282c14d1be0bba2bf5d49acd074b349f28ad17.tar.gz gcc-6c282c14d1be0bba2bf5d49acd074b349f28ad17.tar.bz2 |
c++: Propagate attributes to clones in duplicate_decls [PR67453]
On the following testcase where the cdtor attributes aren't on the
in-class declaration but on an out-of-class definition, the cdtors
have their clones created from the in-class declaration, and later on
duplicate_decls updates attributes on the abstract cdtors, but nothing
propagates them to the clones.
2020-11-06 Jakub Jelinek <jakub@redhat.com>
PR c++/67453
* decl.c (duplicate_decls): Propagate DECL_ATTRIBUTES and
DECL_PRESERVE_P from olddecl to its clones if any.
* g++.dg/ext/attr-used-2.C: New test.
-rw-r--r-- | gcc/cp/decl.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attr-used-2.C | 15 |
2 files changed, 25 insertions, 0 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 56bd772..6264884 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2921,6 +2921,16 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden) snode->remove (); } + if (TREE_CODE (olddecl) == FUNCTION_DECL) + { + tree clone; + FOR_EACH_CLONE (clone, olddecl) + { + DECL_ATTRIBUTES (clone) = DECL_ATTRIBUTES (olddecl); + DECL_PRESERVE_P (clone) |= DECL_PRESERVE_P (olddecl); + } + } + /* Remove the associated constraints for newdecl, if any, before reclaiming memory. */ if (flag_concepts) diff --git a/gcc/testsuite/g++.dg/ext/attr-used-2.C b/gcc/testsuite/g++.dg/ext/attr-used-2.C new file mode 100644 index 0000000..d7cf6e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-used-2.C @@ -0,0 +1,15 @@ +// PR c++/67453 +// { dg-do compile } +// { dg-final { scan-assembler "_ZN1SC\[12]Ev" } } +// { dg-final { scan-assembler "_ZN1SD\[12]Ev" } } +// { dg-final { scan-assembler "_ZN1SC\[12]ERKS_" } } + +struct S { + S(); + ~S(); + S(const S&); +}; + +__attribute__((used)) inline S::S() { } +__attribute__((used)) inline S::~S() { } +__attribute__((used)) inline S::S(const S&) { } |