From 34496c1e00912c5a570af28e0d5e4a3fc75714db Mon Sep 17 00:00:00 2001 From: Jorge Gorbe Moya Date: Wed, 21 Nov 2018 17:49:37 +0000 Subject: [PATCH] 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). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@347402 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 15 +++++++++++++++ test/SemaCXX/lambda-invalid-capture.cpp | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 test/SemaCXX/lambda-invalid-capture.cpp diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 50ace94018..c9be58be9f 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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); diff --git a/test/SemaCXX/lambda-invalid-capture.cpp b/test/SemaCXX/lambda-invalid-capture.cpp new file mode 100644 index 0000000000..32349704ca --- /dev/null +++ b/test/SemaCXX/lambda-invalid-capture.cpp @@ -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); +} -- 2.40.0