https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65339
Bug ID: 65339
Summary: [5 Regression] C++ ICE with lambda and no capture list
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: aldyh at gcc dot gnu.org
./cc1plus a.ii -fdump-tree-all -quiet -I/tmp -std=c++11
a.ii: In static member function ‘static Object
Object::Method()::<lambda()>::_FUN()’:
a.ii:22:3: internal compiler error: Segmentation fault
});
^
0xf462c2 crash_signal
/source/gcc/gcc/toplev.c:383
0x697de7 contains_struct_check(tree_node*, tree_node_structure_enum, char
const*, int, char const*)
/source/gcc/gcc/tree.h:2959
0x91da6a lambda_expr_this_capture(tree_node*, bool)
/source/gcc/gcc/cp/lambda.c:752
0x91dd46 maybe_resolve_dummy(tree_node*, bool)
/source/gcc/gcc/cp/lambda.c:789
0x6b4f06 build_new_method_call_1
/source/gcc/gcc/cp/call.c:8023
0x6b6280 build_new_method_call(tree_node*, tree_node*, vec<tree_node*, va_gc,
vl_embed>**, tree_node*, int, tree_node**, int)
/source/gcc/gcc/cp/call.c:8271
0x6b4216 build_special_member_call(tree_node*, tree_node*, vec<tree_node*,
va_gc, vl_embed>**, tree_node*, int, int)
/source/gcc/gcc/cp/call.c:7815
0x6ac5bf build_temp
...
...
$ cat a.ii
class FuncWrapper {
public:
template <typename Func> void callfunc(Func f)
{
f();
}
};
class Object {
int field;
public:
void Method();
Object() { field = 555; }
};
void Object::Method ()
{
FuncWrapper wrap;
wrap.callfunc([]()
{
return Object();
});
}
Notice the empty cature list. We are hitting lambda_expr_this_capture() with
current_class_ref == NULL:
/* To make sure that current_class_ref is for the lambda. */
gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref))
== LAMBDA_EXPR_CLOSURE (lambda));
Perhaps we can add "!current_class_ref ||"