blob: 64fe7f7dcea7999ca5a64443aba4cc66cd85d95b [file] [log] [blame]
Douglas Gregore2a7ad02012-02-08 21:18:48 +00001//===--- 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(),
Douglas Gregor5e058eb2012-02-09 02:20:38 +000032 /*IdLoc=*/Intro.Range.getBegin(),
Douglas Gregore2a7ad02012-02-08 21:18:48 +000033 /*Id=*/0);
34 Class->startDefinition();
Douglas Gregor4d8d22b2012-02-10 07:45:31 +000035 Class->makeLambda();
Douglas Gregore2a7ad02012-02-08 21:18:48 +000036 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;
Richard Smitheefb3d52012-02-10 09:58:53 +000049 EPI.HasTrailingReturn = true;
Douglas Gregore2a7ad02012-02-08 21:18:48 +000050 EPI.TypeQuals |= DeclSpec::TQ_const;
51 MethodTy = Context.getFunctionType(Context.DependentTy,
52 /*Args=*/0, /*NumArgs=*/0, EPI);
53 MethodTyInfo = Context.getTrivialTypeSourceInfo(MethodTy);
54 ExplicitParams = false;
55 EndLoc = Intro.Range.getEnd();
56 } else {
57 assert(ParamInfo.isFunctionDeclarator() &&
58 "lambda-declarator is a function");
59 DeclaratorChunk::FunctionTypeInfo &FTI = ParamInfo.getFunctionTypeInfo();
60
61 // C++11 [expr.prim.lambda]p5:
62 // This function call operator is declared const (9.3.1) if and only if
63 // the lambda-expression's parameter-declaration-clause is not followed
64 // by mutable. It is neither virtual nor declared volatile. [...]
65 if (!FTI.hasMutableQualifier())
66 FTI.TypeQuals |= DeclSpec::TQ_const;
67
68 // C++11 [expr.prim.lambda]p5:
69 // [...] Default arguments (8.3.6) shall not be specified in the
70 // parameter-declaration-clause of a lambda-declarator.
71 CheckExtraCXXDefaultArguments(ParamInfo);
72
73 MethodTyInfo = GetTypeForDeclarator(ParamInfo, CurScope);
74 // FIXME: Can these asserts actually fail?
75 assert(MethodTyInfo && "no type from lambda-declarator");
76 MethodTy = MethodTyInfo->getType();
77 assert(!MethodTy.isNull() && "no type from lambda declarator");
78 EndLoc = ParamInfo.getSourceRange().getEnd();
79 }
80
81 // C++11 [expr.prim.lambda]p5:
82 // The closure type for a lambda-expression has a public inline function
83 // call operator (13.5.4) whose parameters and return type are described by
84 // the lambda-expression's parameter-declaration-clause and
85 // trailing-return-type respectively.
86 DeclarationName MethodName
87 = Context.DeclarationNames.getCXXOperatorName(OO_Call);
88 DeclarationNameLoc MethodNameLoc;
89 MethodNameLoc.CXXOperatorName.BeginOpNameLoc
90 = Intro.Range.getBegin().getRawEncoding();
91 MethodNameLoc.CXXOperatorName.EndOpNameLoc
92 = Intro.Range.getEnd().getRawEncoding();
93 CXXMethodDecl *Method
94 = CXXMethodDecl::Create(Context, Class, EndLoc,
95 DeclarationNameInfo(MethodName,
96 Intro.Range.getBegin(),
97 MethodNameLoc),
98 MethodTy, MethodTyInfo,
99 /*isStatic=*/false,
100 SC_None,
101 /*isInline=*/true,
102 /*isConstExpr=*/false,
103 EndLoc);
104 Method->setAccess(AS_public);
Douglas Gregoref7d78b2012-02-10 08:36:38 +0000105
106 // Temporarily set the lexical declaration context to the current
107 // context, so that the Scope stack matches the lexical nesting.
108 Method->setLexicalDeclContext(DC);
Douglas Gregor503384f2012-02-09 00:47:04 +0000109
110 // Attributes on the lambda apply to the method.
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000111 ProcessDeclAttributes(CurScope, Method, ParamInfo);
112
Douglas Gregor503384f2012-02-09 00:47:04 +0000113 // Introduce the function call operator as the current declaration context.
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000114 PushDeclContext(CurScope, Method);
115
116 // Introduce the lambda scope.
117 PushLambdaScope(Class, Method);
118 LambdaScopeInfo *LSI = getCurLambda();
119 if (Intro.Default == LCD_ByCopy)
120 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByval;
121 else if (Intro.Default == LCD_ByRef)
122 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByref;
123 LSI->IntroducerRange = Intro.Range;
124 LSI->ExplicitParams = ExplicitParams;
125 LSI->Mutable = (Method->getTypeQualifiers() & Qualifiers::Const) == 0;
126
127 // Handle explicit captures.
128 for (llvm::SmallVector<LambdaCapture, 4>::const_iterator
129 C = Intro.Captures.begin(),
130 E = Intro.Captures.end();
131 C != E; ++C) {
132 if (C->Kind == LCK_This) {
133 // C++11 [expr.prim.lambda]p8:
134 // An identifier or this shall not appear more than once in a
135 // lambda-capture.
136 if (LSI->isCXXThisCaptured()) {
137 Diag(C->Loc, diag::err_capture_more_than_once)
138 << "'this'"
139 << SourceRange(LSI->getCXXThisCapture().getLocation());
140 continue;
141 }
142
143 // C++11 [expr.prim.lambda]p8:
144 // If a lambda-capture includes a capture-default that is =, the
145 // lambda-capture shall not contain this [...].
146 if (Intro.Default == LCD_ByCopy) {
147 Diag(C->Loc, diag::err_this_capture_with_copy_default);
148 continue;
149 }
150
151 // C++11 [expr.prim.lambda]p12:
152 // If this is captured by a local lambda expression, its nearest
153 // enclosing function shall be a non-static member function.
154 QualType ThisCaptureType = getCurrentThisType();
155 if (ThisCaptureType.isNull()) {
156 Diag(C->Loc, diag::err_this_capture) << true;
157 continue;
158 }
159
160 CheckCXXThisCapture(C->Loc, /*Explicit=*/true);
161 continue;
162 }
163
164 assert(C->Id && "missing identifier for capture");
165
166 // C++11 [expr.prim.lambda]p8:
167 // If a lambda-capture includes a capture-default that is &, the
168 // identifiers in the lambda-capture shall not be preceded by &.
169 // If a lambda-capture includes a capture-default that is =, [...]
170 // each identifier it contains shall be preceded by &.
171 if (C->Kind == LCK_ByRef && Intro.Default == LCD_ByRef) {
172 Diag(C->Loc, diag::err_reference_capture_with_reference_default);
173 continue;
174 } else if (C->Kind == LCK_ByCopy && Intro.Default == LCD_ByCopy) {
175 Diag(C->Loc, diag::err_copy_capture_with_copy_default);
176 continue;
177 }
178
179 DeclarationNameInfo Name(C->Id, C->Loc);
180 LookupResult R(*this, Name, LookupOrdinaryName);
181 LookupName(R, CurScope);
182 if (R.isAmbiguous())
183 continue;
184 if (R.empty()) {
185 // FIXME: Disable corrections that would add qualification?
186 CXXScopeSpec ScopeSpec;
187 DeclFilterCCC<VarDecl> Validator;
188 if (DiagnoseEmptyLookup(CurScope, ScopeSpec, R, Validator))
189 continue;
190 }
191
192 // C++11 [expr.prim.lambda]p10:
193 // The identifiers in a capture-list are looked up using the usual rules
194 // for unqualified name lookup (3.4.1); each such lookup shall find a
195 // variable with automatic storage duration declared in the reaching
196 // scope of the local lambda expression.
197 // FIXME: Check reaching scope.
198 VarDecl *Var = R.getAsSingle<VarDecl>();
199 if (!Var) {
200 Diag(C->Loc, diag::err_capture_does_not_name_variable) << C->Id;
201 continue;
202 }
203
204 if (!Var->hasLocalStorage()) {
205 Diag(C->Loc, diag::err_capture_non_automatic_variable) << C->Id;
206 Diag(Var->getLocation(), diag::note_previous_decl) << C->Id;
207 continue;
208 }
209
210 // C++11 [expr.prim.lambda]p8:
211 // An identifier or this shall not appear more than once in a
212 // lambda-capture.
213 if (LSI->isCaptured(Var)) {
214 Diag(C->Loc, diag::err_capture_more_than_once)
215 << C->Id
216 << SourceRange(LSI->getCapture(Var).getLocation());
217 continue;
218 }
219
220 TryCaptureKind Kind = C->Kind == LCK_ByRef ? TryCapture_ExplicitByRef :
221 TryCapture_ExplicitByVal;
222 TryCaptureVar(Var, C->Loc, Kind);
223 }
224 LSI->finishedExplicitCaptures();
225
226 // Set the parameters on the decl, if specified.
227 if (isa<FunctionProtoTypeLoc>(MethodTyInfo->getTypeLoc())) {
228 FunctionProtoTypeLoc Proto =
229 cast<FunctionProtoTypeLoc>(MethodTyInfo->getTypeLoc());
230 Method->setParams(Proto.getParams());
231 CheckParmsForFunctionDef(Method->param_begin(),
232 Method->param_end(),
233 /*CheckParameterNames=*/false);
234
235 // Introduce our parameters into the function scope
236 for (unsigned p = 0, NumParams = Method->getNumParams(); p < NumParams; ++p) {
237 ParmVarDecl *Param = Method->getParamDecl(p);
238 Param->setOwningFunction(Method);
239
240 // If this has an identifier, add it to the scope stack.
241 if (Param->getIdentifier()) {
242 CheckShadow(CurScope, Param);
243
244 PushOnScopeChains(Param, CurScope);
245 }
246 }
247 }
248
249 const FunctionType *Fn = MethodTy->getAs<FunctionType>();
250 QualType RetTy = Fn->getResultType();
251 if (RetTy != Context.DependentTy) {
252 LSI->ReturnType = RetTy;
253 } else {
254 LSI->HasImplicitReturnType = true;
255 }
256
257 // FIXME: Check return type is complete, !isObjCObjectType
258
Douglas Gregor503384f2012-02-09 00:47:04 +0000259 // Enter a new evaluation context to insulate the block from any
260 // cleanups from the enclosing full-expression.
261 PushExpressionEvaluationContext(PotentiallyEvaluated);
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000262}
263
264void Sema::ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope) {
265 // Leave the expression-evaluation context.
266 DiscardCleanupsInEvaluationContext();
267 PopExpressionEvaluationContext();
268
269 // Leave the context of the lambda.
270 PopDeclContext();
Douglas Gregor630d5ff2012-02-09 01:28:42 +0000271
272 // Finalize the lambda.
273 LambdaScopeInfo *LSI = getCurLambda();
274 CXXRecordDecl *Class = LSI->Lambda;
275 Class->setInvalidDecl();
276 SmallVector<Decl*, 4> Fields(Class->field_begin(), Class->field_end());
277 ActOnFields(0, Class->getLocation(), Class, Fields,
278 SourceLocation(), SourceLocation(), 0);
279 CheckCompletedCXXClass(Class);
280
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000281 PopFunctionScopeInfo();
282}
283
284ExprResult Sema::ActOnLambdaExpr(SourceLocation StartLoc,
285 Stmt *Body, Scope *CurScope) {
286 // Leave the expression-evaluation context.
287 DiscardCleanupsInEvaluationContext();
288 PopExpressionEvaluationContext();
289
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000290 // Collect information from the lambda scope.
291 llvm::SmallVector<LambdaExpr::Capture, 4> Captures;
292 llvm::SmallVector<Expr *, 4> CaptureInits;
293 LambdaCaptureDefault CaptureDefault;
294 CXXRecordDecl *Class;
Douglas Gregoref7d78b2012-02-10 08:36:38 +0000295 CXXMethodDecl *CallOperator;
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000296 SourceRange IntroducerRange;
297 bool ExplicitParams;
Douglas Gregor503384f2012-02-09 00:47:04 +0000298 bool LambdaExprNeedsCleanups;
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000299 {
300 LambdaScopeInfo *LSI = getCurLambda();
Douglas Gregoref7d78b2012-02-10 08:36:38 +0000301 CallOperator = LSI->CallOperator;
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000302 Class = LSI->Lambda;
303 IntroducerRange = LSI->IntroducerRange;
304 ExplicitParams = LSI->ExplicitParams;
Douglas Gregor503384f2012-02-09 00:47:04 +0000305 LambdaExprNeedsCleanups = LSI->ExprNeedsCleanups;
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000306
307 // Translate captures.
308 for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) {
309 LambdaScopeInfo::Capture From = LSI->Captures[I];
310 assert(!From.isBlockCapture() && "Cannot capture __block variables");
311 bool IsImplicit = I >= LSI->NumExplicitCaptures;
312
313 // Handle 'this' capture.
314 if (From.isThisCapture()) {
315 Captures.push_back(LambdaExpr::Capture(From.getLocation(),
316 IsImplicit,
317 LCK_This));
318 CaptureInits.push_back(new (Context) CXXThisExpr(From.getLocation(),
319 getCurrentThisType(),
320 /*isImplicit=*/true));
321 continue;
322 }
323
324 VarDecl *Var = From.getVariable();
325 // FIXME: Handle pack expansions.
326 LambdaCaptureKind Kind = From.isCopyCapture()? LCK_ByCopy : LCK_ByRef;
327 Captures.push_back(LambdaExpr::Capture(From.getLocation(), IsImplicit,
328 Kind, Var));
329 CaptureInits.push_back(From.getCopyExpr());
330 }
331
332 switch (LSI->ImpCaptureStyle) {
333 case CapturingScopeInfo::ImpCap_None:
334 CaptureDefault = LCD_None;
335 break;
336
337 case CapturingScopeInfo::ImpCap_LambdaByval:
338 CaptureDefault = LCD_ByCopy;
339 break;
340
341 case CapturingScopeInfo::ImpCap_LambdaByref:
342 CaptureDefault = LCD_ByRef;
343 break;
344
345 case CapturingScopeInfo::ImpCap_Block:
346 llvm_unreachable("block capture in lambda");
347 break;
348 }
349
Douglas Gregor54042f12012-02-09 10:18:50 +0000350 // C++11 [expr.prim.lambda]p4:
351 // If a lambda-expression does not include a
352 // trailing-return-type, it is as if the trailing-return-type
353 // denotes the following type:
354 // FIXME: Assumes current resolution to core issue 975.
355 if (LSI->HasImplicitReturnType) {
356 // - if there are no return statements in the
357 // compound-statement, or all return statements return
358 // either an expression of type void or no expression or
359 // braced-init-list, the type void;
360 if (LSI->ReturnType.isNull()) {
361 LSI->ReturnType = Context.VoidTy;
362 } else {
363 // C++11 [expr.prim.lambda]p4:
364 // - if the compound-statement is of the form
365 //
366 // { attribute-specifier-seq[opt] return expression ; }
367 //
368 // the type of the returned expression after
369 // lvalue-to-rvalue conversion (4.1), array-to-pointer
370 // conver- sion (4.2), and function-to-pointer conversion
371 // (4.3);
372 //
373 // Since we're accepting the resolution to a post-C++11 core
374 // issue with a non-trivial extension, provide a warning (by
375 // default).
376 CompoundStmt *CompoundBody = cast<CompoundStmt>(Body);
377 if (!(CompoundBody->size() == 1 &&
378 isa<ReturnStmt>(*CompoundBody->body_begin())) &&
379 !Context.hasSameType(LSI->ReturnType, Context.VoidTy))
380 Diag(IntroducerRange.getBegin(),
381 diag::ext_lambda_implies_void_return);
382 }
383
384 // Create a function type with the inferred return type.
385 const FunctionProtoType *Proto
386 = CallOperator->getType()->getAs<FunctionProtoType>();
387 QualType FunctionTy
388 = Context.getFunctionType(LSI->ReturnType,
389 Proto->arg_type_begin(),
390 Proto->getNumArgs(),
391 Proto->getExtProtoInfo());
392 CallOperator->setType(FunctionTy);
393 }
394
Douglas Gregorb5559712012-02-10 16:13:20 +0000395 // C++11 [expr.prim.lambda]p6:
396 // The closure type for a lambda-expression with no lambda-capture
397 // has a public non-virtual non-explicit const conversion function
398 // to pointer to function having the same parameter and return
399 // types as the closure type's function call operator.
400 if (Captures.empty() && CaptureDefault == LCD_None) {
401 const FunctionProtoType *Proto
402 = CallOperator->getType()->getAs<FunctionProtoType>();
403 QualType FunctionPtrTy;
404 {
405 FunctionProtoType::ExtProtoInfo ExtInfo = Proto->getExtProtoInfo();
406 ExtInfo.TypeQuals = 0;
407 QualType FunctionTy
408 = Context.getFunctionType(Proto->getResultType(),
409 Proto->arg_type_begin(),
410 Proto->getNumArgs(),
411 ExtInfo);
412 FunctionPtrTy = Context.getPointerType(FunctionTy);
413 }
414
415 FunctionProtoType::ExtProtoInfo ExtInfo;
416 ExtInfo.TypeQuals = Qualifiers::Const;
417 QualType ConvTy = Context.getFunctionType(FunctionPtrTy, 0, 0, ExtInfo);
418
419 SourceLocation Loc = IntroducerRange.getBegin();
420 DeclarationName Name
421 = Context.DeclarationNames.getCXXConversionFunctionName(
422 Context.getCanonicalType(FunctionPtrTy));
423 DeclarationNameLoc NameLoc;
424 NameLoc.NamedType.TInfo = Context.getTrivialTypeSourceInfo(FunctionPtrTy,
425 Loc);
426 CXXConversionDecl *Conversion
427 = CXXConversionDecl::Create(Context, Class, Loc,
428 DeclarationNameInfo(Name, Loc, NameLoc),
429 ConvTy,
430 Context.getTrivialTypeSourceInfo(ConvTy,
431 Loc),
432 /*isInline=*/false, /*isExplicit=*/false,
433 /*isConstexpr=*/false, Body->getLocEnd());
434 Conversion->setAccess(AS_public);
435 Conversion->setImplicit(true);
436 Class->addDecl(Conversion);
437 }
Douglas Gregor503384f2012-02-09 00:47:04 +0000438
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000439 // C++ [expr.prim.lambda]p7:
440 // The lambda-expression's compound-statement yields the
441 // function-body (8.4) of the function call operator [...].
Douglas Gregor760b37b2012-02-09 08:52:43 +0000442 ActOnFinishFunctionBody(CallOperator, Body, /*IsInstantation=*/false);
Douglas Gregorb5559712012-02-10 16:13:20 +0000443
444 // Finalize the lambda class.
445 SmallVector<Decl*, 4> Fields(Class->field_begin(), Class->field_end());
Douglas Gregor760b37b2012-02-09 08:52:43 +0000446 CallOperator->setLexicalDeclContext(Class);
Douglas Gregorb5559712012-02-10 16:13:20 +0000447 Class->addDecl(CallOperator);
448 ActOnFields(0, Class->getLocation(), Class, Fields,
449 SourceLocation(), SourceLocation(), 0);
450 CheckCompletedCXXClass(Class);
451
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000452 }
453
Douglas Gregor503384f2012-02-09 00:47:04 +0000454 if (LambdaExprNeedsCleanups)
455 ExprNeedsCleanups = true;
456
Douglas Gregore2c59132012-02-09 08:14:43 +0000457 LambdaExpr *Lambda = LambdaExpr::Create(Context, Class, IntroducerRange,
458 CaptureDefault, Captures,
459 ExplicitParams, CaptureInits,
460 Body->getLocEnd());
Douglas Gregor4d8d22b2012-02-10 07:45:31 +0000461 Class->setLambda(Lambda);
Douglas Gregore2c59132012-02-09 08:14:43 +0000462
463 // C++11 [expr.prim.lambda]p2:
464 // A lambda-expression shall not appear in an unevaluated operand
465 // (Clause 5).
466 switch (ExprEvalContexts.back().Context) {
467 case Unevaluated:
468 // We don't actually diagnose this case immediately, because we
469 // could be within a context where we might find out later that
470 // the expression is potentially evaluated (e.g., for typeid).
471 ExprEvalContexts.back().Lambdas.push_back(Lambda);
472 break;
473
474 case ConstantEvaluated:
475 case PotentiallyEvaluated:
476 case PotentiallyEvaluatedIfUsed:
477 break;
478 }
479
Douglas Gregor503384f2012-02-09 00:47:04 +0000480 return MaybeBindToTemporary(Lambda);
Douglas Gregore2a7ad02012-02-08 21:18:48 +0000481}