• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/AST/ExprCXX.h"
15 #include "clang/Lex/Preprocessor.h"
16 #include "clang/Sema/Initialization.h"
17 #include "clang/Sema/Lookup.h"
18 #include "clang/Sema/Scope.h"
19 #include "clang/Sema/ScopeInfo.h"
20 #include "clang/Sema/SemaInternal.h"
21 #include "TypeLocBuilder.h"
22 using namespace clang;
23 using namespace sema;
24 
createLambdaClosureType(SourceRange IntroducerRange,TypeSourceInfo * Info,bool KnownDependent)25 CXXRecordDecl *Sema::createLambdaClosureType(SourceRange IntroducerRange,
26                                              TypeSourceInfo *Info,
27                                              bool KnownDependent) {
28   DeclContext *DC = CurContext;
29   while (!(DC->isFunctionOrMethod() || DC->isRecord() || DC->isFileContext()))
30     DC = DC->getParent();
31 
32   // Start constructing the lambda class.
33   CXXRecordDecl *Class = CXXRecordDecl::CreateLambda(Context, DC, Info,
34                                                      IntroducerRange.getBegin(),
35                                                      KnownDependent);
36   DC->addDecl(Class);
37 
38   return Class;
39 }
40 
41 /// \brief Determine whether the given context is or is enclosed in an inline
42 /// function.
isInInlineFunction(const DeclContext * DC)43 static bool isInInlineFunction(const DeclContext *DC) {
44   while (!DC->isFileContext()) {
45     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(DC))
46       if (FD->isInlined())
47         return true;
48 
49     DC = DC->getLexicalParent();
50   }
51 
52   return false;
53 }
54 
55 MangleNumberingContext *
getCurrentMangleNumberContext(const DeclContext * DC,Decl * & ManglingContextDecl)56 Sema::getCurrentMangleNumberContext(const DeclContext *DC,
57                                     Decl *&ManglingContextDecl) {
58   // Compute the context for allocating mangling numbers in the current
59   // expression, if the ABI requires them.
60   ManglingContextDecl = ExprEvalContexts.back().ManglingContextDecl;
61 
62   enum ContextKind {
63     Normal,
64     DefaultArgument,
65     DataMember,
66     StaticDataMember
67   } Kind = Normal;
68 
69   // Default arguments of member function parameters that appear in a class
70   // definition, as well as the initializers of data members, receive special
71   // treatment. Identify them.
72   if (ManglingContextDecl) {
73     if (ParmVarDecl *Param = dyn_cast<ParmVarDecl>(ManglingContextDecl)) {
74       if (const DeclContext *LexicalDC
75           = Param->getDeclContext()->getLexicalParent())
76         if (LexicalDC->isRecord())
77           Kind = DefaultArgument;
78     } else if (VarDecl *Var = dyn_cast<VarDecl>(ManglingContextDecl)) {
79       if (Var->getDeclContext()->isRecord())
80         Kind = StaticDataMember;
81     } else if (isa<FieldDecl>(ManglingContextDecl)) {
82       Kind = DataMember;
83     }
84   }
85 
86   // Itanium ABI [5.1.7]:
87   //   In the following contexts [...] the one-definition rule requires closure
88   //   types in different translation units to "correspond":
89   bool IsInNonspecializedTemplate =
90     !ActiveTemplateInstantiations.empty() || CurContext->isDependentContext();
91   switch (Kind) {
92   case Normal:
93     //  -- the bodies of non-exported nonspecialized template functions
94     //  -- the bodies of inline functions
95     if ((IsInNonspecializedTemplate &&
96          !(ManglingContextDecl && isa<ParmVarDecl>(ManglingContextDecl))) ||
97         isInInlineFunction(CurContext)) {
98       ManglingContextDecl = 0;
99       return &Context.getManglingNumberContext(DC);
100     }
101 
102     ManglingContextDecl = 0;
103     return 0;
104 
105   case StaticDataMember:
106     //  -- the initializers of nonspecialized static members of template classes
107     if (!IsInNonspecializedTemplate) {
108       ManglingContextDecl = 0;
109       return 0;
110     }
111     // Fall through to get the current context.
112 
113   case DataMember:
114     //  -- the in-class initializers of class members
115   case DefaultArgument:
116     //  -- default arguments appearing in class definitions
117     return &ExprEvalContexts.back().getMangleNumberingContext();
118   }
119 
120   llvm_unreachable("unexpected context");
121 }
122 
startLambdaDefinition(CXXRecordDecl * Class,SourceRange IntroducerRange,TypeSourceInfo * MethodType,SourceLocation EndLoc,ArrayRef<ParmVarDecl * > Params)123 CXXMethodDecl *Sema::startLambdaDefinition(CXXRecordDecl *Class,
124                  SourceRange IntroducerRange,
125                  TypeSourceInfo *MethodType,
126                  SourceLocation EndLoc,
127                  ArrayRef<ParmVarDecl *> Params) {
128   // C++11 [expr.prim.lambda]p5:
129   //   The closure type for a lambda-expression has a public inline function
130   //   call operator (13.5.4) whose parameters and return type are described by
131   //   the lambda-expression's parameter-declaration-clause and
132   //   trailing-return-type respectively.
133   DeclarationName MethodName
134     = Context.DeclarationNames.getCXXOperatorName(OO_Call);
135   DeclarationNameLoc MethodNameLoc;
136   MethodNameLoc.CXXOperatorName.BeginOpNameLoc
137     = IntroducerRange.getBegin().getRawEncoding();
138   MethodNameLoc.CXXOperatorName.EndOpNameLoc
139     = IntroducerRange.getEnd().getRawEncoding();
140   CXXMethodDecl *Method
141     = CXXMethodDecl::Create(Context, Class, EndLoc,
142                             DeclarationNameInfo(MethodName,
143                                                 IntroducerRange.getBegin(),
144                                                 MethodNameLoc),
145                             MethodType->getType(), MethodType,
146                             SC_None,
147                             /*isInline=*/true,
148                             /*isConstExpr=*/false,
149                             EndLoc);
150   Method->setAccess(AS_public);
151 
152   // Temporarily set the lexical declaration context to the current
153   // context, so that the Scope stack matches the lexical nesting.
154   Method->setLexicalDeclContext(CurContext);
155 
156   // Add parameters.
157   if (!Params.empty()) {
158     Method->setParams(Params);
159     CheckParmsForFunctionDef(const_cast<ParmVarDecl **>(Params.begin()),
160                              const_cast<ParmVarDecl **>(Params.end()),
161                              /*CheckParameterNames=*/false);
162 
163     for (CXXMethodDecl::param_iterator P = Method->param_begin(),
164                                     PEnd = Method->param_end();
165          P != PEnd; ++P)
166       (*P)->setOwningFunction(Method);
167   }
168 
169   Decl *ManglingContextDecl;
170   if (MangleNumberingContext *MCtx =
171           getCurrentMangleNumberContext(Class->getDeclContext(),
172                                         ManglingContextDecl)) {
173     unsigned ManglingNumber = MCtx->getManglingNumber(Method);
174     Class->setLambdaMangling(ManglingNumber, ManglingContextDecl);
175   }
176 
177   return Method;
178 }
179 
enterLambdaScope(CXXMethodDecl * CallOperator,SourceRange IntroducerRange,LambdaCaptureDefault CaptureDefault,bool ExplicitParams,bool ExplicitResultType,bool Mutable)180 LambdaScopeInfo *Sema::enterLambdaScope(CXXMethodDecl *CallOperator,
181                                         SourceRange IntroducerRange,
182                                         LambdaCaptureDefault CaptureDefault,
183                                         bool ExplicitParams,
184                                         bool ExplicitResultType,
185                                         bool Mutable) {
186   PushLambdaScope(CallOperator->getParent(), CallOperator);
187   LambdaScopeInfo *LSI = getCurLambda();
188   if (CaptureDefault == LCD_ByCopy)
189     LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByval;
190   else if (CaptureDefault == LCD_ByRef)
191     LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByref;
192   LSI->IntroducerRange = IntroducerRange;
193   LSI->ExplicitParams = ExplicitParams;
194   LSI->Mutable = Mutable;
195 
196   if (ExplicitResultType) {
197     LSI->ReturnType = CallOperator->getResultType();
198 
199     if (!LSI->ReturnType->isDependentType() &&
200         !LSI->ReturnType->isVoidType()) {
201       if (RequireCompleteType(CallOperator->getLocStart(), LSI->ReturnType,
202                               diag::err_lambda_incomplete_result)) {
203         // Do nothing.
204       }
205     }
206   } else {
207     LSI->HasImplicitReturnType = true;
208   }
209 
210   return LSI;
211 }
212 
finishLambdaExplicitCaptures(LambdaScopeInfo * LSI)213 void Sema::finishLambdaExplicitCaptures(LambdaScopeInfo *LSI) {
214   LSI->finishedExplicitCaptures();
215 }
216 
addLambdaParameters(CXXMethodDecl * CallOperator,Scope * CurScope)217 void Sema::addLambdaParameters(CXXMethodDecl *CallOperator, Scope *CurScope) {
218   // Introduce our parameters into the function scope
219   for (unsigned p = 0, NumParams = CallOperator->getNumParams();
220        p < NumParams; ++p) {
221     ParmVarDecl *Param = CallOperator->getParamDecl(p);
222 
223     // If this has an identifier, add it to the scope stack.
224     if (CurScope && Param->getIdentifier()) {
225       CheckShadow(CurScope, Param);
226 
227       PushOnScopeChains(Param, CurScope);
228     }
229   }
230 }
231 
232 /// If this expression is an enumerator-like expression of some type
233 /// T, return the type T; otherwise, return null.
234 ///
235 /// Pointer comparisons on the result here should always work because
236 /// it's derived from either the parent of an EnumConstantDecl
237 /// (i.e. the definition) or the declaration returned by
238 /// EnumType::getDecl() (i.e. the definition).
findEnumForBlockReturn(Expr * E)239 static EnumDecl *findEnumForBlockReturn(Expr *E) {
240   // An expression is an enumerator-like expression of type T if,
241   // ignoring parens and parens-like expressions:
242   E = E->IgnoreParens();
243 
244   //  - it is an enumerator whose enum type is T or
245   if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
246     if (EnumConstantDecl *D
247           = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
248       return cast<EnumDecl>(D->getDeclContext());
249     }
250     return 0;
251   }
252 
253   //  - it is a comma expression whose RHS is an enumerator-like
254   //    expression of type T or
255   if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
256     if (BO->getOpcode() == BO_Comma)
257       return findEnumForBlockReturn(BO->getRHS());
258     return 0;
259   }
260 
261   //  - it is a statement-expression whose value expression is an
262   //    enumerator-like expression of type T or
263   if (StmtExpr *SE = dyn_cast<StmtExpr>(E)) {
264     if (Expr *last = dyn_cast_or_null<Expr>(SE->getSubStmt()->body_back()))
265       return findEnumForBlockReturn(last);
266     return 0;
267   }
268 
269   //   - it is a ternary conditional operator (not the GNU ?:
270   //     extension) whose second and third operands are
271   //     enumerator-like expressions of type T or
272   if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
273     if (EnumDecl *ED = findEnumForBlockReturn(CO->getTrueExpr()))
274       if (ED == findEnumForBlockReturn(CO->getFalseExpr()))
275         return ED;
276     return 0;
277   }
278 
279   // (implicitly:)
280   //   - it is an implicit integral conversion applied to an
281   //     enumerator-like expression of type T or
282   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
283     // We can sometimes see integral conversions in valid
284     // enumerator-like expressions.
285     if (ICE->getCastKind() == CK_IntegralCast)
286       return findEnumForBlockReturn(ICE->getSubExpr());
287 
288     // Otherwise, just rely on the type.
289   }
290 
291   //   - it is an expression of that formal enum type.
292   if (const EnumType *ET = E->getType()->getAs<EnumType>()) {
293     return ET->getDecl();
294   }
295 
296   // Otherwise, nope.
297   return 0;
298 }
299 
300 /// Attempt to find a type T for which the returned expression of the
301 /// given statement is an enumerator-like expression of that type.
findEnumForBlockReturn(ReturnStmt * ret)302 static EnumDecl *findEnumForBlockReturn(ReturnStmt *ret) {
303   if (Expr *retValue = ret->getRetValue())
304     return findEnumForBlockReturn(retValue);
305   return 0;
306 }
307 
308 /// Attempt to find a common type T for which all of the returned
309 /// expressions in a block are enumerator-like expressions of that
310 /// type.
findCommonEnumForBlockReturns(ArrayRef<ReturnStmt * > returns)311 static EnumDecl *findCommonEnumForBlockReturns(ArrayRef<ReturnStmt*> returns) {
312   ArrayRef<ReturnStmt*>::iterator i = returns.begin(), e = returns.end();
313 
314   // Try to find one for the first return.
315   EnumDecl *ED = findEnumForBlockReturn(*i);
316   if (!ED) return 0;
317 
318   // Check that the rest of the returns have the same enum.
319   for (++i; i != e; ++i) {
320     if (findEnumForBlockReturn(*i) != ED)
321       return 0;
322   }
323 
324   // Never infer an anonymous enum type.
325   if (!ED->hasNameForLinkage()) return 0;
326 
327   return ED;
328 }
329 
330 /// Adjust the given return statements so that they formally return
331 /// the given type.  It should require, at most, an IntegralCast.
adjustBlockReturnsToEnum(Sema & S,ArrayRef<ReturnStmt * > returns,QualType returnType)332 static void adjustBlockReturnsToEnum(Sema &S, ArrayRef<ReturnStmt*> returns,
333                                      QualType returnType) {
334   for (ArrayRef<ReturnStmt*>::iterator
335          i = returns.begin(), e = returns.end(); i != e; ++i) {
336     ReturnStmt *ret = *i;
337     Expr *retValue = ret->getRetValue();
338     if (S.Context.hasSameType(retValue->getType(), returnType))
339       continue;
340 
341     // Right now we only support integral fixup casts.
342     assert(returnType->isIntegralOrUnscopedEnumerationType());
343     assert(retValue->getType()->isIntegralOrUnscopedEnumerationType());
344 
345     ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(retValue);
346 
347     Expr *E = (cleanups ? cleanups->getSubExpr() : retValue);
348     E = ImplicitCastExpr::Create(S.Context, returnType, CK_IntegralCast,
349                                  E, /*base path*/ 0, VK_RValue);
350     if (cleanups) {
351       cleanups->setSubExpr(E);
352     } else {
353       ret->setRetValue(E);
354     }
355   }
356 }
357 
deduceClosureReturnType(CapturingScopeInfo & CSI)358 void Sema::deduceClosureReturnType(CapturingScopeInfo &CSI) {
359   assert(CSI.HasImplicitReturnType);
360 
361   // C++ Core Issue #975, proposed resolution:
362   //   If a lambda-expression does not include a trailing-return-type,
363   //   it is as if the trailing-return-type denotes the following type:
364   //     - if there are no return statements in the compound-statement,
365   //       or all return statements return either an expression of type
366   //       void or no expression or braced-init-list, the type void;
367   //     - otherwise, if all return statements return an expression
368   //       and the types of the returned expressions after
369   //       lvalue-to-rvalue conversion (4.1 [conv.lval]),
370   //       array-to-pointer conversion (4.2 [conv.array]), and
371   //       function-to-pointer conversion (4.3 [conv.func]) are the
372   //       same, that common type;
373   //     - otherwise, the program is ill-formed.
374   //
375   // In addition, in blocks in non-C++ modes, if all of the return
376   // statements are enumerator-like expressions of some type T, where
377   // T has a name for linkage, then we infer the return type of the
378   // block to be that type.
379 
380   // First case: no return statements, implicit void return type.
381   ASTContext &Ctx = getASTContext();
382   if (CSI.Returns.empty()) {
383     // It's possible there were simply no /valid/ return statements.
384     // In this case, the first one we found may have at least given us a type.
385     if (CSI.ReturnType.isNull())
386       CSI.ReturnType = Ctx.VoidTy;
387     return;
388   }
389 
390   // Second case: at least one return statement has dependent type.
391   // Delay type checking until instantiation.
392   assert(!CSI.ReturnType.isNull() && "We should have a tentative return type.");
393   if (CSI.ReturnType->isDependentType())
394     return;
395 
396   // Try to apply the enum-fuzz rule.
397   if (!getLangOpts().CPlusPlus) {
398     assert(isa<BlockScopeInfo>(CSI));
399     const EnumDecl *ED = findCommonEnumForBlockReturns(CSI.Returns);
400     if (ED) {
401       CSI.ReturnType = Context.getTypeDeclType(ED);
402       adjustBlockReturnsToEnum(*this, CSI.Returns, CSI.ReturnType);
403       return;
404     }
405   }
406 
407   // Third case: only one return statement. Don't bother doing extra work!
408   SmallVectorImpl<ReturnStmt*>::iterator I = CSI.Returns.begin(),
409                                          E = CSI.Returns.end();
410   if (I+1 == E)
411     return;
412 
413   // General case: many return statements.
414   // Check that they all have compatible return types.
415 
416   // We require the return types to strictly match here.
417   // Note that we've already done the required promotions as part of
418   // processing the return statement.
419   for (; I != E; ++I) {
420     const ReturnStmt *RS = *I;
421     const Expr *RetE = RS->getRetValue();
422 
423     QualType ReturnType = (RetE ? RetE->getType() : Context.VoidTy);
424     if (Context.hasSameType(ReturnType, CSI.ReturnType))
425       continue;
426 
427     // FIXME: This is a poor diagnostic for ReturnStmts without expressions.
428     // TODO: It's possible that the *first* return is the divergent one.
429     Diag(RS->getLocStart(),
430          diag::err_typecheck_missing_return_type_incompatible)
431       << ReturnType << CSI.ReturnType
432       << isa<LambdaScopeInfo>(CSI);
433     // Continue iterating so that we keep emitting diagnostics.
434   }
435 }
436 
checkInitCapture(SourceLocation Loc,bool ByRef,IdentifierInfo * Id,Expr * InitExpr)437 FieldDecl *Sema::checkInitCapture(SourceLocation Loc, bool ByRef,
438                                   IdentifierInfo *Id, Expr *InitExpr) {
439   LambdaScopeInfo *LSI = getCurLambda();
440 
441   // C++1y [expr.prim.lambda]p11:
442   //   The type of [the] member corresponds to the type of a hypothetical
443   //   variable declaration of the form "auto init-capture;"
444   QualType DeductType = Context.getAutoDeductType();
445   TypeLocBuilder TLB;
446   TLB.pushTypeSpec(DeductType).setNameLoc(Loc);
447   if (ByRef) {
448     DeductType = BuildReferenceType(DeductType, true, Loc, Id);
449     assert(!DeductType.isNull() && "can't build reference to auto");
450     TLB.push<ReferenceTypeLoc>(DeductType).setSigilLoc(Loc);
451   }
452   TypeSourceInfo *TSI = TLB.getTypeSourceInfo(Context, DeductType);
453 
454   InitializationKind InitKind = InitializationKind::CreateDefault(Loc);
455   Expr *Init = InitExpr;
456   if (ParenListExpr *Parens = dyn_cast<ParenListExpr>(Init)) {
457     if (Parens->getNumExprs() == 1) {
458       Init = Parens->getExpr(0);
459       InitKind = InitializationKind::CreateDirect(
460           Loc, Parens->getLParenLoc(), Parens->getRParenLoc());
461     } else {
462       // C++1y [dcl.spec.auto]p3:
463       //   In an initializer of the form ( expression-list ), the
464       //   expression-list shall be a single assignment-expression.
465       if (Parens->getNumExprs() == 0)
466         Diag(Parens->getLocStart(), diag::err_init_capture_no_expression)
467           << Id;
468       else if (Parens->getNumExprs() > 1)
469         Diag(Parens->getExpr(1)->getLocStart(),
470              diag::err_init_capture_multiple_expressions)
471           << Id;
472       return 0;
473     }
474   } else if (isa<InitListExpr>(Init))
475     // We do not need to distinguish between direct-list-initialization
476     // and copy-list-initialization here, because we will always deduce
477     // std::initializer_list<T>, and direct- and copy-list-initialization
478     // always behave the same for such a type.
479     // FIXME: We should model whether an '=' was present.
480     InitKind = InitializationKind::CreateDirectList(Loc);
481   else
482     InitKind = InitializationKind::CreateCopy(Loc, Loc);
483   QualType DeducedType;
484   if (DeduceAutoType(TSI, Init, DeducedType) == DAR_Failed) {
485     if (isa<InitListExpr>(Init))
486       Diag(Loc, diag::err_init_capture_deduction_failure_from_init_list)
487           << Id << Init->getSourceRange();
488     else
489       Diag(Loc, diag::err_init_capture_deduction_failure)
490           << Id << Init->getType() << Init->getSourceRange();
491   }
492   if (DeducedType.isNull())
493     return 0;
494 
495   //   [...] a non-static data member named by the identifier is declared in
496   //   the closure type. This member is not a bit-field and not mutable.
497   // Core issue: the member is (probably...) public.
498   FieldDecl *NewFD = CheckFieldDecl(
499       Id, DeducedType, TSI, LSI->Lambda,
500       Loc, /*Mutable*/ false, /*BitWidth*/ 0, ICIS_NoInit,
501       Loc, AS_public, /*PrevDecl*/ 0, /*Declarator*/ 0);
502   LSI->Lambda->addDecl(NewFD);
503 
504   if (CurContext->isDependentContext()) {
505     LSI->addInitCapture(NewFD, InitExpr);
506   } else {
507     InitializedEntity Entity = InitializedEntity::InitializeMember(NewFD);
508     InitializationSequence InitSeq(*this, Entity, InitKind, Init);
509     if (!InitSeq.Diagnose(*this, Entity, InitKind, Init)) {
510       ExprResult InitResult = InitSeq.Perform(*this, Entity, InitKind, Init);
511       if (!InitResult.isInvalid())
512         LSI->addInitCapture(NewFD, InitResult.take());
513     }
514   }
515 
516   return NewFD;
517 }
518 
ActOnStartOfLambdaDefinition(LambdaIntroducer & Intro,Declarator & ParamInfo,Scope * CurScope)519 void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
520                                         Declarator &ParamInfo,
521                                         Scope *CurScope) {
522   // Determine if we're within a context where we know that the lambda will
523   // be dependent, because there are template parameters in scope.
524   bool KnownDependent = false;
525   if (Scope *TmplScope = CurScope->getTemplateParamParent())
526     if (!TmplScope->decl_empty())
527       KnownDependent = true;
528 
529   // Determine the signature of the call operator.
530   TypeSourceInfo *MethodTyInfo;
531   bool ExplicitParams = true;
532   bool ExplicitResultType = true;
533   bool ContainsUnexpandedParameterPack = false;
534   SourceLocation EndLoc;
535   SmallVector<ParmVarDecl *, 8> Params;
536   if (ParamInfo.getNumTypeObjects() == 0) {
537     // C++11 [expr.prim.lambda]p4:
538     //   If a lambda-expression does not include a lambda-declarator, it is as
539     //   if the lambda-declarator were ().
540     FunctionProtoType::ExtProtoInfo EPI;
541     EPI.HasTrailingReturn = true;
542     EPI.TypeQuals |= DeclSpec::TQ_const;
543     QualType MethodTy = Context.getFunctionType(Context.DependentTy, None,
544                                                 EPI);
545     MethodTyInfo = Context.getTrivialTypeSourceInfo(MethodTy);
546     ExplicitParams = false;
547     ExplicitResultType = false;
548     EndLoc = Intro.Range.getEnd();
549   } else {
550     assert(ParamInfo.isFunctionDeclarator() &&
551            "lambda-declarator is a function");
552     DeclaratorChunk::FunctionTypeInfo &FTI = ParamInfo.getFunctionTypeInfo();
553 
554     // C++11 [expr.prim.lambda]p5:
555     //   This function call operator is declared const (9.3.1) if and only if
556     //   the lambda-expression's parameter-declaration-clause is not followed
557     //   by mutable. It is neither virtual nor declared volatile. [...]
558     if (!FTI.hasMutableQualifier())
559       FTI.TypeQuals |= DeclSpec::TQ_const;
560 
561     MethodTyInfo = GetTypeForDeclarator(ParamInfo, CurScope);
562     assert(MethodTyInfo && "no type from lambda-declarator");
563     EndLoc = ParamInfo.getSourceRange().getEnd();
564 
565     ExplicitResultType
566       = MethodTyInfo->getType()->getAs<FunctionType>()->getResultType()
567                                                         != Context.DependentTy;
568 
569     if (FTI.NumArgs == 1 && !FTI.isVariadic && FTI.ArgInfo[0].Ident == 0 &&
570         cast<ParmVarDecl>(FTI.ArgInfo[0].Param)->getType()->isVoidType()) {
571       // Empty arg list, don't push any params.
572       checkVoidParamDecl(cast<ParmVarDecl>(FTI.ArgInfo[0].Param));
573     } else {
574       Params.reserve(FTI.NumArgs);
575       for (unsigned i = 0, e = FTI.NumArgs; i != e; ++i)
576         Params.push_back(cast<ParmVarDecl>(FTI.ArgInfo[i].Param));
577     }
578 
579     // Check for unexpanded parameter packs in the method type.
580     if (MethodTyInfo->getType()->containsUnexpandedParameterPack())
581       ContainsUnexpandedParameterPack = true;
582   }
583 
584   CXXRecordDecl *Class = createLambdaClosureType(Intro.Range, MethodTyInfo,
585                                                  KnownDependent);
586 
587   CXXMethodDecl *Method = startLambdaDefinition(Class, Intro.Range,
588                                                 MethodTyInfo, EndLoc, Params);
589 
590   if (ExplicitParams)
591     CheckCXXDefaultArguments(Method);
592 
593   // Attributes on the lambda apply to the method.
594   ProcessDeclAttributes(CurScope, Method, ParamInfo);
595 
596   // Introduce the function call operator as the current declaration context.
597   PushDeclContext(CurScope, Method);
598 
599   // Introduce the lambda scope.
600   LambdaScopeInfo *LSI
601     = enterLambdaScope(Method, Intro.Range, Intro.Default, ExplicitParams,
602                        ExplicitResultType,
603                        !Method->isConst());
604 
605   // Distinct capture names, for diagnostics.
606   llvm::SmallSet<IdentifierInfo*, 8> CaptureNames;
607 
608   // Handle explicit captures.
609   SourceLocation PrevCaptureLoc
610     = Intro.Default == LCD_None? Intro.Range.getBegin() : Intro.DefaultLoc;
611   for (SmallVectorImpl<LambdaCapture>::const_iterator
612          C = Intro.Captures.begin(),
613          E = Intro.Captures.end();
614        C != E;
615        PrevCaptureLoc = C->Loc, ++C) {
616     if (C->Kind == LCK_This) {
617       // C++11 [expr.prim.lambda]p8:
618       //   An identifier or this shall not appear more than once in a
619       //   lambda-capture.
620       if (LSI->isCXXThisCaptured()) {
621         Diag(C->Loc, diag::err_capture_more_than_once)
622           << "'this'"
623           << SourceRange(LSI->getCXXThisCapture().getLocation())
624           << FixItHint::CreateRemoval(
625                SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc));
626         continue;
627       }
628 
629       // C++11 [expr.prim.lambda]p8:
630       //   If a lambda-capture includes a capture-default that is =, the
631       //   lambda-capture shall not contain this [...].
632       if (Intro.Default == LCD_ByCopy) {
633         Diag(C->Loc, diag::err_this_capture_with_copy_default)
634           << FixItHint::CreateRemoval(
635                SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc));
636         continue;
637       }
638 
639       // C++11 [expr.prim.lambda]p12:
640       //   If this is captured by a local lambda expression, its nearest
641       //   enclosing function shall be a non-static member function.
642       QualType ThisCaptureType = getCurrentThisType();
643       if (ThisCaptureType.isNull()) {
644         Diag(C->Loc, diag::err_this_capture) << true;
645         continue;
646       }
647 
648       CheckCXXThisCapture(C->Loc, /*Explicit=*/true);
649       continue;
650     }
651 
652     assert(C->Id && "missing identifier for capture");
653 
654     if (C->Init.isInvalid())
655       continue;
656     if (C->Init.isUsable()) {
657       // C++11 [expr.prim.lambda]p8:
658       //   An identifier or this shall not appear more than once in a
659       //   lambda-capture.
660       if (!CaptureNames.insert(C->Id))
661         Diag(C->Loc, diag::err_capture_more_than_once) << C->Id;
662 
663       if (C->Init.get()->containsUnexpandedParameterPack())
664         ContainsUnexpandedParameterPack = true;
665 
666       FieldDecl *NewFD = checkInitCapture(C->Loc, C->Kind == LCK_ByRef,
667                                           C->Id, C->Init.take());
668       // C++1y [expr.prim.lambda]p11:
669       //   Within the lambda-expression's lambda-declarator and
670       //   compound-statement, the identifier in the init-capture
671       //   hides any declaration of the same name in scopes enclosing
672       //   the lambda-expression.
673       if (NewFD)
674         PushOnScopeChains(NewFD, CurScope, false);
675       continue;
676     }
677 
678     // C++11 [expr.prim.lambda]p8:
679     //   If a lambda-capture includes a capture-default that is &, the
680     //   identifiers in the lambda-capture shall not be preceded by &.
681     //   If a lambda-capture includes a capture-default that is =, [...]
682     //   each identifier it contains shall be preceded by &.
683     if (C->Kind == LCK_ByRef && Intro.Default == LCD_ByRef) {
684       Diag(C->Loc, diag::err_reference_capture_with_reference_default)
685         << FixItHint::CreateRemoval(
686              SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc));
687       continue;
688     } else if (C->Kind == LCK_ByCopy && Intro.Default == LCD_ByCopy) {
689       Diag(C->Loc, diag::err_copy_capture_with_copy_default)
690         << FixItHint::CreateRemoval(
691              SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc));
692       continue;
693     }
694 
695     // C++11 [expr.prim.lambda]p10:
696     //   The identifiers in a capture-list are looked up using the usual
697     //   rules for unqualified name lookup (3.4.1)
698     DeclarationNameInfo Name(C->Id, C->Loc);
699     LookupResult R(*this, Name, LookupOrdinaryName);
700     LookupName(R, CurScope);
701     if (R.isAmbiguous())
702       continue;
703     if (R.empty()) {
704       // FIXME: Disable corrections that would add qualification?
705       CXXScopeSpec ScopeSpec;
706       DeclFilterCCC<VarDecl> Validator;
707       if (DiagnoseEmptyLookup(CurScope, ScopeSpec, R, Validator))
708         continue;
709     }
710 
711     VarDecl *Var = R.getAsSingle<VarDecl>();
712 
713     // C++11 [expr.prim.lambda]p8:
714     //   An identifier or this shall not appear more than once in a
715     //   lambda-capture.
716     if (!CaptureNames.insert(C->Id)) {
717       if (Var && LSI->isCaptured(Var)) {
718         Diag(C->Loc, diag::err_capture_more_than_once)
719           << C->Id << SourceRange(LSI->getCapture(Var).getLocation())
720           << FixItHint::CreateRemoval(
721                SourceRange(PP.getLocForEndOfToken(PrevCaptureLoc), C->Loc));
722       } else
723         // Previous capture was an init-capture: no fixit.
724         Diag(C->Loc, diag::err_capture_more_than_once) << C->Id;
725       continue;
726     }
727 
728     // C++11 [expr.prim.lambda]p10:
729     //   [...] each such lookup shall find a variable with automatic storage
730     //   duration declared in the reaching scope of the local lambda expression.
731     // Note that the 'reaching scope' check happens in tryCaptureVariable().
732     if (!Var) {
733       Diag(C->Loc, diag::err_capture_does_not_name_variable) << C->Id;
734       continue;
735     }
736 
737     // Ignore invalid decls; they'll just confuse the code later.
738     if (Var->isInvalidDecl())
739       continue;
740 
741     if (!Var->hasLocalStorage()) {
742       Diag(C->Loc, diag::err_capture_non_automatic_variable) << C->Id;
743       Diag(Var->getLocation(), diag::note_previous_decl) << C->Id;
744       continue;
745     }
746 
747     // C++11 [expr.prim.lambda]p23:
748     //   A capture followed by an ellipsis is a pack expansion (14.5.3).
749     SourceLocation EllipsisLoc;
750     if (C->EllipsisLoc.isValid()) {
751       if (Var->isParameterPack()) {
752         EllipsisLoc = C->EllipsisLoc;
753       } else {
754         Diag(C->EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
755           << SourceRange(C->Loc);
756 
757         // Just ignore the ellipsis.
758       }
759     } else if (Var->isParameterPack()) {
760       ContainsUnexpandedParameterPack = true;
761     }
762 
763     TryCaptureKind Kind = C->Kind == LCK_ByRef ? TryCapture_ExplicitByRef :
764                                                  TryCapture_ExplicitByVal;
765     tryCaptureVariable(Var, C->Loc, Kind, EllipsisLoc);
766   }
767   finishLambdaExplicitCaptures(LSI);
768 
769   LSI->ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
770 
771   // Add lambda parameters into scope.
772   addLambdaParameters(Method, CurScope);
773 
774   // Enter a new evaluation context to insulate the lambda from any
775   // cleanups from the enclosing full-expression.
776   PushExpressionEvaluationContext(PotentiallyEvaluated);
777 }
778 
ActOnLambdaError(SourceLocation StartLoc,Scope * CurScope,bool IsInstantiation)779 void Sema::ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope,
780                             bool IsInstantiation) {
781   // Leave the expression-evaluation context.
782   DiscardCleanupsInEvaluationContext();
783   PopExpressionEvaluationContext();
784 
785   // Leave the context of the lambda.
786   if (!IsInstantiation)
787     PopDeclContext();
788 
789   // Finalize the lambda.
790   LambdaScopeInfo *LSI = getCurLambda();
791   CXXRecordDecl *Class = LSI->Lambda;
792   Class->setInvalidDecl();
793   SmallVector<Decl*, 4> Fields;
794   for (RecordDecl::field_iterator i = Class->field_begin(),
795                                   e = Class->field_end(); i != e; ++i)
796     Fields.push_back(*i);
797   ActOnFields(0, Class->getLocation(), Class, Fields,
798               SourceLocation(), SourceLocation(), 0);
799   CheckCompletedCXXClass(Class);
800 
801   PopFunctionScopeInfo();
802 }
803 
804 /// \brief Add a lambda's conversion to function pointer, as described in
805 /// C++11 [expr.prim.lambda]p6.
addFunctionPointerConversion(Sema & S,SourceRange IntroducerRange,CXXRecordDecl * Class,CXXMethodDecl * CallOperator)806 static void addFunctionPointerConversion(Sema &S,
807                                          SourceRange IntroducerRange,
808                                          CXXRecordDecl *Class,
809                                          CXXMethodDecl *CallOperator) {
810   // Add the conversion to function pointer.
811   const FunctionProtoType *Proto
812     = CallOperator->getType()->getAs<FunctionProtoType>();
813   QualType FunctionPtrTy;
814   QualType FunctionTy;
815   {
816     FunctionProtoType::ExtProtoInfo ExtInfo = Proto->getExtProtoInfo();
817     ExtInfo.TypeQuals = 0;
818     FunctionTy = S.Context.getFunctionType(Proto->getResultType(),
819                                            Proto->getArgTypes(), ExtInfo);
820     FunctionPtrTy = S.Context.getPointerType(FunctionTy);
821   }
822 
823   FunctionProtoType::ExtProtoInfo ExtInfo;
824   ExtInfo.TypeQuals = Qualifiers::Const;
825   QualType ConvTy =
826     S.Context.getFunctionType(FunctionPtrTy, None, ExtInfo);
827 
828   SourceLocation Loc = IntroducerRange.getBegin();
829   DeclarationName Name
830     = S.Context.DeclarationNames.getCXXConversionFunctionName(
831         S.Context.getCanonicalType(FunctionPtrTy));
832   DeclarationNameLoc NameLoc;
833   NameLoc.NamedType.TInfo = S.Context.getTrivialTypeSourceInfo(FunctionPtrTy,
834                                                                Loc);
835   CXXConversionDecl *Conversion
836     = CXXConversionDecl::Create(S.Context, Class, Loc,
837                                 DeclarationNameInfo(Name, Loc, NameLoc),
838                                 ConvTy,
839                                 S.Context.getTrivialTypeSourceInfo(ConvTy,
840                                                                    Loc),
841                                 /*isInline=*/true, /*isExplicit=*/false,
842                                 /*isConstexpr=*/false,
843                                 CallOperator->getBody()->getLocEnd());
844   Conversion->setAccess(AS_public);
845   Conversion->setImplicit(true);
846   Class->addDecl(Conversion);
847 
848   // Add a non-static member function "__invoke" that will be the result of
849   // the conversion.
850   Name = &S.Context.Idents.get("__invoke");
851   CXXMethodDecl *Invoke
852     = CXXMethodDecl::Create(S.Context, Class, Loc,
853                             DeclarationNameInfo(Name, Loc), FunctionTy,
854                             CallOperator->getTypeSourceInfo(),
855                             SC_Static, /*IsInline=*/true,
856                             /*IsConstexpr=*/false,
857                             CallOperator->getBody()->getLocEnd());
858   SmallVector<ParmVarDecl *, 4> InvokeParams;
859   for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I) {
860     ParmVarDecl *From = CallOperator->getParamDecl(I);
861     InvokeParams.push_back(ParmVarDecl::Create(S.Context, Invoke,
862                                                From->getLocStart(),
863                                                From->getLocation(),
864                                                From->getIdentifier(),
865                                                From->getType(),
866                                                From->getTypeSourceInfo(),
867                                                From->getStorageClass(),
868                                                /*DefaultArg=*/0));
869   }
870   Invoke->setParams(InvokeParams);
871   Invoke->setAccess(AS_private);
872   Invoke->setImplicit(true);
873   Class->addDecl(Invoke);
874 }
875 
876 /// \brief Add a lambda's conversion to block pointer.
addBlockPointerConversion(Sema & S,SourceRange IntroducerRange,CXXRecordDecl * Class,CXXMethodDecl * CallOperator)877 static void addBlockPointerConversion(Sema &S,
878                                       SourceRange IntroducerRange,
879                                       CXXRecordDecl *Class,
880                                       CXXMethodDecl *CallOperator) {
881   const FunctionProtoType *Proto
882     = CallOperator->getType()->getAs<FunctionProtoType>();
883   QualType BlockPtrTy;
884   {
885     FunctionProtoType::ExtProtoInfo ExtInfo = Proto->getExtProtoInfo();
886     ExtInfo.TypeQuals = 0;
887     QualType FunctionTy = S.Context.getFunctionType(
888         Proto->getResultType(), Proto->getArgTypes(), ExtInfo);
889     BlockPtrTy = S.Context.getBlockPointerType(FunctionTy);
890   }
891 
892   FunctionProtoType::ExtProtoInfo ExtInfo;
893   ExtInfo.TypeQuals = Qualifiers::Const;
894   QualType ConvTy = S.Context.getFunctionType(BlockPtrTy, None, ExtInfo);
895 
896   SourceLocation Loc = IntroducerRange.getBegin();
897   DeclarationName Name
898     = S.Context.DeclarationNames.getCXXConversionFunctionName(
899         S.Context.getCanonicalType(BlockPtrTy));
900   DeclarationNameLoc NameLoc;
901   NameLoc.NamedType.TInfo = S.Context.getTrivialTypeSourceInfo(BlockPtrTy, Loc);
902   CXXConversionDecl *Conversion
903     = CXXConversionDecl::Create(S.Context, Class, Loc,
904                                 DeclarationNameInfo(Name, Loc, NameLoc),
905                                 ConvTy,
906                                 S.Context.getTrivialTypeSourceInfo(ConvTy, Loc),
907                                 /*isInline=*/true, /*isExplicit=*/false,
908                                 /*isConstexpr=*/false,
909                                 CallOperator->getBody()->getLocEnd());
910   Conversion->setAccess(AS_public);
911   Conversion->setImplicit(true);
912   Class->addDecl(Conversion);
913 }
914 
ActOnLambdaExpr(SourceLocation StartLoc,Stmt * Body,Scope * CurScope,bool IsInstantiation)915 ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body,
916                                  Scope *CurScope,
917                                  bool IsInstantiation) {
918   // Collect information from the lambda scope.
919   SmallVector<LambdaExpr::Capture, 4> Captures;
920   SmallVector<Expr *, 4> CaptureInits;
921   LambdaCaptureDefault CaptureDefault;
922   CXXRecordDecl *Class;
923   CXXMethodDecl *CallOperator;
924   SourceRange IntroducerRange;
925   bool ExplicitParams;
926   bool ExplicitResultType;
927   bool LambdaExprNeedsCleanups;
928   bool ContainsUnexpandedParameterPack;
929   SmallVector<VarDecl *, 4> ArrayIndexVars;
930   SmallVector<unsigned, 4> ArrayIndexStarts;
931   {
932     LambdaScopeInfo *LSI = getCurLambda();
933     CallOperator = LSI->CallOperator;
934     Class = LSI->Lambda;
935     IntroducerRange = LSI->IntroducerRange;
936     ExplicitParams = LSI->ExplicitParams;
937     ExplicitResultType = !LSI->HasImplicitReturnType;
938     LambdaExprNeedsCleanups = LSI->ExprNeedsCleanups;
939     ContainsUnexpandedParameterPack = LSI->ContainsUnexpandedParameterPack;
940     ArrayIndexVars.swap(LSI->ArrayIndexVars);
941     ArrayIndexStarts.swap(LSI->ArrayIndexStarts);
942 
943     // Translate captures.
944     for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) {
945       LambdaScopeInfo::Capture From = LSI->Captures[I];
946       assert(!From.isBlockCapture() && "Cannot capture __block variables");
947       bool IsImplicit = I >= LSI->NumExplicitCaptures;
948 
949       // Handle 'this' capture.
950       if (From.isThisCapture()) {
951         Captures.push_back(LambdaExpr::Capture(From.getLocation(),
952                                                IsImplicit,
953                                                LCK_This));
954         CaptureInits.push_back(new (Context) CXXThisExpr(From.getLocation(),
955                                                          getCurrentThisType(),
956                                                          /*isImplicit=*/true));
957         continue;
958       }
959 
960       if (From.isInitCapture()) {
961         Captures.push_back(LambdaExpr::Capture(From.getInitCaptureField()));
962         CaptureInits.push_back(From.getInitExpr());
963         continue;
964       }
965 
966       VarDecl *Var = From.getVariable();
967       LambdaCaptureKind Kind = From.isCopyCapture()? LCK_ByCopy : LCK_ByRef;
968       Captures.push_back(LambdaExpr::Capture(From.getLocation(), IsImplicit,
969                                              Kind, Var, From.getEllipsisLoc()));
970       CaptureInits.push_back(From.getInitExpr());
971     }
972 
973     switch (LSI->ImpCaptureStyle) {
974     case CapturingScopeInfo::ImpCap_None:
975       CaptureDefault = LCD_None;
976       break;
977 
978     case CapturingScopeInfo::ImpCap_LambdaByval:
979       CaptureDefault = LCD_ByCopy;
980       break;
981 
982     case CapturingScopeInfo::ImpCap_CapturedRegion:
983     case CapturingScopeInfo::ImpCap_LambdaByref:
984       CaptureDefault = LCD_ByRef;
985       break;
986 
987     case CapturingScopeInfo::ImpCap_Block:
988       llvm_unreachable("block capture in lambda");
989       break;
990     }
991 
992     // C++11 [expr.prim.lambda]p4:
993     //   If a lambda-expression does not include a
994     //   trailing-return-type, it is as if the trailing-return-type
995     //   denotes the following type:
996     // FIXME: Assumes current resolution to core issue 975.
997     if (LSI->HasImplicitReturnType) {
998       deduceClosureReturnType(*LSI);
999 
1000       //   - if there are no return statements in the
1001       //     compound-statement, or all return statements return
1002       //     either an expression of type void or no expression or
1003       //     braced-init-list, the type void;
1004       if (LSI->ReturnType.isNull()) {
1005         LSI->ReturnType = Context.VoidTy;
1006       }
1007 
1008       // Create a function type with the inferred return type.
1009       const FunctionProtoType *Proto
1010         = CallOperator->getType()->getAs<FunctionProtoType>();
1011       QualType FunctionTy = Context.getFunctionType(
1012           LSI->ReturnType, Proto->getArgTypes(), Proto->getExtProtoInfo());
1013       CallOperator->setType(FunctionTy);
1014     }
1015 
1016     // C++ [expr.prim.lambda]p7:
1017     //   The lambda-expression's compound-statement yields the
1018     //   function-body (8.4) of the function call operator [...].
1019     ActOnFinishFunctionBody(CallOperator, Body, IsInstantiation);
1020     CallOperator->setLexicalDeclContext(Class);
1021     Class->addDecl(CallOperator);
1022     PopExpressionEvaluationContext();
1023 
1024     // C++11 [expr.prim.lambda]p6:
1025     //   The closure type for a lambda-expression with no lambda-capture
1026     //   has a public non-virtual non-explicit const conversion function
1027     //   to pointer to function having the same parameter and return
1028     //   types as the closure type's function call operator.
1029     if (Captures.empty() && CaptureDefault == LCD_None)
1030       addFunctionPointerConversion(*this, IntroducerRange, Class,
1031                                    CallOperator);
1032 
1033     // Objective-C++:
1034     //   The closure type for a lambda-expression has a public non-virtual
1035     //   non-explicit const conversion function to a block pointer having the
1036     //   same parameter and return types as the closure type's function call
1037     //   operator.
1038     if (getLangOpts().Blocks && getLangOpts().ObjC1)
1039       addBlockPointerConversion(*this, IntroducerRange, Class, CallOperator);
1040 
1041     // Finalize the lambda class.
1042     SmallVector<Decl*, 4> Fields;
1043     for (RecordDecl::field_iterator i = Class->field_begin(),
1044                                     e = Class->field_end(); i != e; ++i)
1045       Fields.push_back(*i);
1046     ActOnFields(0, Class->getLocation(), Class, Fields,
1047                 SourceLocation(), SourceLocation(), 0);
1048     CheckCompletedCXXClass(Class);
1049   }
1050 
1051   if (LambdaExprNeedsCleanups)
1052     ExprNeedsCleanups = true;
1053 
1054   LambdaExpr *Lambda = LambdaExpr::Create(Context, Class, IntroducerRange,
1055                                           CaptureDefault, Captures,
1056                                           ExplicitParams, ExplicitResultType,
1057                                           CaptureInits, ArrayIndexVars,
1058                                           ArrayIndexStarts, Body->getLocEnd(),
1059                                           ContainsUnexpandedParameterPack);
1060 
1061   // C++11 [expr.prim.lambda]p2:
1062   //   A lambda-expression shall not appear in an unevaluated operand
1063   //   (Clause 5).
1064   if (!CurContext->isDependentContext()) {
1065     switch (ExprEvalContexts.back().Context) {
1066     case Unevaluated:
1067     case UnevaluatedAbstract:
1068       // We don't actually diagnose this case immediately, because we
1069       // could be within a context where we might find out later that
1070       // the expression is potentially evaluated (e.g., for typeid).
1071       ExprEvalContexts.back().Lambdas.push_back(Lambda);
1072       break;
1073 
1074     case ConstantEvaluated:
1075     case PotentiallyEvaluated:
1076     case PotentiallyEvaluatedIfUsed:
1077       break;
1078     }
1079   }
1080 
1081   return MaybeBindToTemporary(Lambda);
1082 }
1083 
BuildBlockForLambdaConversion(SourceLocation CurrentLocation,SourceLocation ConvLocation,CXXConversionDecl * Conv,Expr * Src)1084 ExprResult Sema::BuildBlockForLambdaConversion(SourceLocation CurrentLocation,
1085                                                SourceLocation ConvLocation,
1086                                                CXXConversionDecl *Conv,
1087                                                Expr *Src) {
1088   // Make sure that the lambda call operator is marked used.
1089   CXXRecordDecl *Lambda = Conv->getParent();
1090   CXXMethodDecl *CallOperator
1091     = cast<CXXMethodDecl>(
1092         Lambda->lookup(
1093           Context.DeclarationNames.getCXXOperatorName(OO_Call)).front());
1094   CallOperator->setReferenced();
1095   CallOperator->setUsed();
1096 
1097   ExprResult Init = PerformCopyInitialization(
1098                       InitializedEntity::InitializeBlock(ConvLocation,
1099                                                          Src->getType(),
1100                                                          /*NRVO=*/false),
1101                       CurrentLocation, Src);
1102   if (!Init.isInvalid())
1103     Init = ActOnFinishFullExpr(Init.take());
1104 
1105   if (Init.isInvalid())
1106     return ExprError();
1107 
1108   // Create the new block to be returned.
1109   BlockDecl *Block = BlockDecl::Create(Context, CurContext, ConvLocation);
1110 
1111   // Set the type information.
1112   Block->setSignatureAsWritten(CallOperator->getTypeSourceInfo());
1113   Block->setIsVariadic(CallOperator->isVariadic());
1114   Block->setBlockMissingReturnType(false);
1115 
1116   // Add parameters.
1117   SmallVector<ParmVarDecl *, 4> BlockParams;
1118   for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I) {
1119     ParmVarDecl *From = CallOperator->getParamDecl(I);
1120     BlockParams.push_back(ParmVarDecl::Create(Context, Block,
1121                                               From->getLocStart(),
1122                                               From->getLocation(),
1123                                               From->getIdentifier(),
1124                                               From->getType(),
1125                                               From->getTypeSourceInfo(),
1126                                               From->getStorageClass(),
1127                                               /*DefaultArg=*/0));
1128   }
1129   Block->setParams(BlockParams);
1130 
1131   Block->setIsConversionFromLambda(true);
1132 
1133   // Add capture. The capture uses a fake variable, which doesn't correspond
1134   // to any actual memory location. However, the initializer copy-initializes
1135   // the lambda object.
1136   TypeSourceInfo *CapVarTSI =
1137       Context.getTrivialTypeSourceInfo(Src->getType());
1138   VarDecl *CapVar = VarDecl::Create(Context, Block, ConvLocation,
1139                                     ConvLocation, 0,
1140                                     Src->getType(), CapVarTSI,
1141                                     SC_None);
1142   BlockDecl::Capture Capture(/*Variable=*/CapVar, /*ByRef=*/false,
1143                              /*Nested=*/false, /*Copy=*/Init.take());
1144   Block->setCaptures(Context, &Capture, &Capture + 1,
1145                      /*CapturesCXXThis=*/false);
1146 
1147   // Add a fake function body to the block. IR generation is responsible
1148   // for filling in the actual body, which cannot be expressed as an AST.
1149   Block->setBody(new (Context) CompoundStmt(ConvLocation));
1150 
1151   // Create the block literal expression.
1152   Expr *BuildBlock = new (Context) BlockExpr(Block, Conv->getConversionType());
1153   ExprCleanupObjects.push_back(Block);
1154   ExprNeedsCleanups = true;
1155 
1156   return BuildBlock;
1157 }
1158