https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79629
Bug ID: 79629 Summary: ICE on invalid code in tsubst_copy, at cp/pt.c:14477 Product: gcc Version: unknown Status: UNCONFIRMED Keywords: ice-on-invalid-code Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org CC: jason at gcc dot gnu.org Target Milestone: --- We ICE on a LLVM test-case: $ cat /home/marxin/BIG/Programming/llvm-project/llvm/tools/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp // RUN: %clang_cc1 -std=c++11 -verify %s struct Base { static const int a = 1; }; template<typename T> struct S : Base { enum E : int; constexpr int f() const; constexpr int g() const; void h(); }; template<> enum S<char>::E : int {}; // expected-note {{enum 'S<char>::E' was explicitly specialized here}} template<> enum S<short>::E : int { b = 2 }; template<> enum S<int>::E : int { a = 4 }; template<typename T> enum S<T>::E : int { b = 8 }; // The unqualified-id here names a member of the non-dependent base class Base // and not the injected enumerator name 'a' from the specialization. template<typename T> constexpr int S<T>::f() const { return a; } static_assert(S<char>().f() == 1, ""); static_assert(S<int>().f() == 1, ""); // The unqualified-id here names a member of the current instantiation, which // bizarrely might not exist in some instantiations. template<typename T> constexpr int S<T>::g() const { return b; } // expected-error {{enumerator 'b' does not exist in instantiation of 'S<char>'}} static_assert(S<char>().g() == 1, ""); // expected-note {{here}} expected-error {{not an integral constant expression}} static_assert(S<short>().g() == 2, ""); static_assert(S<long>().g() == 8, ""); // 'b' is type-dependent, so these assertions should not fire before 'h' is // instantiated. template<typename T> void S<T>::h() { char c[S<T>::b]; static_assert(b != 8, ""); static_assert(sizeof(c) != 8, ""); } void f() { S<short>().h(); // ok, b == 2 } $ g++ /home/marxin/BIG/Programming/llvm-project/llvm/tools/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp /home/marxin/BIG/Programming/llvm-project/llvm/tools/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp: In instantiation of ‘constexpr int S<T>::g() const [with T = char]’: /home/marxin/BIG/Programming/llvm-project/llvm/tools/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp:26:26: required from here /home/marxin/BIG/Programming/llvm-project/llvm/tools/clang/test/SemaCXX/enum-unscoped-nonexistent.cpp:25:61: internal compiler error: in tsubst_copy, at cp/pt.c:14477 template<typename T> constexpr int S<T>::g() const { return b; } // expected-error {{enumerator 'b' does not exist in instantiation of 'S<char>'}} ^ 0x69b29c tsubst_copy ../../gcc/cp/pt.c:14477 0x69d128 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/cp/pt.c:17872 0x698d68 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:16419 0x698bf6 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:15680 0x698b83 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/cp/pt.c:15896 0x697267 instantiate_decl(tree_node*, bool, bool) ../../gcc/cp/pt.c:22840 0x78fc1d cxx_eval_call_expression ../../gcc/cp/constexpr.c:1493 0x791527 cxx_eval_constant_expression ../../gcc/cp/constexpr.c:3971 0x79490f cxx_eval_outermost_constant_expr ../../gcc/cp/constexpr.c:4613 0x796586 maybe_constant_value(tree_node*, tree_node*) ../../gcc/cp/constexpr.c:4828 0x782321 cp_fully_fold(tree_node*) ../../gcc/cp/cp-gimplify.c:1963 0x71b017 cp_build_binary_op(unsigned int, tree_code, tree_node*, tree_node*, int) ../../gcc/cp/typeck.c:5243 0x661726 build_new_op_1 ../../gcc/cp/call.c:5982 0x66225e build_new_op(unsigned int, tree_code, int, tree_node*, tree_node*, tree_node*, tree_node**, int) ../../gcc/cp/call.c:6027 0x713192 build_x_binary_op(unsigned int, tree_code, tree_node*, tree_code, tree_node*, tree_code, tree_node**, int) ../../gcc/cp/typeck.c:3930 0x6f6688 cp_parser_binary_expression ../../gcc/cp/parser.c:9060 0x6f6be0 cp_parser_assignment_expression ../../gcc/cp/parser.c:9190 0x6f6fc7 cp_parser_constant_expression ../../gcc/cp/parser.c:9460 0x6f70f8 cp_parser_static_assert ../../gcc/cp/parser.c:13607 0x706e98 cp_parser_block_declaration ../../gcc/cp/parser.c:12617