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