aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-01-26 10:30:43 -0500
committerJason Merrill <jason@gcc.gnu.org>2017-01-26 10:30:43 -0500
commiteffdaefed3023fea3c3b56932d1a2be816af7aea (patch)
tree82523a740f762ef3b600b444c88a7f69062a9982
parente39dd8029d9d1874317f757545be86f40b867559 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/decl2.c8
-rw-r--r--gcc/cp/tree.c8
-rw-r--r--gcc/testsuite/g++.dg/opt/declone3.C16
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() {}