https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91706
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ice-on-invalid-code Status|UNCONFIRMED |NEW Last reconfirmed| |2019-09-09 Target Milestone|--- |8.4 Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. The struct B type has a member <type_decl 0x7ffff5e2eed8 type type <error_mark 0x7ffff680de40> asm_written external nonlocal suppress-debug decl_6 VOID t.C:12:9 align:8 warn_if_not_align:0 context <record_type 0x7ffff60a8888 B> result <typename_type 0x7ffff60a8150 type VOID align:8 warn_if_not_align:0 symtab:0 alias-set -1 structural-equality context <record_type 0x7ffff6098f18 conditional> fullname <identifier_node 0x7ffff6826f00 type type <error_mark 0x7ffff680de40> normal local bindings <0x7ffff5d40be0>> chain <type_decl 0x7ffff5e2e000 type>> > which we don't expect. Frontend issue. It should have raised an error here? > clang++ t.C t.C:16:3: error: static_assert failed due to requirement 'B<std::vector<int> >::type::value' "assertion failed" static_assert(B<std::vector<int>>::type::value, "assertion failed"); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. The ICE with GCC 9 is the same note DECL_ORGINAL_TYPE is "sane" (well, 'void'). And dwarf2out has 25421 if (DECL_ORIGINAL_TYPE (decl)) 25422 { 25423 type = DECL_ORIGINAL_TYPE (decl); 25424 if (type == error_mark_node) 25425 return; 25426 25427 gcc_assert (type != TREE_TYPE (decl)); 25428 equate_type_number_to_die (TREE_TYPE (decl), type_die); so it checks DECL_ORIGINAL_TYPE but then uses TREE_TYPE which actually is error_mark_node.