forked from OSchip/llvm-project
Mark lambda decl as invalid if a captured variable has an invalid type.
This causes the compiler to crash when trying to compute a layout for the lambda closure type (see included test). llvm-svn: 347402
This commit is contained in:
parent
5ba384347c
commit
59974412a4
|
@ -14966,6 +14966,21 @@ static void addAsFieldToClosureType(Sema &S, LambdaScopeInfo *LSI,
|
|||
= FieldDecl::Create(S.Context, Lambda, Loc, Loc, nullptr, FieldType,
|
||||
S.Context.getTrivialTypeSourceInfo(FieldType, Loc),
|
||||
nullptr, false, ICIS_NoInit);
|
||||
// If the variable being captured has an invalid type, mark the lambda class
|
||||
// as invalid as well.
|
||||
if (!FieldType->isDependentType()) {
|
||||
if (S.RequireCompleteType(Loc, FieldType, diag::err_field_incomplete)) {
|
||||
Lambda->setInvalidDecl();
|
||||
Field->setInvalidDecl();
|
||||
} else {
|
||||
NamedDecl *Def;
|
||||
FieldType->isIncompleteType(&Def);
|
||||
if (Def && Def->isInvalidDecl()) {
|
||||
Lambda->setInvalidDecl();
|
||||
Field->setInvalidDecl();
|
||||
}
|
||||
}
|
||||
}
|
||||
Field->setImplicit(true);
|
||||
Field->setAccess(AS_private);
|
||||
Lambda->addDecl(Field);
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// Don't crash.
|
||||
|
||||
struct g {
|
||||
j; // expected-error {{C++ requires a type specifier for all declarations}}
|
||||
};
|
||||
|
||||
void captures_invalid_type() {
|
||||
g child;
|
||||
auto q = [child]{};
|
||||
const int n = sizeof(q);
|
||||
}
|
||||
|
||||
void captures_invalid_array_type() {
|
||||
g child[100];
|
||||
auto q = [child]{};
|
||||
const int n = sizeof(q);
|
||||
}
|
Loading…
Reference in New Issue