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

Reply via email to