aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-06-11 14:14:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-06-11 14:14:09 +0000
commite3b127e818dd591031a9cee6fbccd55c612cd643 (patch)
tree340e42ba07e8192d447a2f10a933a3b9b418dd7d /gcc
parent5a20ffcb3afa4c44d0518d30010f002a32a8f7b2 (diff)
downloadgcc-e3b127e818dd591031a9cee6fbccd55c612cd643.zip
gcc-e3b127e818dd591031a9cee6fbccd55c612cd643.tar.gz
gcc-e3b127e818dd591031a9cee6fbccd55c612cd643.tar.bz2
re PR debug/53470 (ICE when linking with -g in splice_child_die, at dwarf2out.c:4264)
2012-06-11 Richard Guenther <rguenther@suse.de> PR middle-end/53470 * tree.c (free_lang_data_in_type): Do not clear TYPE_CONTEXT but replace it with the first non-BLOCK context. * g++.dg/lto/pr53470_0.C: New testcase. * gcc.dg/lto/pr53470_0.c: Likewise. From-SVN: r188387
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/lto/pr53470_0.C26
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr53470_0.c9
-rw-r--r--gcc/tree.c16
5 files changed, 58 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3127b0..fa5a672 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2012-06-11 Richard Guenther <rguenther@suse.de>
+ PR middle-end/53470
+ * tree.c (free_lang_data_in_type): Do not clear TYPE_CONTEXT but
+ replace it with the first non-BLOCK context.
+
+2012-06-11 Richard Guenther <rguenther@suse.de>
+
* alias.c (aliases_everything_p): Remove.
(DIFFERENT_ALIAS_SETS_P): Likewise.
(true_dependence_1): Use mems_in_disjoint_alias_sets_p directly.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index baa04c0..b57f171 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2012-06-11 Richard Guenther <rguenther@suse.de>
+ PR middle-end/53470
+ * g++.dg/lto/pr53470_0.C: New testcase.
+ * gcc.dg/lto/pr53470_0.c: Likewise.
+
+2012-06-11 Richard Guenther <rguenther@suse.de>
+
PR c++/53616
* g++.dg/ext/pr53605.C: New testcase.
diff --git a/gcc/testsuite/g++.dg/lto/pr53470_0.C b/gcc/testsuite/g++.dg/lto/pr53470_0.C
new file mode 100644
index 0000000..217c02a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr53470_0.C
@@ -0,0 +1,26 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -g -flto } } }
+
+class sp_counted_base;
+class shared_count {
+ sp_counted_base *pi_;
+public:
+ template<class Y> shared_count(Y) : pi_() {}
+ ~shared_count() {}
+};
+template<class T> struct shared_ptr {
+ T element_type;
+ template<class Y> shared_ptr(Y) : pn(0) {}
+ shared_count pn;
+};
+template<class> class ECGetterBase;
+template<class T> struct ExtensionCord {
+ struct Holder {
+ ECGetterBase<T> *getter_;
+ };
+ ExtensionCord() : holder_(new Holder) {}
+
+ shared_ptr<Holder> holder_;
+};
+ExtensionCord<int> a;
+int main() {}
diff --git a/gcc/testsuite/gcc.dg/lto/pr53470_0.c b/gcc/testsuite/gcc.dg/lto/pr53470_0.c
new file mode 100644
index 0000000..3c799f6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/pr53470_0.c
@@ -0,0 +1,9 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options { { -flto } { -flto -g } } } */
+
+int main ()
+{
+ {
+ union A { } v;
+ }
+}
diff --git a/gcc/tree.c b/gcc/tree.c
index e180340..d3c2a19 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4575,11 +4575,17 @@ free_lang_data_in_type (tree type)
free_lang_data_in_one_sizepos (&TYPE_SIZE (type));
free_lang_data_in_one_sizepos (&TYPE_SIZE_UNIT (type));
- if (debug_info_level < DINFO_LEVEL_TERSE
- || (TYPE_CONTEXT (type)
- && TREE_CODE (TYPE_CONTEXT (type)) != FUNCTION_DECL
- && TREE_CODE (TYPE_CONTEXT (type)) != NAMESPACE_DECL))
- TYPE_CONTEXT (type) = NULL_TREE;
+ if (TYPE_CONTEXT (type)
+ && TREE_CODE (TYPE_CONTEXT (type)) == BLOCK)
+ {
+ tree ctx = TYPE_CONTEXT (type);
+ do
+ {
+ ctx = BLOCK_SUPERCONTEXT (ctx);
+ }
+ while (ctx && TREE_CODE (ctx) == BLOCK);
+ TYPE_CONTEXT (type) = ctx;
+ }
}