http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54898
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> 2012-10-11 15:16:07 UTC --- We produce this situation somewhen during WPA stage (probably type merging). (gdb) p expr $1 = (tree) 0x7ffff693e3f0 (gdb) p expr->type_common.main_variant $2 = (tree) 0x7ffff6922b28 type merging assumes that if TYPE_MAIN_VARIANT (t) == t then t will prevail or be replaced with a different type that also is a main variant. we first read $2, with main variant 0x7ffff67f05e8: (gdb) call debug_tree ($2) <integer_type 0x7ffff6922b28 wchar_t SI size <integer_cst 0x7ffff67f40a0 type <integer_type 0x7ffff67f00a8 bitsizetype> constant 32> unit size <integer_cst 0x7ffff67f40c0 type <integer_type 0x7ffff67f0000 sizetype> constant 4> align 32 symtab 0 alias set -1 structural equality precision 32 min <integer_cst 0x7ffff67f4040 -2147483648> max <integer_cst 0x7ffff67f4060 2147483647> context <translation_unit_decl 0x7ffff67fbf18 D.2366>> (gdb) call debug_tree ($10) <integer_type 0x7ffff67f05e8 int public SI size <integer_cst 0x7ffff67f40a0 type <integer_type 0x7ffff67f00a8 bitsizetype> constant 32> unit size <integer_cst 0x7ffff67f40c0 type <integer_type 0x7ffff67f0000 sizetype> constant 4> align 32 symtab 0 alias set -1 canonical type 0x7ffff67f05e8 precision 32 min <integer_cst 0x7ffff67f4040 -2147483648> max <integer_cst 0x7ffff67f4060 2147483647> pointer_to_this <pointer_type 0x7ffff67f82a0>> then we read $1 (gdb) call debug_tree ($1) <integer_type 0x7ffff693e3f0 SI size <integer_cst 0x7ffff67f40a0 type <integer_type 0x7ffff67f00a8 bitsizetype> constant 32> unit size <integer_cst 0x7ffff67f40c0 type <integer_type 0x7ffff67f0000 sizetype> constant 4> align 32 symtab 0 alias set -1 structural equality precision 32 min <integer_cst 0x7ffff6912a20 -2147483648> max <integer_cst 0x7ffff6912a40 2147483647>> (gdb) call debug_tree ($1->type_common.main_variant) <integer_type 0x7ffff6922b28 wchar_t SI size <integer_cst 0x7ffff67f40a0 type <integer_type 0x7ffff67f00a8 bitsizetype> constant 32> unit size <integer_cst 0x7ffff67f40c0 type <integer_type 0x7ffff67f0000 sizetype> constant 4> align 32 symtab 0 alias set -1 canonical type 0x7ffff67f05e8 precision 32 min <integer_cst 0x7ffff67f4040 -2147483648> max <integer_cst 0x7ffff67f4060 2147483647> context <translation_unit_decl 0x7ffff67fbf18 D.2366> pointer_to_this <pointer_type 0x7ffff6922a80>> ouch. With the following asserts the testcase can possibly be reduced: Index: gcc/tree-streamer-in.c =================================================================== --- gcc/tree-streamer-in.c (revision 192359) +++ gcc/tree-streamer-in.c (working copy) @@ -703,6 +703,7 @@ lto_input_ts_type_common_tree_pointers ( /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists during fixup. */ TYPE_MAIN_VARIANT (expr) = stream_read_tree (ib, data_in); + gcc_assert (TYPE_MAIN_VARIANT (expr) == TYPE_MAIN_VARIANT (TYPE_MAIN_VARIANT (expr)) || TYPE_MAIN_VARIANT (TYPE_MAIN_VARIANT (expr)) == NULL_TREE); TYPE_CONTEXT (expr) = stream_read_tree (ib, data_in); /* TYPE_CANONICAL gets re-computed during type merging. */ TYPE_CANONICAL (expr) = NULL_TREE; Index: gcc/tree-streamer-out.c =================================================================== --- gcc/tree-streamer-out.c (revision 192359) +++ gcc/tree-streamer-out.c (working copy) @@ -612,6 +612,7 @@ write_ts_type_common_tree_pointers (stru reconstructed during fixup. */ /* Do not stream TYPE_NEXT_VARIANT, we reconstruct the variant lists during fixup. */ + gcc_assert (TYPE_MAIN_VARIANT (expr) == TYPE_MAIN_VARIANT (TYPE_MAIN_VARIANT (expr))); stream_write_tree (ob, TYPE_MAIN_VARIANT (expr), ref_p); stream_write_tree (ob, TYPE_CONTEXT (expr), ref_p); /* TYPE_CANONICAL is re-computed during type merging, so no need