https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82053
Bug ID: 82053 Summary: [8 Regression] ICE on invalid code Product: gcc Version: 8.0 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: --- Since r251433 we ICE on a test-case from LLVM: $ g++ /home/marxin/BIG/Programming/llvm/tools/clang/test/SemaCXX/vartemplate-lambda.cpp /home/marxin/BIG/Programming/llvm/tools/clang/test/SemaCXX/vartemplate-lambda.cpp: In function ‘int main()’: /home/marxin/BIG/Programming/llvm/tools/clang/test/SemaCXX/vartemplate-lambda.cpp:33:17: internal compiler error: tree check: expected function_type or method_type, have lang_type in set_flags_from_callee, at cp/call.c:325 v2<long long>(); // This line causes foo3<long long> to be instantiated. ^ 0x5e703a tree_check_failed(tree_node const*, char const*, int, char const*, ...) ../../gcc/tree.c:9076 0x607095 tree_check2(tree_node*, char const*, int, char const*, tree_code, tree_code) ../../gcc/tree.h:3117 0x607095 set_flags_from_callee(tree_node*) ../../gcc/cp/call.c:325 0x847994 bot_manip ../../gcc/cp/tree.c:2942 0x109d963 walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) ../../gcc/tree.c:11060 0x83ac69 break_out_target_exprs(tree_node*) ../../gcc/cp/tree.c:3017 0x60e786 convert_default_arg(tree_node*, tree_node*, tree_node*, int, int) ../../gcc/cp/call.c:7308 0x60f98f build_over_call ../../gcc/cp/call.c:7904 0x621954 build_op_call_1 ../../gcc/cp/call.c:4559 0x621954 build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int) ../../gcc/cp/call.c:4585 0x816253 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool, bool, int) ../../gcc/cp/semantics.c:2502 0x775ace cp_parser_postfix_expression ../../gcc/cp/parser.c:7121 0x778ccd cp_parser_unary_expression ../../gcc/cp/parser.c:8248 0x7566f9 cp_parser_cast_expression ../../gcc/cp/parser.c:9016 0x756f67 cp_parser_binary_expression ../../gcc/cp/parser.c:9117 0x757844 cp_parser_assignment_expression ../../gcc/cp/parser.c:9404 0x75a518 cp_parser_expression ../../gcc/cp/parser.c:9573 0x75ab18 cp_parser_expression_statement ../../gcc/cp/parser.c:11071 0x762143 cp_parser_statement ../../gcc/cp/parser.c:10887 0x763350 cp_parser_statement_seq_opt ../../gcc/cp/parser.c:11214 $ cat /home/marxin/BIG/Programming/llvm/tools/clang/test/SemaCXX/vartemplate-lambda.cpp // RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s template <class> auto fn0 = [] {}; template <typename> void foo0() { fn0<char>(); } template<typename T> auto fn1 = [](auto a) { return a + T(1); }; template<typename T> auto v1 = [](int a = T(1)) { return a; }(); struct S { template<class T> static constexpr T t = [](int f = T(7)){return f;}(); // expected-error{{constexpr variable 't<int>' must be initialized by a constant expression}} expected-error{{a lambda expression may not appear inside of a constant expression}} expected-note{{cannot be used in a constant expression}} }; template <typename X> int foo2() { X a = 0x61; fn1<char>(a); (void)v1<int>; (void)S::t<int>; // expected-note{{in instantiation of static data member 'S::t<int>' requested here}} return 0; } template<class C> int foo3() { C::m1(); // expected-error{{type 'long long' cannot be used prior to '::' because it has no members}} return 1; } template<class C> auto v2 = [](int a = foo3<C>()){}; // expected-note{{in instantiation of function template specialization 'foo3<long long>' requested here}} int main() { v2<long long>(); // This line causes foo3<long long> to be instantiated. v2<long long>(2); // This line does not. foo2<int>(); }