diff options
author | Jason Merrill <jason@redhat.com> | 2017-01-26 10:30:43 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-01-26 10:30:43 -0500 |
commit | effdaefed3023fea3c3b56932d1a2be816af7aea (patch) | |
tree | 82523a740f762ef3b600b444c88a7f69062a9982 | |
parent | e39dd8029d9d1874317f757545be86f40b867559 (diff) | |
download | gcc-effdaefed3023fea3c3b56932d1a2be816af7aea.zip gcc-effdaefed3023fea3c3b56932d1a2be816af7aea.tar.gz gcc-effdaefed3023fea3c3b56932d1a2be816af7aea.tar.bz2 |
PR c++/79176 - lambda ICE with -flto -Os
* decl2.c (vague_linkage_p): Handle decloned 'tors.
* tree.c (decl_linkage): Likewise.
From-SVN: r244935
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 8 | ||||
-rw-r--r-- | gcc/cp/tree.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/declone3.C | 16 |
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7933e02..90b1671 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-01-26 Jason Merrill <jason@redhat.com> + + PR c++/79176 - lambda ICE with -flto -Os + * decl2.c (vague_linkage_p): Handle decloned 'tors. + * tree.c (decl_linkage): Likewise. + 2017-01-25 Martin Sebor <msebor@redhat.com> * decl.c (grokdeclarator): Fix a typo in a comment. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 0a4c567..a9a1d22 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1816,6 +1816,14 @@ vague_linkage_p (tree decl) { if (!TREE_PUBLIC (decl)) { + /* maybe_thunk_body clears TREE_PUBLIC on the maybe-in-charge 'tor + variants, check one of the "clones" for the real linkage. */ + if ((DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl) + || DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl)) + && DECL_CHAIN (decl) + && DECL_CLONED_FUNCTION (DECL_CHAIN (decl))) + return vague_linkage_p (DECL_CHAIN (decl)); + gcc_checking_assert (!DECL_COMDAT (decl)); return false; } diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 6fbc99e..3ecc2b0 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -4418,6 +4418,14 @@ decl_linkage (tree decl) if (TREE_PUBLIC (decl)) return lk_external; + /* maybe_thunk_body clears TREE_PUBLIC on the maybe-in-charge 'tor variants, + check one of the "clones" for the real linkage. */ + if ((DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl) + || DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl)) + && DECL_CHAIN (decl) + && DECL_CLONED_FUNCTION (DECL_CHAIN (decl))) + return decl_linkage (DECL_CHAIN (decl)); + if (TREE_CODE (decl) == NAMESPACE_DECL) return lk_external; diff --git a/gcc/testsuite/g++.dg/opt/declone3.C b/gcc/testsuite/g++.dg/opt/declone3.C new file mode 100644 index 0000000..d8c2492 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/declone3.C @@ -0,0 +1,16 @@ +// PR c++/79176 +// { dg-do compile { target c++11 } } +// { dg-options "-flto -Os" } + +struct A {}; +struct Object { + virtual bool m_fn1(); + virtual ~Object(); +}; +struct Item : Object, virtual A { + ~Item() { + [] {}; + } + bool m_fn1(); +}; +bool Item::m_fn1() {} |