SemaLambda.cpp revision e2c5913c48f66bfec9e58a8ad1d90e5eeffad586
1//===--- SemaLambda.cpp - Semantic Analysis for C++11 Lambdas -------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file implements semantic analysis for C++ lambda expressions.
11//
12//===----------------------------------------------------------------------===//
13#include "clang/Sema/DeclSpec.h"
14#include "clang/Sema/Initialization.h"
15#include "clang/Sema/Lookup.h"
16#include "clang/Sema/ScopeInfo.h"
17#include "clang/Sema/SemaInternal.h"
18#include "clang/AST/ExprCXX.h"
19using namespace clang;
20using namespace sema;
21
22void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
23                                        Declarator &ParamInfo,
24                                        Scope *CurScope) {
25  DeclContext *DC = CurContext;
26  while (!(DC->isFunctionOrMethod() || DC->isRecord() || DC->isFileContext()))
27    DC = DC->getParent();
28
29  // Start constructing the lambda class.
30  CXXRecordDecl *Class = CXXRecordDecl::Create(Context, TTK_Class, DC,
31                                               Intro.Range.getBegin(),
32                                               /*IdLoc=*/Intro.Range.getBegin(),
33                                               /*Id=*/0);
34  Class->startDefinition();
35  Class->setLambda(true);
36  CurContext->addDecl(Class);
37
38  // Build the call operator; we don't really have all the relevant information
39  // at this point, but we need something to attach child declarations to.
40  QualType MethodTy;
41  TypeSourceInfo *MethodTyInfo;
42  bool ExplicitParams = true;
43  SourceLocation EndLoc;
44  if (ParamInfo.getNumTypeObjects() == 0) {
45    // C++11 [expr.prim.lambda]p4:
46    //   If a lambda-expression does not include a lambda-declarator, it is as
47    //   if the lambda-declarator were ().
48    FunctionProtoType::ExtProtoInfo EPI;
49    EPI.TypeQuals |= DeclSpec::TQ_const;
50    MethodTy = Context.getFunctionType(Context.DependentTy,
51                                       /*Args=*/0, /*NumArgs=*/0, EPI);
52    MethodTyInfo = Context.getTrivialTypeSourceInfo(MethodTy);
53    ExplicitParams = false;
54    EndLoc = Intro.Range.getEnd();
55  } else {
56    assert(ParamInfo.isFunctionDeclarator() &&
57           "lambda-declarator is a function");
58    DeclaratorChunk::FunctionTypeInfo &FTI = ParamInfo.getFunctionTypeInfo();
59
60    // C++11 [expr.prim.lambda]p5:
61    //   This function call operator is declared const (9.3.1) if and only if
62    //   the lambda-expression's parameter-declaration-clause is not followed
63    //   by mutable. It is neither virtual nor declared volatile. [...]
64    if (!FTI.hasMutableQualifier())
65      FTI.TypeQuals |= DeclSpec::TQ_const;
66
67    // C++11 [expr.prim.lambda]p5:
68    //   [...] Default arguments (8.3.6) shall not be specified in the
69    //   parameter-declaration-clause of a lambda-declarator.
70    CheckExtraCXXDefaultArguments(ParamInfo);
71
72    MethodTyInfo = GetTypeForDeclarator(ParamInfo, CurScope);
73    // FIXME: Can these asserts actually fail?
74    assert(MethodTyInfo && "no type from lambda-declarator");
75    MethodTy = MethodTyInfo->getType();
76    assert(!MethodTy.isNull() && "no type from lambda declarator");
77    EndLoc = ParamInfo.getSourceRange().getEnd();
78  }
79
80  // C++11 [expr.prim.lambda]p5:
81  //   The closure type for a lambda-expression has a public inline function
82  //   call operator (13.5.4) whose parameters and return type are described by
83  //   the lambda-expression's parameter-declaration-clause and
84  //   trailing-return-type respectively.
85  DeclarationName MethodName
86    = Context.DeclarationNames.getCXXOperatorName(OO_Call);
87  DeclarationNameLoc MethodNameLoc;
88  MethodNameLoc.CXXOperatorName.BeginOpNameLoc
89    = Intro.Range.getBegin().getRawEncoding();
90  MethodNameLoc.CXXOperatorName.EndOpNameLoc
91    = Intro.Range.getEnd().getRawEncoding();
92  CXXMethodDecl *Method
93    = CXXMethodDecl::Create(Context, Class, EndLoc,
94                            DeclarationNameInfo(MethodName,
95                                                Intro.Range.getBegin(),
96                                                MethodNameLoc),
97                            MethodTy, MethodTyInfo,
98                            /*isStatic=*/false,
99                            SC_None,
100                            /*isInline=*/true,
101                            /*isConstExpr=*/false,
102                            EndLoc);
103  Method->setAccess(AS_public);
104  Class->addDecl(Method);
105  Method->setLexicalDeclContext(DC); // FIXME: Minor hack.
106
107  // Attributes on the lambda apply to the method.
108  ProcessDeclAttributes(CurScope, Method, ParamInfo);
109
110  // Introduce the function call operator as the current declaration context.
111  PushDeclContext(CurScope, Method);
112
113  // Introduce the lambda scope.
114  PushLambdaScope(Class, Method);
115  LambdaScopeInfo *LSI = getCurLambda();
116  if (Intro.Default == LCD_ByCopy)
117    LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByval;
118  else if (Intro.Default == LCD_ByRef)
119    LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByref;
120  LSI->IntroducerRange = Intro.Range;
121  LSI->ExplicitParams = ExplicitParams;
122  LSI->Mutable = (Method->getTypeQualifiers() & Qualifiers::Const) == 0;
123
124  // Handle explicit captures.
125  for (llvm::SmallVector<LambdaCapture, 4>::const_iterator
126         C = Intro.Captures.begin(),
127         E = Intro.Captures.end();
128       C != E; ++C) {
129    if (C->Kind == LCK_This) {
130      // C++11 [expr.prim.lambda]p8:
131      //   An identifier or this shall not appear more than once in a
132      //   lambda-capture.
133      if (LSI->isCXXThisCaptured()) {
134        Diag(C->Loc, diag::err_capture_more_than_once)
135          << "'this'"
136          << SourceRange(LSI->getCXXThisCapture().getLocation());
137        continue;
138      }
139
140      // C++11 [expr.prim.lambda]p8:
141      //   If a lambda-capture includes a capture-default that is =, the
142      //   lambda-capture shall not contain this [...].
143      if (Intro.Default == LCD_ByCopy) {
144        Diag(C->Loc, diag::err_this_capture_with_copy_default);
145        continue;
146      }
147
148      // C++11 [expr.prim.lambda]p12:
149      //   If this is captured by a local lambda expression, its nearest
150      //   enclosing function shall be a non-static member function.
151      QualType ThisCaptureType = getCurrentThisType();
152      if (ThisCaptureType.isNull()) {
153        Diag(C->Loc, diag::err_this_capture) << true;
154        continue;
155      }
156
157      CheckCXXThisCapture(C->Loc, /*Explicit=*/true);
158      continue;
159    }
160
161    assert(C->Id && "missing identifier for capture");
162
163    // C++11 [expr.prim.lambda]p8:
164    //   If a lambda-capture includes a capture-default that is &, the
165    //   identifiers in the lambda-capture shall not be preceded by &.
166    //   If a lambda-capture includes a capture-default that is =, [...]
167    //   each identifier it contains shall be preceded by &.
168    if (C->Kind == LCK_ByRef && Intro.Default == LCD_ByRef) {
169      Diag(C->Loc, diag::err_reference_capture_with_reference_default);
170      continue;
171    } else if (C->Kind == LCK_ByCopy && Intro.Default == LCD_ByCopy) {
172      Diag(C->Loc, diag::err_copy_capture_with_copy_default);
173      continue;
174    }
175
176    DeclarationNameInfo Name(C->Id, C->Loc);
177    LookupResult R(*this, Name, LookupOrdinaryName);
178    LookupName(R, CurScope);
179    if (R.isAmbiguous())
180      continue;
181    if (R.empty()) {
182      // FIXME: Disable corrections that would add qualification?
183      CXXScopeSpec ScopeSpec;
184      DeclFilterCCC<VarDecl> Validator;
185      if (DiagnoseEmptyLookup(CurScope, ScopeSpec, R, Validator))
186        continue;
187    }
188
189    // C++11 [expr.prim.lambda]p10:
190    //   The identifiers in a capture-list are looked up using the usual rules
191    //   for unqualified name lookup (3.4.1); each such lookup shall find a
192    //   variable with automatic storage duration declared in the reaching
193    //   scope of the local lambda expression.
194    // FIXME: Check reaching scope.
195    VarDecl *Var = R.getAsSingle<VarDecl>();
196    if (!Var) {
197      Diag(C->Loc, diag::err_capture_does_not_name_variable) << C->Id;
198      continue;
199    }
200
201    if (!Var->hasLocalStorage()) {
202      Diag(C->Loc, diag::err_capture_non_automatic_variable) << C->Id;
203      Diag(Var->getLocation(), diag::note_previous_decl) << C->Id;
204      continue;
205    }
206
207    // C++11 [expr.prim.lambda]p8:
208    //   An identifier or this shall not appear more than once in a
209    //   lambda-capture.
210    if (LSI->isCaptured(Var)) {
211      Diag(C->Loc, diag::err_capture_more_than_once)
212        << C->Id
213        << SourceRange(LSI->getCapture(Var).getLocation());
214      continue;
215    }
216
217    TryCaptureKind Kind = C->Kind == LCK_ByRef ? TryCapture_ExplicitByRef :
218                                                 TryCapture_ExplicitByVal;
219    TryCaptureVar(Var, C->Loc, Kind);
220  }
221  LSI->finishedExplicitCaptures();
222
223  // Set the parameters on the decl, if specified.
224  if (isa<FunctionProtoTypeLoc>(MethodTyInfo->getTypeLoc())) {
225    FunctionProtoTypeLoc Proto =
226    cast<FunctionProtoTypeLoc>(MethodTyInfo->getTypeLoc());
227    Method->setParams(Proto.getParams());
228    CheckParmsForFunctionDef(Method->param_begin(),
229                             Method->param_end(),
230                             /*CheckParameterNames=*/false);
231
232    // Introduce our parameters into the function scope
233    for (unsigned p = 0, NumParams = Method->getNumParams(); p < NumParams; ++p) {
234      ParmVarDecl *Param = Method->getParamDecl(p);
235      Param->setOwningFunction(Method);
236
237      // If this has an identifier, add it to the scope stack.
238      if (Param->getIdentifier()) {
239        CheckShadow(CurScope, Param);
240
241        PushOnScopeChains(Param, CurScope);
242      }
243    }
244  }
245
246  const FunctionType *Fn = MethodTy->getAs<FunctionType>();
247  QualType RetTy = Fn->getResultType();
248  if (RetTy != Context.DependentTy) {
249    LSI->ReturnType = RetTy;
250  } else {
251    LSI->HasImplicitReturnType = true;
252  }
253
254  // FIXME: Check return type is complete, !isObjCObjectType
255
256  // Enter a new evaluation context to insulate the block from any
257  // cleanups from the enclosing full-expression.
258  PushExpressionEvaluationContext(PotentiallyEvaluated);
259}
260
261void Sema::ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope) {
262  // Leave the expression-evaluation context.
263  DiscardCleanupsInEvaluationContext();
264  PopExpressionEvaluationContext();
265
266  // Leave the context of the lambda.
267  PopDeclContext();
268
269  // Finalize the lambda.
270  LambdaScopeInfo *LSI = getCurLambda();
271  CXXRecordDecl *Class = LSI->Lambda;
272  Class->setInvalidDecl();
273  SmallVector<Decl*, 4> Fields(Class->field_begin(), Class->field_end());
274  ActOnFields(0, Class->getLocation(), Class, Fields,
275              SourceLocation(), SourceLocation(), 0);
276  CheckCompletedCXXClass(Class);
277
278  PopFunctionScopeInfo();
279}
280
281ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc,
282                                 Stmt *Body, Scope *CurScope) {
283  // Leave the expression-evaluation context.
284  DiscardCleanupsInEvaluationContext();
285  PopExpressionEvaluationContext();
286
287  // Collect information from the lambda scope.
288  llvm::SmallVector<LambdaExpr::Capture, 4> Captures;
289  llvm::SmallVector<Expr *, 4> CaptureInits;
290  LambdaCaptureDefault CaptureDefault;
291  CXXRecordDecl *Class;
292  SourceRange IntroducerRange;
293  bool ExplicitParams;
294  bool LambdaExprNeedsCleanups;
295  {
296    LambdaScopeInfo *LSI = getCurLambda();
297    Class = LSI->Lambda;
298    IntroducerRange = LSI->IntroducerRange;
299    ExplicitParams = LSI->ExplicitParams;
300    LambdaExprNeedsCleanups = LSI->ExprNeedsCleanups;
301
302    // Translate captures.
303    for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) {
304      LambdaScopeInfo::Capture From = LSI->Captures[I];
305      assert(!From.isBlockCapture() && "Cannot capture __block variables");
306      bool IsImplicit = I >= LSI->NumExplicitCaptures;
307
308      // Handle 'this' capture.
309      if (From.isThisCapture()) {
310        Captures.push_back(LambdaExpr::Capture(From.getLocation(),
311                                               IsImplicit,
312                                               LCK_This));
313        CaptureInits.push_back(new (Context) CXXThisExpr(From.getLocation(),
314                                                         getCurrentThisType(),
315                                                         /*isImplicit=*/true));
316        continue;
317      }
318
319      VarDecl *Var = From.getVariable();
320      // FIXME: Handle pack expansions.
321      LambdaCaptureKind Kind = From.isCopyCapture()? LCK_ByCopy : LCK_ByRef;
322      Captures.push_back(LambdaExpr::Capture(From.getLocation(), IsImplicit,
323                                             Kind, Var));
324      CaptureInits.push_back(From.getCopyExpr());
325    }
326
327    switch (LSI->ImpCaptureStyle) {
328    case CapturingScopeInfo::ImpCap_None:
329      CaptureDefault = LCD_None;
330      break;
331
332    case CapturingScopeInfo::ImpCap_LambdaByval:
333      CaptureDefault = LCD_ByCopy;
334      break;
335
336    case CapturingScopeInfo::ImpCap_LambdaByref:
337      CaptureDefault = LCD_ByRef;
338      break;
339
340    case CapturingScopeInfo::ImpCap_Block:
341      llvm_unreachable("block capture in lambda");
342      break;
343    }
344
345    // Finalize the lambda class.
346    SmallVector<Decl*, 4> Fields(Class->field_begin(), Class->field_end());
347    ActOnFields(0, Class->getLocation(), Class, Fields,
348                SourceLocation(), SourceLocation(), 0);
349    CheckCompletedCXXClass(Class);
350
351    // C++ [expr.prim.lambda]p7:
352    //   The lambda-expression's compound-statement yields the
353    //   function-body (8.4) of the function call operator [...].
354    ActOnFinishFunctionBody(LSI->CallOperator, Body, /*IsInstantation=*/false);
355  }
356
357  if (LambdaExprNeedsCleanups)
358    ExprNeedsCleanups = true;
359
360  LambdaExpr *Lambda = LambdaExpr::Create(Context, Class, IntroducerRange,
361                                          CaptureDefault, Captures,
362                                          ExplicitParams, CaptureInits,
363                                          Body->getLocEnd());
364
365  // C++11 [expr.prim.lambda]p2:
366  //   A lambda-expression shall not appear in an unevaluated operand
367  //   (Clause 5).
368  switch (ExprEvalContexts.back().Context) {
369  case Unevaluated:
370    // We don't actually diagnose this case immediately, because we
371    // could be within a context where we might find out later that
372    // the expression is potentially evaluated (e.g., for typeid).
373    ExprEvalContexts.back().Lambdas.push_back(Lambda);
374    break;
375
376  case ConstantEvaluated:
377  case PotentiallyEvaluated:
378  case PotentiallyEvaluatedIfUsed:
379    break;
380  }
381
382  Diag(StartLoc, diag::err_lambda_unsupported);
383
384  return MaybeBindToTemporary(Lambda);
385}
386