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: r188811
This commit is contained in:
Richard Guenther 2012-06-20 07:22:07 +00:00 committed by Jason Merrill
parent 5c8096007a
commit fd72d9c98b
5 changed files with 58 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2012-06-19 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-18 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/53700

View File

@ -1,3 +1,9 @@
2012-06-19 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-19 Jason Merrill <jason@redhat.com>
Reapply:

View File

@ -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() {}

View File

@ -0,0 +1,9 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -flto } { -flto -g } } } */
int main ()
{
{
union A { } v;
}
}

View File

@ -4517,11 +4517,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;
}
}