diff options
| author | Douglas Gregor <dgregor@apple.com> | 2012-06-15 16:59:29 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2012-06-15 16:59:29 +0000 |
| commit | 7efd007cfb84e2faa4f5e074178eca298e31bd61 (patch) | |
| tree | e25f770a08e0247fe23325b5094f6810a34fea9f /clang/lib/Sema/SemaLambda.cpp | |
| parent | 25c40e5a5b0cf827eb05d4b32c9eaf708daf4e5d (diff) | |
| download | bcm5719-llvm-7efd007cfb84e2faa4f5e074178eca298e31bd61.tar.gz bcm5719-llvm-7efd007cfb84e2faa4f5e074178eca298e31bd61.zip | |
Check the parameter lists and return type of both blocks and lambdas
for unexpanded parameter packs. Fixes the crash-on-invalid in
PR13117.
llvm-svn: 158525
Diffstat (limited to 'clang/lib/Sema/SemaLambda.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaLambda.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaLambda.cpp b/clang/lib/Sema/SemaLambda.cpp index f64be51744d..07ee8905629 100644 --- a/clang/lib/Sema/SemaLambda.cpp +++ b/clang/lib/Sema/SemaLambda.cpp @@ -269,9 +269,26 @@ void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL); Params = llvm::ArrayRef<ParmVarDecl *>(Proto.getParmArray(), Proto.getNumArgs()); + + // Check for unexpanded parameter packs in the method type. + // FIXME: We should allow unexpanded parameter packs here, but that would, + // in turn, make the lambda expression contain unexpanded parameter packs. + if (DiagnoseUnexpandedParameterPack(Intro.Range.getBegin(), MethodTyInfo, + UPPC_Lambda)) { + // Drop the parameters. + Params = llvm::ArrayRef<ParmVarDecl *>(); + FunctionProtoType::ExtProtoInfo EPI; + EPI.HasTrailingReturn = false; + EPI.TypeQuals |= DeclSpec::TQ_const; + QualType MethodTy = Context.getFunctionType(Context.DependentTy, + /*Args=*/0, /*NumArgs=*/0, EPI); + MethodTyInfo = Context.getTrivialTypeSourceInfo(MethodTy); + ExplicitParams = false; + ExplicitResultType = false; + } } - CXXMethodDecl *Method = startLambdaDefinition(Class, Intro.Range, + CXXMethodDecl *Method = startLambdaDefinition(Class, Intro.Range, MethodTyInfo, EndLoc, Params); if (ExplicitParams) |

