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>();
}