aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-07-21 15:09:00 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-07-21 15:09:00 +0000
commit60f6be5a8e61073ff0eb3ee24c4a2288010f2653 (patch)
tree1edf8a10fa5465548dc47d5e0ef2c04b32cf346b
parent79cf76280626b079c07bdbb362f51a66416555d3 (diff)
downloadgcc-60f6be5a8e61073ff0eb3ee24c4a2288010f2653.zip
gcc-60f6be5a8e61073ff0eb3ee24c4a2288010f2653.tar.gz
gcc-60f6be5a8e61073ff0eb3ee24c4a2288010f2653.tar.bz2
re PR lto/45018 (ICE: tree check: did not expect class 'type', have 'type' (record_type) in contains_placeholder_p, at tree.c:2749)
2010-07-21 Richard Guenther <rguenther@suse.de> PR lto/45018 * tree.c (find_decls_types_r): Do not follow TREE_CHAIN of TYPE_DECLs. Do not follow TYPE_NEXT_VARIANT, TYPE_NEXT_PTR_TO, nor TYPE_NEXT_REF_TO or TYPE_CANONICAL. * g++.dg/lto/20100721-1_0.C: New testcase. From-SVN: r162380
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lto/20100721-1_0.C9
-rw-r--r--gcc/tree.c15
4 files changed, 32 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 517ff74..e4dbeb6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-07-21 Richard Guenther <rguenther@suse.de>
+
+ PR lto/45018
+ * tree.c (find_decls_types_r): Do not follow TREE_CHAIN
+ of TYPE_DECLs. Do not follow TYPE_NEXT_VARIANT,
+ TYPE_NEXT_PTR_TO, nor TYPE_NEXT_REF_TO or TYPE_CANONICAL.
+
2010-07-21 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/44900
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a6555a8..136ef6e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-21 Richard Guenther <rguenther@suse.de>
+
+ PR lto/45018
+ * g++.dg/lto/20100721-1_0.C: New testcase.
+
2010-07-21 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/44900
diff --git a/gcc/testsuite/g++.dg/lto/20100721-1_0.C b/gcc/testsuite/g++.dg/lto/20100721-1_0.C
new file mode 100644
index 0000000..09132e5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/20100721-1_0.C
@@ -0,0 +1,9 @@
+/* { dg-lto-do assemble } */
+
+static inline int __gthread_active_p (void) { }
+template <int rank, int dim> class Tensor;
+template <int dimension> struct G;
+template <int dim> class T {
+ typedef void A;
+ typedef Tensor<1,dim> F[G<dim>::v];
+};
diff --git a/gcc/tree.c b/gcc/tree.c
index aab4cfe..a33f22b 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4704,7 +4704,8 @@ find_decls_types_r (tree *tp, int *ws, void *data)
&& DECL_HAS_VALUE_EXPR_P (t))
fld_worklist_push (DECL_VALUE_EXPR (t), fld);
- if (TREE_CODE (t) != FIELD_DECL)
+ if (TREE_CODE (t) != FIELD_DECL
+ && TREE_CODE (t) != TYPE_DECL)
fld_worklist_push (TREE_CHAIN (t), fld);
*ws = 0;
}
@@ -4722,13 +4723,19 @@ find_decls_types_r (tree *tp, int *ws, void *data)
fld_worklist_push (TYPE_POINTER_TO (t), fld);
fld_worklist_push (TYPE_REFERENCE_TO (t), fld);
fld_worklist_push (TYPE_NAME (t), fld);
- fld_worklist_push (TYPE_MINVAL (t), fld);
+ /* Do not walk TYPE_NEXT_PTR_TO or TYPE_NEXT_REF_TO. We do not stream
+ them and thus do not and want not to reach unused pointer types
+ this way. */
+ if (!POINTER_TYPE_P (t))
+ fld_worklist_push (TYPE_MINVAL (t), fld);
if (!RECORD_OR_UNION_TYPE_P (t))
fld_worklist_push (TYPE_MAXVAL (t), fld);
fld_worklist_push (TYPE_MAIN_VARIANT (t), fld);
- fld_worklist_push (TYPE_NEXT_VARIANT (t), fld);
+ /* Do not walk TYPE_NEXT_VARIANT. We do not stream it and thus
+ do not and want not to reach unused variants this way. */
fld_worklist_push (TYPE_CONTEXT (t), fld);
- fld_worklist_push (TYPE_CANONICAL (t), fld);
+ /* Do not walk TYPE_CANONICAL. We do not stream it and thus do not
+ and want not to reach unused types this way. */
if (RECORD_OR_UNION_TYPE_P (t) && TYPE_BINFO (t))
{