diff options
author | Richard Guenther <rguenther@suse.de> | 2012-06-11 14:14:09 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-06-11 14:14:09 +0000 |
commit | e3b127e818dd591031a9cee6fbccd55c612cd643 (patch) | |
tree | 340e42ba07e8192d447a2f10a933a3b9b418dd7d /gcc | |
parent | 5a20ffcb3afa4c44d0518d30010f002a32a8f7b2 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr53470_0.C | 26 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/pr53470_0.c | 9 | ||||
-rw-r--r-- | gcc/tree.c | 16 |
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; + } +} @@ -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; + } } |