Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -14941,6 +14941,13 @@ = 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 (const CXXRecordDecl *RD = FieldType->getAsCXXRecordDecl()) { + if (RD->isInvalidDecl()) { + Lambda->setInvalidDecl(); + } + } Field->setImplicit(true); Field->setAccess(AS_private); Lambda->addDecl(Field); Index: clang/test/SemaCXX/lambda-invalid-capture.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/lambda-invalid-capture.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// Don't crash. + +struct g { + j; // expected-error {{C++ requires a type specifier for all declarations}} +}; + +void h() { + g child; + auto q = [child]{}; + const int n = sizeof(q); +}