+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.
+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
--- /dev/null
+// { 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() {}
--- /dev/null
+/* { dg-lto-do link } */
+/* { dg-lto-options { { -flto } { -flto -g } } } */
+
+int main ()
+{
+ {
+ union A { } v;
+ }
+}
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;
+ }
}