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:
Jorge Gorbe Moya 2018-11-21 17:49:37 +00:00
parent 5ba384347c
commit 59974412a4
2 changed files with 33 additions and 0 deletions

View File

@ -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);

View File

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