SemaLambda.cpp revision f54486acc1cadf2791c3916ece66fded1e57ba0b
1//===--- SemaLambda.cpp - Semantic Analysis for C++11 Lambdas -------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements semantic analysis for C++ lambda expressions. 11// 12//===----------------------------------------------------------------------===// 13#include "clang/Sema/DeclSpec.h" 14#include "clang/Sema/Initialization.h" 15#include "clang/Sema/Lookup.h" 16#include "clang/Sema/Scope.h" 17#include "clang/Sema/ScopeInfo.h" 18#include "clang/Sema/SemaInternal.h" 19#include "clang/Lex/Preprocessor.h" 20#include "clang/AST/ExprCXX.h" 21using namespace clang; 22using namespace sema; 23 24CXXRecordDecl *Sema::createLambdaClosureType(SourceRange IntroducerRange, 25 bool KnownDependent) { 26 DeclContext *DC = CurContext; 27 while (!(DC->isFunctionOrMethod() || DC->isRecord() || DC->isFileContext())) 28 DC = DC->getParent(); 29 30 // Start constructing the lambda class. 31 CXXRecordDecl *Class = CXXRecordDecl::CreateLambda(Context, DC, 32 IntroducerRange.getBegin(), 33 KnownDependent); 34 DC->addDecl(Class); 35 36 return Class; 37} 38 39/// \brief Determine whether the given context is or is enclosed in an inline 40/// function. 41static bool isInInlineFunction(const DeclContext *DC) { 42 while (!DC->isFileContext()) { 43 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(DC)) 44 if (FD->isInlined()) 45 return true; 46 47 DC = DC->getLexicalParent(); 48 } 49 50 return false; 51} 52 53CXXMethodDecl *Sema::startLambdaDefinition(CXXRecordDecl *Class, 54 SourceRange IntroducerRange, 55 TypeSourceInfo *MethodType, 56 SourceLocation EndLoc, 57 llvm::ArrayRef<ParmVarDecl *> Params, 58 llvm::Optional<unsigned> ManglingNumber, 59 Decl *ContextDecl) { 60 // C++11 [expr.prim.lambda]p5: 61 // The closure type for a lambda-expression has a public inline function 62 // call operator (13.5.4) whose parameters and return type are described by 63 // the lambda-expression's parameter-declaration-clause and 64 // trailing-return-type respectively. 65 DeclarationName MethodName 66 = Context.DeclarationNames.getCXXOperatorName(OO_Call); 67 DeclarationNameLoc MethodNameLoc; 68 MethodNameLoc.CXXOperatorName.BeginOpNameLoc 69 = IntroducerRange.getBegin().getRawEncoding(); 70 MethodNameLoc.CXXOperatorName.EndOpNameLoc 71 = IntroducerRange.getEnd().getRawEncoding(); 72 CXXMethodDecl *Method 73 = CXXMethodDecl::Create(Context, Class, EndLoc, 74 DeclarationNameInfo(MethodName, 75 IntroducerRange.getBegin(), 76 MethodNameLoc), 77 MethodType->getType(), MethodType, 78 /*isStatic=*/false, 79 SC_None, 80 /*isInline=*/true, 81 /*isConstExpr=*/false, 82 EndLoc); 83 Method->setAccess(AS_public); 84 85 // Temporarily set the lexical declaration context to the current 86 // context, so that the Scope stack matches the lexical nesting. 87 Method->setLexicalDeclContext(CurContext); 88 89 // Add parameters. 90 if (!Params.empty()) { 91 Method->setParams(Params); 92 CheckParmsForFunctionDef(const_cast<ParmVarDecl **>(Params.begin()), 93 const_cast<ParmVarDecl **>(Params.end()), 94 /*CheckParameterNames=*/false); 95 96 for (CXXMethodDecl::param_iterator P = Method->param_begin(), 97 PEnd = Method->param_end(); 98 P != PEnd; ++P) 99 (*P)->setOwningFunction(Method); 100 } 101 102 // If we don't already have a mangling number for this lambda expression, 103 // allocate one now. 104 if (!ManglingNumber) { 105 ContextDecl = ExprEvalContexts.back().LambdaContextDecl; 106 107 enum ContextKind { 108 Normal, 109 DefaultArgument, 110 DataMember, 111 StaticDataMember 112 } Kind = Normal; 113 114 // Default arguments of member function parameters that appear in a class 115 // definition, as well as the initializers of data members, receive special 116 // treatment. Identify them. 117 if (ContextDecl) { 118 if (ParmVarDecl *Param = dyn_cast<ParmVarDecl>(ContextDecl)) { 119 if (const DeclContext *LexicalDC 120 = Param->getDeclContext()->getLexicalParent()) 121 if (LexicalDC->isRecord()) 122 Kind = DefaultArgument; 123 } else if (VarDecl *Var = dyn_cast<VarDecl>(ContextDecl)) { 124 if (Var->getDeclContext()->isRecord()) 125 Kind = StaticDataMember; 126 } else if (isa<FieldDecl>(ContextDecl)) { 127 Kind = DataMember; 128 } 129 } 130 131 switch (Kind) { 132 case Normal: 133 if (CurContext->isDependentContext() || isInInlineFunction(CurContext)) 134 ManglingNumber = Context.getLambdaManglingNumber(Method); 135 else 136 ManglingNumber = 0; 137 138 // There is no special context for this lambda. 139 ContextDecl = 0; 140 break; 141 142 case StaticDataMember: 143 if (!CurContext->isDependentContext()) { 144 ManglingNumber = 0; 145 ContextDecl = 0; 146 break; 147 } 148 // Fall through to assign a mangling number. 149 150 case DataMember: 151 case DefaultArgument: 152 ManglingNumber = ExprEvalContexts.back().getLambdaMangleContext() 153 .getManglingNumber(Method); 154 break; 155 } 156 } 157 158 Class->setLambdaMangling(*ManglingNumber, ContextDecl); 159 return Method; 160} 161 162LambdaScopeInfo *Sema::enterLambdaScope(CXXMethodDecl *CallOperator, 163 SourceRange IntroducerRange, 164 LambdaCaptureDefault CaptureDefault, 165 bool ExplicitParams, 166 bool ExplicitResultType, 167 bool Mutable) { 168 PushLambdaScope(CallOperator->getParent(), CallOperator); 169 LambdaScopeInfo *LSI = getCurLambda(); 170 if (CaptureDefault == LCD_ByCopy) 171 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByval; 172 else if (CaptureDefault == LCD_ByRef) 173 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByref; 174 LSI->IntroducerRange = IntroducerRange; 175 LSI->ExplicitParams = ExplicitParams; 176 LSI->Mutable = Mutable; 177 178 if (ExplicitResultType) { 179 LSI->ReturnType = CallOperator->getResultType(); 180 181 if (!LSI->ReturnType->isDependentType() && 182 !LSI->ReturnType->isVoidType()) { 183 if (RequireCompleteType(CallOperator->getLocStart(), LSI->ReturnType, 184 diag::err_lambda_incomplete_result)) { 185 // Do nothing. 186 } else if (LSI->ReturnType->isObjCObjectOrInterfaceType()) { 187 Diag(CallOperator->getLocStart(), diag::err_lambda_objc_object_result) 188 << LSI->ReturnType; 189 } 190 } 191 } else { 192 LSI->HasImplicitReturnType = true; 193 } 194 195 return LSI; 196} 197 198void Sema::finishLambdaExplicitCaptures(LambdaScopeInfo *LSI) { 199 LSI->finishedExplicitCaptures(); 200} 201 202void Sema::addLambdaParameters(CXXMethodDecl *CallOperator, Scope *CurScope) { 203 // Introduce our parameters into the function scope 204 for (unsigned p = 0, NumParams = CallOperator->getNumParams(); 205 p < NumParams; ++p) { 206 ParmVarDecl *Param = CallOperator->getParamDecl(p); 207 208 // If this has an identifier, add it to the scope stack. 209 if (CurScope && Param->getIdentifier()) { 210 CheckShadow(CurScope, Param); 211 212 PushOnScopeChains(Param, CurScope); 213 } 214 } 215} 216 217void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, 218 Declarator &ParamInfo, 219 Scope *CurScope) { 220 // Determine if we're within a context where we know that the lambda will 221 // be dependent, because there are template parameters in scope. 222 bool KnownDependent = false; 223 if (Scope *TmplScope = CurScope->getTemplateParamParent()) 224 if (!TmplScope->decl_empty()) 225 KnownDependent = true; 226 227 CXXRecordDecl *Class = createLambdaClosureType(Intro.Range, KnownDependent); 228 229 // Determine the signature of the call operator. 230 TypeSourceInfo *MethodTyInfo; 231 bool ExplicitParams = true; 232 bool ExplicitResultType = true; 233 SourceLocation EndLoc; 234 llvm::ArrayRef<ParmVarDecl *> Params; 235 if (ParamInfo.getNumTypeObjects() == 0) { 236 // C++11 [expr.prim.lambda]p4: 237 // If a lambda-expression does not include a lambda-declarator, it is as 238 // if the lambda-declarator were (). 239 FunctionProtoType::ExtProtoInfo EPI; 240 EPI.HasTrailingReturn = true; 241 EPI.TypeQuals |= DeclSpec::TQ_const; 242 QualType MethodTy = Context.getFunctionType(Context.DependentTy, 243 /*Args=*/0, /*NumArgs=*/0, EPI); 244 MethodTyInfo = Context.getTrivialTypeSourceInfo(MethodTy); 245 ExplicitParams = false; 246 ExplicitResultType = false; 247 EndLoc = Intro.Range.getEnd(); 248 } else { 249 assert(ParamInfo.isFunctionDeclarator() && 250 "lambda-declarator is a function"); 251 DeclaratorChunk::FunctionTypeInfo &FTI = ParamInfo.getFunctionTypeInfo(); 252 253 // C++11 [expr.prim.lambda]p5: 254 // This function call operator is declared const (9.3.1) if and only if 255 // the lambda-expression's parameter-declaration-clause is not followed 256 // by mutable. It is neither virtual nor declared volatile. [...] 257 if (!FTI.hasMutableQualifier()) 258 FTI.TypeQuals |= DeclSpec::TQ_const; 259 260 MethodTyInfo = GetTypeForDeclarator(ParamInfo, CurScope); 261 assert(MethodTyInfo && "no type from lambda-declarator"); 262 EndLoc = ParamInfo.getSourceRange().getEnd(); 263 264 ExplicitResultType 265 = MethodTyInfo->getType()->getAs<FunctionType>()->getResultType() 266 != Context.DependentTy; 267 268 TypeLoc TL = MethodTyInfo->getTypeLoc(); 269 FunctionProtoTypeLoc Proto = cast<FunctionProtoTypeLoc>(TL); 270 Params = llvm::ArrayRef<ParmVarDecl *>(Proto.getParmArray(), 271 Proto.getNumArgs()); 272 } 273 274 CXXMethodDecl *Method = startLambdaDefinition(Class, Intro.Range, 275 MethodTyInfo, EndLoc, Params); 276 277 if (ExplicitParams) 278 CheckCXXDefaultArguments(Method); 279 280 // Attributes on the lambda apply to the method. 281 ProcessDeclAttributes(CurScope, Method, ParamInfo); 282 283 // Introduce the function call operator as the current declaration context. 284 PushDeclContext(CurScope, Method); 285 286 // Introduce the lambda scope. 287 LambdaScopeInfo *LSI 288 = enterLambdaScope(Method, Intro.Range, Intro.Default, ExplicitParams, 289 ExplicitResultType, 290 (Method->getTypeQualifiers() & Qualifiers::Const) == 0); 291 292 // Handle explicit captures. 293 SourceLocation PrevCaptureLoc 294 = Intro.Default == LCD_None? Intro.Range.getBegin() : Intro.DefaultLoc; 295 for (llvm::SmallVector<LambdaCapture, 4>::const_iterator 296 C = Intro.Captures.begin(), 297 E = Intro.Captures.end(); 298 C != E; 299 PrevCaptureLoc = C->Loc, ++C) { 300 if (C->Kind == LCK_This) { 301 // C++11 [expr.prim.lambda]p8: 302 // An identifier or this shall not appear more than once in a 303 // lambda-capture. 304 if (LSI->isCXXThisCaptured()) { 305 Diag(C->Loc, diag::err_capture_more_than_once) 306 << "'this'" 307 << SourceRange(LSI->getCXXThisCapture().getLocation()) 308 << FixItHint::CreateRemoval( 309 SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc)); 310 continue; 311 } 312 313 // C++11 [expr.prim.lambda]p8: 314 // If a lambda-capture includes a capture-default that is =, the 315 // lambda-capture shall not contain this [...]. 316 if (Intro.Default == LCD_ByCopy) { 317 Diag(C->Loc, diag::err_this_capture_with_copy_default) 318 << FixItHint::CreateRemoval( 319 SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc)); 320 continue; 321 } 322 323 // C++11 [expr.prim.lambda]p12: 324 // If this is captured by a local lambda expression, its nearest 325 // enclosing function shall be a non-static member function. 326 QualType ThisCaptureType = getCurrentThisType(); 327 if (ThisCaptureType.isNull()) { 328 Diag(C->Loc, diag::err_this_capture) << true; 329 continue; 330 } 331 332 CheckCXXThisCapture(C->Loc, /*Explicit=*/true); 333 continue; 334 } 335 336 assert(C->Id && "missing identifier for capture"); 337 338 // C++11 [expr.prim.lambda]p8: 339 // If a lambda-capture includes a capture-default that is &, the 340 // identifiers in the lambda-capture shall not be preceded by &. 341 // If a lambda-capture includes a capture-default that is =, [...] 342 // each identifier it contains shall be preceded by &. 343 if (C->Kind == LCK_ByRef && Intro.Default == LCD_ByRef) { 344 Diag(C->Loc, diag::err_reference_capture_with_reference_default) 345 << FixItHint::CreateRemoval( 346 SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc)); 347 continue; 348 } else if (C->Kind == LCK_ByCopy && Intro.Default == LCD_ByCopy) { 349 Diag(C->Loc, diag::err_copy_capture_with_copy_default) 350 << FixItHint::CreateRemoval( 351 SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc)); 352 continue; 353 } 354 355 DeclarationNameInfo Name(C->Id, C->Loc); 356 LookupResult R(*this, Name, LookupOrdinaryName); 357 LookupName(R, CurScope); 358 if (R.isAmbiguous()) 359 continue; 360 if (R.empty()) { 361 // FIXME: Disable corrections that would add qualification? 362 CXXScopeSpec ScopeSpec; 363 DeclFilterCCC<VarDecl> Validator; 364 if (DiagnoseEmptyLookup(CurScope, ScopeSpec, R, Validator)) 365 continue; 366 } 367 368 // C++11 [expr.prim.lambda]p10: 369 // The identifiers in a capture-list are looked up using the usual rules 370 // for unqualified name lookup (3.4.1); each such lookup shall find a 371 // variable with automatic storage duration declared in the reaching 372 // scope of the local lambda expression. 373 // 374 // Note that the 'reaching scope' check happens in tryCaptureVariable(). 375 VarDecl *Var = R.getAsSingle<VarDecl>(); 376 if (!Var) { 377 Diag(C->Loc, diag::err_capture_does_not_name_variable) << C->Id; 378 continue; 379 } 380 381 if (!Var->hasLocalStorage()) { 382 Diag(C->Loc, diag::err_capture_non_automatic_variable) << C->Id; 383 Diag(Var->getLocation(), diag::note_previous_decl) << C->Id; 384 continue; 385 } 386 387 // C++11 [expr.prim.lambda]p8: 388 // An identifier or this shall not appear more than once in a 389 // lambda-capture. 390 if (LSI->isCaptured(Var)) { 391 Diag(C->Loc, diag::err_capture_more_than_once) 392 << C->Id 393 << SourceRange(LSI->getCapture(Var).getLocation()) 394 << FixItHint::CreateRemoval( 395 SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc)); 396 continue; 397 } 398 399 // C++11 [expr.prim.lambda]p23: 400 // A capture followed by an ellipsis is a pack expansion (14.5.3). 401 SourceLocation EllipsisLoc; 402 if (C->EllipsisLoc.isValid()) { 403 if (Var->isParameterPack()) { 404 EllipsisLoc = C->EllipsisLoc; 405 } else { 406 Diag(C->EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 407 << SourceRange(C->Loc); 408 409 // Just ignore the ellipsis. 410 } 411 } else if (Var->isParameterPack()) { 412 Diag(C->Loc, diag::err_lambda_unexpanded_pack); 413 continue; 414 } 415 416 TryCaptureKind Kind = C->Kind == LCK_ByRef ? TryCapture_ExplicitByRef : 417 TryCapture_ExplicitByVal; 418 tryCaptureVariable(Var, C->Loc, Kind, EllipsisLoc); 419 } 420 finishLambdaExplicitCaptures(LSI); 421 422 // Add lambda parameters into scope. 423 addLambdaParameters(Method, CurScope); 424 425 // Enter a new evaluation context to insulate the lambda from any 426 // cleanups from the enclosing full-expression. 427 PushExpressionEvaluationContext(PotentiallyEvaluated); 428} 429 430void Sema::ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, 431 bool IsInstantiation) { 432 // Leave the expression-evaluation context. 433 DiscardCleanupsInEvaluationContext(); 434 PopExpressionEvaluationContext(); 435 436 // Leave the context of the lambda. 437 if (!IsInstantiation) 438 PopDeclContext(); 439 440 // Finalize the lambda. 441 LambdaScopeInfo *LSI = getCurLambda(); 442 CXXRecordDecl *Class = LSI->Lambda; 443 Class->setInvalidDecl(); 444 SmallVector<Decl*, 4> Fields(Class->field_begin(), Class->field_end()); 445 ActOnFields(0, Class->getLocation(), Class, Fields, 446 SourceLocation(), SourceLocation(), 0); 447 CheckCompletedCXXClass(Class); 448 449 PopFunctionScopeInfo(); 450} 451 452/// \brief Add a lambda's conversion to function pointer, as described in 453/// C++11 [expr.prim.lambda]p6. 454static void addFunctionPointerConversion(Sema &S, 455 SourceRange IntroducerRange, 456 CXXRecordDecl *Class, 457 CXXMethodDecl *CallOperator) { 458 // Add the conversion to function pointer. 459 const FunctionProtoType *Proto 460 = CallOperator->getType()->getAs<FunctionProtoType>(); 461 QualType FunctionPtrTy; 462 QualType FunctionTy; 463 { 464 FunctionProtoType::ExtProtoInfo ExtInfo = Proto->getExtProtoInfo(); 465 ExtInfo.TypeQuals = 0; 466 FunctionTy = S.Context.getFunctionType(Proto->getResultType(), 467 Proto->arg_type_begin(), 468 Proto->getNumArgs(), 469 ExtInfo); 470 FunctionPtrTy = S.Context.getPointerType(FunctionTy); 471 } 472 473 FunctionProtoType::ExtProtoInfo ExtInfo; 474 ExtInfo.TypeQuals = Qualifiers::Const; 475 QualType ConvTy = S.Context.getFunctionType(FunctionPtrTy, 0, 0, ExtInfo); 476 477 SourceLocation Loc = IntroducerRange.getBegin(); 478 DeclarationName Name 479 = S.Context.DeclarationNames.getCXXConversionFunctionName( 480 S.Context.getCanonicalType(FunctionPtrTy)); 481 DeclarationNameLoc NameLoc; 482 NameLoc.NamedType.TInfo = S.Context.getTrivialTypeSourceInfo(FunctionPtrTy, 483 Loc); 484 CXXConversionDecl *Conversion 485 = CXXConversionDecl::Create(S.Context, Class, Loc, 486 DeclarationNameInfo(Name, Loc, NameLoc), 487 ConvTy, 488 S.Context.getTrivialTypeSourceInfo(ConvTy, 489 Loc), 490 /*isInline=*/false, /*isExplicit=*/false, 491 /*isConstexpr=*/false, 492 CallOperator->getBody()->getLocEnd()); 493 Conversion->setAccess(AS_public); 494 Conversion->setImplicit(true); 495 Class->addDecl(Conversion); 496 497 // Add a non-static member function "__invoke" that will be the result of 498 // the conversion. 499 Name = &S.Context.Idents.get("__invoke"); 500 CXXMethodDecl *Invoke 501 = CXXMethodDecl::Create(S.Context, Class, Loc, 502 DeclarationNameInfo(Name, Loc), FunctionTy, 503 CallOperator->getTypeSourceInfo(), 504 /*IsStatic=*/true, SC_Static, /*IsInline=*/true, 505 /*IsConstexpr=*/false, 506 CallOperator->getBody()->getLocEnd()); 507 SmallVector<ParmVarDecl *, 4> InvokeParams; 508 for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I) { 509 ParmVarDecl *From = CallOperator->getParamDecl(I); 510 InvokeParams.push_back(ParmVarDecl::Create(S.Context, Invoke, 511 From->getLocStart(), 512 From->getLocation(), 513 From->getIdentifier(), 514 From->getType(), 515 From->getTypeSourceInfo(), 516 From->getStorageClass(), 517 From->getStorageClassAsWritten(), 518 /*DefaultArg=*/0)); 519 } 520 Invoke->setParams(InvokeParams); 521 Invoke->setAccess(AS_private); 522 Invoke->setImplicit(true); 523 Class->addDecl(Invoke); 524} 525 526/// \brief Add a lambda's conversion to block pointer. 527static void addBlockPointerConversion(Sema &S, 528 SourceRange IntroducerRange, 529 CXXRecordDecl *Class, 530 CXXMethodDecl *CallOperator) { 531 const FunctionProtoType *Proto 532 = CallOperator->getType()->getAs<FunctionProtoType>(); 533 QualType BlockPtrTy; 534 { 535 FunctionProtoType::ExtProtoInfo ExtInfo = Proto->getExtProtoInfo(); 536 ExtInfo.TypeQuals = 0; 537 QualType FunctionTy 538 = S.Context.getFunctionType(Proto->getResultType(), 539 Proto->arg_type_begin(), 540 Proto->getNumArgs(), 541 ExtInfo); 542 BlockPtrTy = S.Context.getBlockPointerType(FunctionTy); 543 } 544 545 FunctionProtoType::ExtProtoInfo ExtInfo; 546 ExtInfo.TypeQuals = Qualifiers::Const; 547 QualType ConvTy = S.Context.getFunctionType(BlockPtrTy, 0, 0, ExtInfo); 548 549 SourceLocation Loc = IntroducerRange.getBegin(); 550 DeclarationName Name 551 = S.Context.DeclarationNames.getCXXConversionFunctionName( 552 S.Context.getCanonicalType(BlockPtrTy)); 553 DeclarationNameLoc NameLoc; 554 NameLoc.NamedType.TInfo = S.Context.getTrivialTypeSourceInfo(BlockPtrTy, Loc); 555 CXXConversionDecl *Conversion 556 = CXXConversionDecl::Create(S.Context, Class, Loc, 557 DeclarationNameInfo(Name, Loc, NameLoc), 558 ConvTy, 559 S.Context.getTrivialTypeSourceInfo(ConvTy, Loc), 560 /*isInline=*/false, /*isExplicit=*/false, 561 /*isConstexpr=*/false, 562 CallOperator->getBody()->getLocEnd()); 563 Conversion->setAccess(AS_public); 564 Conversion->setImplicit(true); 565 Class->addDecl(Conversion); 566} 567 568ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body, 569 Scope *CurScope, 570 bool IsInstantiation) { 571 // Collect information from the lambda scope. 572 llvm::SmallVector<LambdaExpr::Capture, 4> Captures; 573 llvm::SmallVector<Expr *, 4> CaptureInits; 574 LambdaCaptureDefault CaptureDefault; 575 CXXRecordDecl *Class; 576 CXXMethodDecl *CallOperator; 577 SourceRange IntroducerRange; 578 bool ExplicitParams; 579 bool ExplicitResultType; 580 bool LambdaExprNeedsCleanups; 581 llvm::SmallVector<VarDecl *, 4> ArrayIndexVars; 582 llvm::SmallVector<unsigned, 4> ArrayIndexStarts; 583 { 584 LambdaScopeInfo *LSI = getCurLambda(); 585 CallOperator = LSI->CallOperator; 586 Class = LSI->Lambda; 587 IntroducerRange = LSI->IntroducerRange; 588 ExplicitParams = LSI->ExplicitParams; 589 ExplicitResultType = !LSI->HasImplicitReturnType; 590 LambdaExprNeedsCleanups = LSI->ExprNeedsCleanups; 591 ArrayIndexVars.swap(LSI->ArrayIndexVars); 592 ArrayIndexStarts.swap(LSI->ArrayIndexStarts); 593 594 // Translate captures. 595 for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) { 596 LambdaScopeInfo::Capture From = LSI->Captures[I]; 597 assert(!From.isBlockCapture() && "Cannot capture __block variables"); 598 bool IsImplicit = I >= LSI->NumExplicitCaptures; 599 600 // Handle 'this' capture. 601 if (From.isThisCapture()) { 602 Captures.push_back(LambdaExpr::Capture(From.getLocation(), 603 IsImplicit, 604 LCK_This)); 605 CaptureInits.push_back(new (Context) CXXThisExpr(From.getLocation(), 606 getCurrentThisType(), 607 /*isImplicit=*/true)); 608 continue; 609 } 610 611 VarDecl *Var = From.getVariable(); 612 LambdaCaptureKind Kind = From.isCopyCapture()? LCK_ByCopy : LCK_ByRef; 613 Captures.push_back(LambdaExpr::Capture(From.getLocation(), IsImplicit, 614 Kind, Var, From.getEllipsisLoc())); 615 CaptureInits.push_back(From.getCopyExpr()); 616 } 617 618 switch (LSI->ImpCaptureStyle) { 619 case CapturingScopeInfo::ImpCap_None: 620 CaptureDefault = LCD_None; 621 break; 622 623 case CapturingScopeInfo::ImpCap_LambdaByval: 624 CaptureDefault = LCD_ByCopy; 625 break; 626 627 case CapturingScopeInfo::ImpCap_LambdaByref: 628 CaptureDefault = LCD_ByRef; 629 break; 630 631 case CapturingScopeInfo::ImpCap_Block: 632 llvm_unreachable("block capture in lambda"); 633 break; 634 } 635 636 // C++11 [expr.prim.lambda]p4: 637 // If a lambda-expression does not include a 638 // trailing-return-type, it is as if the trailing-return-type 639 // denotes the following type: 640 // FIXME: Assumes current resolution to core issue 975. 641 if (LSI->HasImplicitReturnType) { 642 // - if there are no return statements in the 643 // compound-statement, or all return statements return 644 // either an expression of type void or no expression or 645 // braced-init-list, the type void; 646 if (LSI->ReturnType.isNull()) { 647 LSI->ReturnType = Context.VoidTy; 648 } else { 649 // C++11 [expr.prim.lambda]p4: 650 // - if the compound-statement is of the form 651 // 652 // { attribute-specifier-seq[opt] return expression ; } 653 // 654 // the type of the returned expression after 655 // lvalue-to-rvalue conversion (4.1), array-to-pointer 656 // conver- sion (4.2), and function-to-pointer conversion 657 // (4.3); 658 // 659 // Since we're accepting the resolution to a post-C++11 core 660 // issue with a non-trivial extension, provide a warning (by 661 // default). 662 CompoundStmt *CompoundBody = cast<CompoundStmt>(Body); 663 if (!(CompoundBody->size() == 1 && 664 isa<ReturnStmt>(*CompoundBody->body_begin())) && 665 !Context.hasSameType(LSI->ReturnType, Context.VoidTy)) 666 Diag(IntroducerRange.getBegin(), 667 diag::ext_lambda_implies_void_return); 668 } 669 670 // Create a function type with the inferred return type. 671 const FunctionProtoType *Proto 672 = CallOperator->getType()->getAs<FunctionProtoType>(); 673 QualType FunctionTy 674 = Context.getFunctionType(LSI->ReturnType, 675 Proto->arg_type_begin(), 676 Proto->getNumArgs(), 677 Proto->getExtProtoInfo()); 678 CallOperator->setType(FunctionTy); 679 } 680 681 // C++ [expr.prim.lambda]p7: 682 // The lambda-expression's compound-statement yields the 683 // function-body (8.4) of the function call operator [...]. 684 ActOnFinishFunctionBody(CallOperator, Body, IsInstantiation); 685 CallOperator->setLexicalDeclContext(Class); 686 Class->addDecl(CallOperator); 687 PopExpressionEvaluationContext(); 688 689 // C++11 [expr.prim.lambda]p6: 690 // The closure type for a lambda-expression with no lambda-capture 691 // has a public non-virtual non-explicit const conversion function 692 // to pointer to function having the same parameter and return 693 // types as the closure type's function call operator. 694 if (Captures.empty() && CaptureDefault == LCD_None) 695 addFunctionPointerConversion(*this, IntroducerRange, Class, 696 CallOperator); 697 698 // Objective-C++: 699 // The closure type for a lambda-expression has a public non-virtual 700 // non-explicit const conversion function to a block pointer having the 701 // same parameter and return types as the closure type's function call 702 // operator. 703 if (getLangOpts().Blocks && getLangOpts().ObjC1) 704 addBlockPointerConversion(*this, IntroducerRange, Class, CallOperator); 705 706 // Finalize the lambda class. 707 SmallVector<Decl*, 4> Fields(Class->field_begin(), Class->field_end()); 708 ActOnFields(0, Class->getLocation(), Class, Fields, 709 SourceLocation(), SourceLocation(), 0); 710 CheckCompletedCXXClass(Class); 711 } 712 713 if (LambdaExprNeedsCleanups) 714 ExprNeedsCleanups = true; 715 716 LambdaExpr *Lambda = LambdaExpr::Create(Context, Class, IntroducerRange, 717 CaptureDefault, Captures, 718 ExplicitParams, ExplicitResultType, 719 CaptureInits, ArrayIndexVars, 720 ArrayIndexStarts, Body->getLocEnd()); 721 722 // C++11 [expr.prim.lambda]p2: 723 // A lambda-expression shall not appear in an unevaluated operand 724 // (Clause 5). 725 if (!CurContext->isDependentContext()) { 726 switch (ExprEvalContexts.back().Context) { 727 case Unevaluated: 728 // We don't actually diagnose this case immediately, because we 729 // could be within a context where we might find out later that 730 // the expression is potentially evaluated (e.g., for typeid). 731 ExprEvalContexts.back().Lambdas.push_back(Lambda); 732 break; 733 734 case ConstantEvaluated: 735 case PotentiallyEvaluated: 736 case PotentiallyEvaluatedIfUsed: 737 break; 738 } 739 } 740 741 return MaybeBindToTemporary(Lambda); 742} 743 744ExprResult Sema::BuildBlockForLambdaConversion(SourceLocation CurrentLocation, 745 SourceLocation ConvLocation, 746 CXXConversionDecl *Conv, 747 Expr *Src) { 748 // Make sure that the lambda call operator is marked used. 749 CXXRecordDecl *Lambda = Conv->getParent(); 750 CXXMethodDecl *CallOperator 751 = cast<CXXMethodDecl>( 752 *Lambda->lookup( 753 Context.DeclarationNames.getCXXOperatorName(OO_Call)).first); 754 CallOperator->setReferenced(); 755 CallOperator->setUsed(); 756 757 ExprResult Init = PerformCopyInitialization( 758 InitializedEntity::InitializeBlock(ConvLocation, 759 Src->getType(), 760 /*NRVO=*/false), 761 CurrentLocation, Src); 762 if (!Init.isInvalid()) 763 Init = ActOnFinishFullExpr(Init.take()); 764 765 if (Init.isInvalid()) 766 return ExprError(); 767 768 // Create the new block to be returned. 769 BlockDecl *Block = BlockDecl::Create(Context, CurContext, ConvLocation); 770 771 // Set the type information. 772 Block->setSignatureAsWritten(CallOperator->getTypeSourceInfo()); 773 Block->setIsVariadic(CallOperator->isVariadic()); 774 Block->setBlockMissingReturnType(false); 775 776 // Add parameters. 777 SmallVector<ParmVarDecl *, 4> BlockParams; 778 for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I) { 779 ParmVarDecl *From = CallOperator->getParamDecl(I); 780 BlockParams.push_back(ParmVarDecl::Create(Context, Block, 781 From->getLocStart(), 782 From->getLocation(), 783 From->getIdentifier(), 784 From->getType(), 785 From->getTypeSourceInfo(), 786 From->getStorageClass(), 787 From->getStorageClassAsWritten(), 788 /*DefaultArg=*/0)); 789 } 790 Block->setParams(BlockParams); 791 792 Block->setIsConversionFromLambda(true); 793 794 // Add capture. The capture uses a fake variable, which doesn't correspond 795 // to any actual memory location. However, the initializer copy-initializes 796 // the lambda object. 797 TypeSourceInfo *CapVarTSI = 798 Context.getTrivialTypeSourceInfo(Src->getType()); 799 VarDecl *CapVar = VarDecl::Create(Context, Block, ConvLocation, 800 ConvLocation, 0, 801 Src->getType(), CapVarTSI, 802 SC_None, SC_None); 803 BlockDecl::Capture Capture(/*Variable=*/CapVar, /*ByRef=*/false, 804 /*Nested=*/false, /*Copy=*/Init.take()); 805 Block->setCaptures(Context, &Capture, &Capture + 1, 806 /*CapturesCXXThis=*/false); 807 808 // Add a fake function body to the block. IR generation is responsible 809 // for filling in the actual body, which cannot be expressed as an AST. 810 Block->setBody(new (Context) CompoundStmt(Context, 0, 0, 811 ConvLocation, 812 ConvLocation)); 813 814 // Create the block literal expression. 815 Expr *BuildBlock = new (Context) BlockExpr(Block, Conv->getConversionType()); 816 ExprCleanupObjects.push_back(Block); 817 ExprNeedsCleanups = true; 818 819 return BuildBlock; 820} 821