PR c++/79176 - lambda ICE with -flto -Os
* decl2.c (vague_linkage_p): Handle decloned 'tors. * tree.c (decl_linkage): Likewise. From-SVN: r244935
This commit is contained in:
parent
e39dd8029d
commit
effdaefed3
4 changed files with 38 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
16
gcc/testsuite/g++.dg/opt/declone3.C
Normal file
16
gcc/testsuite/g++.dg/opt/declone3.C
Normal file
|
@ -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() {}
|
Loading…
Add table
Reference in a new issue