clang 23.0.0git
SemaLambda.cpp
Go to the documentation of this file.
1//===--- SemaLambda.cpp - Semantic Analysis for C++11 Lambdas -------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements semantic analysis for C++ lambda expressions.
10//
11//===----------------------------------------------------------------------===//
13#include "TypeLocBuilder.h"
14#include "clang/AST/ASTLambda.h"
16#include "clang/AST/ExprCXX.h"
19#include "clang/Sema/DeclSpec.h"
21#include "clang/Sema/Lookup.h"
22#include "clang/Sema/Scope.h"
24#include "clang/Sema/SemaARM.h"
25#include "clang/Sema/SemaCUDA.h"
28#include "clang/Sema/SemaSYCL.h"
29#include "clang/Sema/Template.h"
30#include "llvm/ADT/STLExtras.h"
31#include <optional>
32using namespace clang;
33using namespace sema;
34
35/// Examines the FunctionScopeInfo stack to determine the nearest
36/// enclosing lambda (to the current lambda) that is 'capture-ready' for
37/// the variable referenced in the current lambda (i.e. \p VarToCapture).
38/// If successful, returns the index into Sema's FunctionScopeInfo stack
39/// of the capture-ready lambda's LambdaScopeInfo.
40///
41/// Climbs down the stack of lambdas (deepest nested lambda - i.e. current
42/// lambda - is on top) to determine the index of the nearest enclosing/outer
43/// lambda that is ready to capture the \p VarToCapture being referenced in
44/// the current lambda.
45/// As we climb down the stack, we want the index of the first such lambda -
46/// that is the lambda with the highest index that is 'capture-ready'.
47///
48/// A lambda 'L' is capture-ready for 'V' (var or this) if:
49/// - its enclosing context is non-dependent
50/// - and if the chain of lambdas between L and the lambda in which
51/// V is potentially used (i.e. the lambda at the top of the scope info
52/// stack), can all capture or have already captured V.
53/// If \p VarToCapture is 'null' then we are trying to capture 'this'.
54///
55/// Note that a lambda that is deemed 'capture-ready' still needs to be checked
56/// for whether it is 'capture-capable' (see
57/// getStackIndexOfNearestEnclosingCaptureCapableLambda), before it can truly
58/// capture.
59///
60/// \param FunctionScopes - Sema's stack of nested FunctionScopeInfo's (which a
61/// LambdaScopeInfo inherits from). The current/deepest/innermost lambda
62/// is at the top of the stack and has the highest index.
63/// \param VarToCapture - the variable to capture. If NULL, capture 'this'.
64///
65/// \returns An UnsignedOrNone Index that if evaluates to 'true'
66/// contains the index (into Sema's FunctionScopeInfo stack) of the innermost
67/// lambda which is capture-ready. If the return value evaluates to 'false'
68/// then no lambda is capture-ready for \p VarToCapture.
69
72 ValueDecl *VarToCapture) {
73 // Label failure to capture.
74 const UnsignedOrNone NoLambdaIsCaptureReady = std::nullopt;
75
76 // Ignore all inner captured regions.
77 unsigned CurScopeIndex = FunctionScopes.size() - 1;
78 while (CurScopeIndex > 0 && isa<clang::sema::CapturedRegionScopeInfo>(
79 FunctionScopes[CurScopeIndex]))
80 --CurScopeIndex;
81 assert(
82 isa<clang::sema::LambdaScopeInfo>(FunctionScopes[CurScopeIndex]) &&
83 "The function on the top of sema's function-info stack must be a lambda");
84
85 // If VarToCapture is null, we are attempting to capture 'this'.
86 const bool IsCapturingThis = !VarToCapture;
87 const bool IsCapturingVariable = !IsCapturingThis;
88
89 // Start with the current lambda at the top of the stack (highest index).
90 DeclContext *EnclosingDC =
91 cast<sema::LambdaScopeInfo>(FunctionScopes[CurScopeIndex])->CallOperator;
92
93 do {
95 cast<sema::LambdaScopeInfo>(FunctionScopes[CurScopeIndex]);
96 // IF we have climbed down to an intervening enclosing lambda that contains
97 // the variable declaration - it obviously can/must not capture the
98 // variable.
99 // Since its enclosing DC is dependent, all the lambdas between it and the
100 // innermost nested lambda are dependent (otherwise we wouldn't have
101 // arrived here) - so we don't yet have a lambda that can capture the
102 // variable.
103 if (IsCapturingVariable &&
104 VarToCapture->getDeclContext()->Equals(EnclosingDC))
105 return NoLambdaIsCaptureReady;
106
107 // For an enclosing lambda to be capture ready for an entity, all
108 // intervening lambda's have to be able to capture that entity. If even
109 // one of the intervening lambda's is not capable of capturing the entity
110 // then no enclosing lambda can ever capture that entity.
111 // For e.g.
112 // const int x = 10;
113 // [=](auto a) { #1
114 // [](auto b) { #2 <-- an intervening lambda that can never capture 'x'
115 // [=](auto c) { #3
116 // f(x, c); <-- can not lead to x's speculative capture by #1 or #2
117 // }; }; };
118 // If they do not have a default implicit capture, check to see
119 // if the entity has already been explicitly captured.
120 // If even a single dependent enclosing lambda lacks the capability
121 // to ever capture this variable, there is no further enclosing
122 // non-dependent lambda that can capture this variable.
124 if (IsCapturingVariable && !LSI->isCaptured(VarToCapture))
125 return NoLambdaIsCaptureReady;
126 if (IsCapturingThis && !LSI->isCXXThisCaptured())
127 return NoLambdaIsCaptureReady;
128 }
129 EnclosingDC = getLambdaAwareParentOfDeclContext(EnclosingDC);
130
131 assert(CurScopeIndex);
132 --CurScopeIndex;
133 } while (!EnclosingDC->isTranslationUnit() &&
134 EnclosingDC->isDependentContext() &&
135 isLambdaCallOperator(EnclosingDC));
136
137 assert(CurScopeIndex < (FunctionScopes.size() - 1));
138 // If the enclosingDC is not dependent, then the immediately nested lambda
139 // (one index above) is capture-ready.
140 if (!EnclosingDC->isDependentContext())
141 return CurScopeIndex + 1;
142 return NoLambdaIsCaptureReady;
143}
144
145/// Examines the FunctionScopeInfo stack to determine the nearest
146/// enclosing lambda (to the current lambda) that is 'capture-capable' for
147/// the variable referenced in the current lambda (i.e. \p VarToCapture).
148/// If successful, returns the index into Sema's FunctionScopeInfo stack
149/// of the capture-capable lambda's LambdaScopeInfo.
150///
151/// Given the current stack of lambdas being processed by Sema and
152/// the variable of interest, to identify the nearest enclosing lambda (to the
153/// current lambda at the top of the stack) that can truly capture
154/// a variable, it has to have the following two properties:
155/// a) 'capture-ready' - be the innermost lambda that is 'capture-ready':
156/// - climb down the stack (i.e. starting from the innermost and examining
157/// each outer lambda step by step) checking if each enclosing
158/// lambda can either implicitly or explicitly capture the variable.
159/// Record the first such lambda that is enclosed in a non-dependent
160/// context. If no such lambda currently exists return failure.
161/// b) 'capture-capable' - make sure the 'capture-ready' lambda can truly
162/// capture the variable by checking all its enclosing lambdas:
163/// - check if all outer lambdas enclosing the 'capture-ready' lambda
164/// identified above in 'a' can also capture the variable (this is done
165/// via tryCaptureVariable for variables and CheckCXXThisCapture for
166/// 'this' by passing in the index of the Lambda identified in step 'a')
167///
168/// \param FunctionScopes - Sema's stack of nested FunctionScopeInfo's (which a
169/// LambdaScopeInfo inherits from). The current/deepest/innermost lambda
170/// is at the top of the stack.
171///
172/// \param VarToCapture - the variable to capture. If NULL, capture 'this'.
173///
174///
175/// \returns An UnsignedOrNone Index that if evaluates to 'true'
176/// contains the index (into Sema's FunctionScopeInfo stack) of the innermost
177/// lambda which is capture-capable. If the return value evaluates to 'false'
178/// then no lambda is capture-capable for \p VarToCapture.
179
182 ValueDecl *VarToCapture, Sema &S) {
183
184 const UnsignedOrNone NoLambdaIsCaptureCapable = std::nullopt;
185
186 const UnsignedOrNone OptionalStackIndex =
188 VarToCapture);
189 if (!OptionalStackIndex)
190 return NoLambdaIsCaptureCapable;
191
192 const unsigned IndexOfCaptureReadyLambda = *OptionalStackIndex;
193 assert(((IndexOfCaptureReadyLambda != (FunctionScopes.size() - 1)) ||
194 S.getCurGenericLambda()) &&
195 "The capture ready lambda for a potential capture can only be the "
196 "current lambda if it is a generic lambda");
197
198 const sema::LambdaScopeInfo *const CaptureReadyLambdaLSI =
199 cast<sema::LambdaScopeInfo>(FunctionScopes[IndexOfCaptureReadyLambda]);
200
201 // If VarToCapture is null, we are attempting to capture 'this'
202 const bool IsCapturingThis = !VarToCapture;
203 const bool IsCapturingVariable = !IsCapturingThis;
204
205 if (IsCapturingVariable) {
206 // Check if the capture-ready lambda can truly capture the variable, by
207 // checking whether all enclosing lambdas of the capture-ready lambda allow
208 // the capture - i.e. make sure it is capture-capable.
209 QualType CaptureType, DeclRefType;
210 const bool CanCaptureVariable = !S.tryCaptureVariable(
211 VarToCapture,
212 /*ExprVarIsUsedInLoc*/ SourceLocation(), TryCaptureKind::Implicit,
213 /*EllipsisLoc*/ SourceLocation(),
214 /*BuildAndDiagnose*/ false, CaptureType, DeclRefType,
215 &IndexOfCaptureReadyLambda);
216 if (!CanCaptureVariable)
217 return NoLambdaIsCaptureCapable;
218 } else {
219 // Check if the capture-ready lambda can truly capture 'this' by checking
220 // whether all enclosing lambdas of the capture-ready lambda can capture
221 // 'this'.
222 const bool CanCaptureThis =
224 CaptureReadyLambdaLSI->PotentialThisCaptureLocation,
225 /*Explicit*/ false, /*BuildAndDiagnose*/ false,
226 &IndexOfCaptureReadyLambda);
227 if (!CanCaptureThis)
228 return NoLambdaIsCaptureCapable;
229 }
230 return IndexOfCaptureReadyLambda;
231}
232
233static inline TemplateParameterList *
235 if (!LSI->GLTemplateParameterList && !LSI->TemplateParams.empty()) {
237 SemaRef.Context,
238 /*Begin loc of the lambda expression*/ LSI->IntroducerRange.getBegin(),
239 /*L angle loc*/ LSI->ExplicitTemplateParamsRange.getBegin(),
240 LSI->TemplateParams,
241 /*R angle loc*/ LSI->ExplicitTemplateParamsRange.getEnd(),
242 LSI->RequiresClause.get());
243 }
244 return LSI->GLTemplateParameterList;
245}
246
249 unsigned LambdaDependencyKind,
250 LambdaCaptureDefault CaptureDefault) {
252
253 bool IsGenericLambda =
255 // Start constructing the lambda class.
257 Context, DC, Info, IntroducerRange.getBegin(), LambdaDependencyKind,
258 IsGenericLambda, CaptureDefault);
259 DC->addDecl(Class);
260
261 return Class;
262}
263
264/// Determine whether the given context is or is enclosed in an inline
265/// function.
266static bool isInInlineFunction(const DeclContext *DC) {
267 while (!DC->isFileContext()) {
268 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(DC))
269 if (FD->isInlined())
270 return true;
271
272 DC = DC->getLexicalParent();
273 }
274
275 return false;
276}
277
278std::tuple<MangleNumberingContext *, Decl *>
280 // Compute the context for allocating mangling numbers in the current
281 // expression, if the ABI requires them.
282 Decl *ManglingContextDecl = ExprEvalContexts.back().ManglingContextDecl;
283
284 enum ContextKind {
285 Normal,
287 DataMember,
288 InlineVariable,
289 TemplatedVariable,
290 Concept,
291 NonInlineInModulePurview
292 } Kind = Normal;
293
294 bool IsInNonspecializedTemplate =
295 inTemplateInstantiation() || CurContext->isDependentContext();
296
297 // Default arguments of member function parameters that appear in a class
298 // definition, as well as the initializers of data members, receive special
299 // treatment. Identify them.
300 Kind = [&]() {
301 // See discussion in https://github.com/itanium-cxx-abi/cxx-abi/issues/186
302 //
303 // zygoloid:
304 // Yeah, I think the only cases left where lambdas don't need a
305 // mangling are when they have (effectively) internal linkage or appear
306 // in a non-inline function in a non-module translation unit.
307 if (auto *ND = dyn_cast<NamedDecl>(ManglingContextDecl ? ManglingContextDecl
308 : cast<Decl>(DC));
309 ND && (ND->isInNamedModule() || ND->isFromGlobalModule()) &&
310 ND->isExternallyVisible()) {
311 if (!ManglingContextDecl)
312 ManglingContextDecl = const_cast<Decl *>(cast<Decl>(DC));
313 return NonInlineInModulePurview;
314 }
315
316 if (!ManglingContextDecl)
317 return Normal;
318
319 if (ParmVarDecl *Param = dyn_cast<ParmVarDecl>(ManglingContextDecl)) {
320 if (const DeclContext *LexicalDC
321 = Param->getDeclContext()->getLexicalParent())
322 if (LexicalDC->isRecord())
323 return DefaultArgument;
324 } else if (VarDecl *Var = dyn_cast<VarDecl>(ManglingContextDecl)) {
325 if (Var->getMostRecentDecl()->isInline())
326 return InlineVariable;
327
328 if (Var->getDeclContext()->isRecord() && IsInNonspecializedTemplate)
329 return TemplatedVariable;
330
331 if (Var->getDescribedVarTemplate())
332 return TemplatedVariable;
333
334 if (auto *VTS = dyn_cast<VarTemplateSpecializationDecl>(Var)) {
335 if (!VTS->isExplicitSpecialization())
336 return TemplatedVariable;
337 }
338 } else if (isa<FieldDecl>(ManglingContextDecl)) {
339 return DataMember;
340 } else if (isa<ImplicitConceptSpecializationDecl>(ManglingContextDecl)) {
341 return Concept;
342 }
343
344 return Normal;
345 }();
346
347 // Itanium ABI [5.1.7]:
348 // In the following contexts [...] the one-definition rule requires closure
349 // types in different translation units to "correspond":
350 switch (Kind) {
351 case Normal: {
352 // -- the bodies of inline or templated functions
353 if ((IsInNonspecializedTemplate &&
354 !(ManglingContextDecl && isa<ParmVarDecl>(ManglingContextDecl))) ||
356 while (auto *CD = dyn_cast<CapturedDecl>(DC))
357 DC = CD->getParent();
358 return std::make_tuple(&Context.getManglingNumberContext(DC), nullptr);
359 }
360
361 return std::make_tuple(nullptr, nullptr);
362 }
363
364 case NonInlineInModulePurview:
365 case Concept:
366 // Concept definitions aren't code generated and thus aren't mangled,
367 // however the ManglingContextDecl is important for the purposes of
368 // re-forming the template argument list of the lambda for constraint
369 // evaluation.
370 case DataMember:
371 // -- default member initializers
372 case DefaultArgument:
373 // -- default arguments appearing in class definitions
374 case InlineVariable:
375 case TemplatedVariable:
376 // -- the initializers of inline or templated variables
377 return std::make_tuple(
378 &Context.getManglingNumberContext(ASTContext::NeedExtraManglingDecl,
379 ManglingContextDecl),
380 ManglingContextDecl);
381 }
382
383 llvm_unreachable("unexpected context");
384}
385
386static QualType
388 TemplateParameterList *TemplateParams,
389 TypeSourceInfo *MethodTypeInfo) {
390 assert(MethodTypeInfo && "expected a non null type");
391
392 QualType MethodType = MethodTypeInfo->getType();
393 // If a lambda appears in a dependent context or is a generic lambda (has
394 // template parameters) and has an 'auto' return type, deduce it to a
395 // dependent type.
396 if (Class->isDependentContext() || TemplateParams) {
397 const FunctionProtoType *FPT = MethodType->castAs<FunctionProtoType>();
398 QualType Result = FPT->getReturnType();
399 if (Result->isUndeducedType()) {
400 Result = S.SubstAutoTypeDependent(Result);
401 MethodType = S.Context.getFunctionType(Result, FPT->getParamTypes(),
402 FPT->getExtProtoInfo());
403 }
404 }
405 return MethodType;
406}
407
408// [C++2b] [expr.prim.lambda.closure] p4
409// Given a lambda with a lambda-capture, the type of the explicit object
410// parameter, if any, of the lambda's function call operator (possibly
411// instantiated from a function call operator template) shall be either:
412// - the closure type,
413// - class type publicly and unambiguously derived from the closure type, or
414// - a reference to a possibly cv-qualified such type.
418 return false;
419 CXXRecordDecl *RD = Method->getParent();
420 if (Method->getType()->isDependentType())
421 return false;
422 if (RD->isCapturelessLambda())
423 return false;
424
425 ParmVarDecl *Param = Method->getParamDecl(0);
426 QualType ExplicitObjectParameterType = Param->getType()
427 .getNonReferenceType()
428 .getUnqualifiedType()
429 .getDesugaredType(getASTContext());
431 if (LambdaType == ExplicitObjectParameterType)
432 return false;
433
434 // Don't check the same instantiation twice.
435 //
436 // If this call operator is ill-formed, there is no point in issuing
437 // a diagnostic every time it is called because the problem is in the
438 // definition of the derived type, not at the call site.
439 //
440 // FIXME: Move this check to where we instantiate the method? This should
441 // be possible, but the naive approach of just marking the method as invalid
442 // leads to us emitting more diagnostics than we should have to for this case
443 // (1 error here *and* 1 error about there being no matching overload at the
444 // call site). It might be possible to avoid that by also checking if there
445 // is an empty cast path for the method stored in the context (signalling that
446 // we've already diagnosed it) and then just not building the call, but that
447 // doesn't really seem any simpler than diagnosing it at the call site...
448 auto [It, Inserted] = Context.LambdaCastPaths.try_emplace(Method);
449 if (!Inserted)
450 return It->second.empty();
451
452 CXXCastPath &Path = It->second;
453 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
454 /*DetectVirtual=*/false);
455 if (!IsDerivedFrom(RD->getLocation(), ExplicitObjectParameterType, LambdaType,
456 Paths)) {
457 Diag(Param->getLocation(), diag::err_invalid_explicit_object_type_in_lambda)
458 << ExplicitObjectParameterType;
459 return true;
460 }
461
462 if (Paths.isAmbiguous(LambdaType)) {
463 std::string PathsDisplay = getAmbiguousPathsDisplayString(Paths);
464 Diag(CallLoc, diag::err_explicit_object_lambda_ambiguous_base)
465 << LambdaType << PathsDisplay;
466 return true;
467 }
468
469 if (CheckBaseClassAccess(CallLoc, LambdaType, ExplicitObjectParameterType,
470 Paths.front(),
471 diag::err_explicit_object_lambda_inaccessible_base))
472 return true;
473
474 BuildBasePathArray(Paths, Path);
475 return false;
476}
477
480 std::optional<CXXRecordDecl::LambdaNumbering> NumberingOverride) {
481 if (NumberingOverride) {
482 Class->setLambdaNumbering(*NumberingOverride);
483 return;
484 }
485
486 ContextRAII ManglingContext(*this, Class->getDeclContext());
487
488 auto getMangleNumberingContext =
489 [this](CXXRecordDecl *Class,
490 Decl *ManglingContextDecl) -> MangleNumberingContext * {
491 // Get mangle numbering context if there's any extra decl context.
492 if (ManglingContextDecl)
493 return &Context.getManglingNumberContext(
494 ASTContext::NeedExtraManglingDecl, ManglingContextDecl);
495 // Otherwise, from that lambda's decl context.
496 auto DC = Class->getDeclContext();
497 while (auto *CD = dyn_cast<CapturedDecl>(DC))
498 DC = CD->getParent();
499 return &Context.getManglingNumberContext(DC);
500 };
501
504 std::tie(MCtx, Numbering.ContextDecl) =
505 getCurrentMangleNumberContext(Class->getDeclContext());
506 if (!MCtx && (getLangOpts().CUDA || getLangOpts().SYCLIsDevice ||
507 getLangOpts().SYCLIsHost)) {
508 // Force lambda numbering in CUDA/HIP as we need to name lambdas following
509 // ODR. Both device- and host-compilation need to have a consistent naming
510 // on kernel functions. As lambdas are potential part of these `__global__`
511 // function names, they needs numbering following ODR.
512 // Also force for SYCL, since we need this for the
513 // __builtin_sycl_unique_stable_name implementation, which depends on lambda
514 // mangling.
515 MCtx = getMangleNumberingContext(Class, Numbering.ContextDecl);
516 assert(MCtx && "Retrieving mangle numbering context failed!");
517 Numbering.HasKnownInternalLinkage = true;
518 }
519 if (MCtx) {
520 Numbering.IndexInContext = MCtx->getNextLambdaIndex();
521 Numbering.ManglingNumber = MCtx->getManglingNumber(Method);
523 Class->setLambdaNumbering(Numbering);
524
525 if (auto *Source =
526 dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource()))
527 Source->AssignedLambdaNumbering(Class);
528 }
529}
530
532 CXXMethodDecl *CallOperator,
533 bool ExplicitResultType) {
534 if (ExplicitResultType) {
535 LSI->HasImplicitReturnType = false;
536 LSI->ReturnType = CallOperator->getReturnType();
537 if (!LSI->ReturnType->isDependentType() && !LSI->ReturnType->isVoidType())
538 S.RequireCompleteType(CallOperator->getBeginLoc(), LSI->ReturnType,
539 diag::err_lambda_incomplete_result);
540 } else {
541 LSI->HasImplicitReturnType = true;
542 }
543}
544
546 SourceRange IntroducerRange,
547 LambdaCaptureDefault CaptureDefault,
548 SourceLocation CaptureDefaultLoc,
549 bool ExplicitParams, bool Mutable) {
550 LSI->CallOperator = CallOperator;
551 CXXRecordDecl *LambdaClass = CallOperator->getParent();
552 LSI->Lambda = LambdaClass;
553 if (CaptureDefault == LCD_ByCopy)
554 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByval;
555 else if (CaptureDefault == LCD_ByRef)
556 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByref;
557 LSI->CaptureDefaultLoc = CaptureDefaultLoc;
558 LSI->IntroducerRange = IntroducerRange;
559 LSI->ExplicitParams = ExplicitParams;
560 LSI->Mutable = Mutable;
561}
562
566
568 LambdaIntroducer &Intro, SourceLocation LAngleLoc,
569 ArrayRef<NamedDecl *> TParams, SourceLocation RAngleLoc,
570 ExprResult RequiresClause) {
572 assert(LSI && "Expected a lambda scope");
573 assert(LSI->NumExplicitTemplateParams == 0 &&
574 "Already acted on explicit template parameters");
575 assert(LSI->TemplateParams.empty() &&
576 "Explicit template parameters should come "
577 "before invented (auto) ones");
578 assert(!TParams.empty() &&
579 "No template parameters to act on");
580 LSI->TemplateParams.append(TParams.begin(), TParams.end());
581 LSI->NumExplicitTemplateParams = TParams.size();
582 LSI->ExplicitTemplateParamsRange = {LAngleLoc, RAngleLoc};
583 LSI->RequiresClause = RequiresClause;
584}
585
586/// If this expression is an enumerator-like expression of some type
587/// T, return the type T; otherwise, return null.
588///
589/// Pointer comparisons on the result here should always work because
590/// it's derived from either the parent of an EnumConstantDecl
591/// (i.e. the definition) or the declaration returned by
592/// EnumType::getDecl() (i.e. the definition).
594 // An expression is an enumerator-like expression of type T if,
595 // ignoring parens and parens-like expressions:
596 E = E->IgnoreParens();
597
598 // - it is an enumerator whose enum type is T or
599 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
600 if (EnumConstantDecl *D
601 = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
602 return cast<EnumDecl>(D->getDeclContext());
603 }
604 return nullptr;
605 }
606
607 // - it is a comma expression whose RHS is an enumerator-like
608 // expression of type T or
609 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
610 if (BO->getOpcode() == BO_Comma)
611 return findEnumForBlockReturn(BO->getRHS());
612 return nullptr;
613 }
614
615 // - it is a statement-expression whose value expression is an
616 // enumerator-like expression of type T or
617 if (StmtExpr *SE = dyn_cast<StmtExpr>(E)) {
618 if (Expr *last = dyn_cast_or_null<Expr>(SE->getSubStmt()->body_back()))
619 return findEnumForBlockReturn(last);
620 return nullptr;
621 }
622
623 // - it is a ternary conditional operator (not the GNU ?:
624 // extension) whose second and third operands are
625 // enumerator-like expressions of type T or
626 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
627 if (EnumDecl *ED = findEnumForBlockReturn(CO->getTrueExpr()))
628 if (ED == findEnumForBlockReturn(CO->getFalseExpr()))
629 return ED;
630 return nullptr;
631 }
632
633 // (implicitly:)
634 // - it is an implicit integral conversion applied to an
635 // enumerator-like expression of type T or
636 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
637 // We can sometimes see integral conversions in valid
638 // enumerator-like expressions.
639 if (ICE->getCastKind() == CK_IntegralCast)
640 return findEnumForBlockReturn(ICE->getSubExpr());
641
642 // Otherwise, just rely on the type.
643 }
644
645 // - it is an expression of that formal enum type.
646 if (auto *ED = E->getType()->getAsEnumDecl())
647 return ED;
648
649 // Otherwise, nope.
650 return nullptr;
651}
652
653/// Attempt to find a type T for which the returned expression of the
654/// given statement is an enumerator-like expression of that type.
656 if (Expr *retValue = ret->getRetValue())
657 return findEnumForBlockReturn(retValue);
658 return nullptr;
659}
660
661/// Attempt to find a common type T for which all of the returned
662/// expressions in a block are enumerator-like expressions of that
663/// type.
665 ArrayRef<ReturnStmt*>::iterator i = returns.begin(), e = returns.end();
666
667 // Try to find one for the first return.
669 if (!ED) return nullptr;
670
671 // Check that the rest of the returns have the same enum.
672 for (++i; i != e; ++i) {
673 if (findEnumForBlockReturn(*i) != ED)
674 return nullptr;
675 }
676
677 // Never infer an anonymous enum type.
678 if (!ED->hasNameForLinkage()) return nullptr;
679
680 return ED;
681}
682
683/// Adjust the given return statements so that they formally return
684/// the given type. It should require, at most, an IntegralCast.
686 QualType returnType) {
688 i = returns.begin(), e = returns.end(); i != e; ++i) {
689 ReturnStmt *ret = *i;
690 Expr *retValue = ret->getRetValue();
691 if (S.Context.hasSameType(retValue->getType(), returnType))
692 continue;
693
694 // Right now we only support integral fixup casts.
695 assert(returnType->isIntegralOrUnscopedEnumerationType());
696 assert(retValue->getType()->isIntegralOrUnscopedEnumerationType());
697
698 ExprWithCleanups *cleanups = dyn_cast<ExprWithCleanups>(retValue);
699
700 Expr *E = (cleanups ? cleanups->getSubExpr() : retValue);
701 E = ImplicitCastExpr::Create(S.Context, returnType, CK_IntegralCast, E,
702 /*base path*/ nullptr, VK_PRValue,
704 if (cleanups) {
705 cleanups->setSubExpr(E);
706 } else {
707 ret->setRetValue(E);
708 }
709 }
710}
711
713 assert(CSI.HasImplicitReturnType);
714 // If it was ever a placeholder, it had to been deduced to DependentTy.
715 assert(CSI.ReturnType.isNull() || !CSI.ReturnType->isUndeducedType());
716 assert((!isa<LambdaScopeInfo>(CSI) || !getLangOpts().CPlusPlus14) &&
717 "lambda expressions use auto deduction in C++14 onwards");
718
719 // C++ core issue 975:
720 // If a lambda-expression does not include a trailing-return-type,
721 // it is as if the trailing-return-type denotes the following type:
722 // - if there are no return statements in the compound-statement,
723 // or all return statements return either an expression of type
724 // void or no expression or braced-init-list, the type void;
725 // - otherwise, if all return statements return an expression
726 // and the types of the returned expressions after
727 // lvalue-to-rvalue conversion (4.1 [conv.lval]),
728 // array-to-pointer conversion (4.2 [conv.array]), and
729 // function-to-pointer conversion (4.3 [conv.func]) are the
730 // same, that common type;
731 // - otherwise, the program is ill-formed.
732 //
733 // C++ core issue 1048 additionally removes top-level cv-qualifiers
734 // from the types of returned expressions to match the C++14 auto
735 // deduction rules.
736 //
737 // In addition, in blocks in non-C++ modes, if all of the return
738 // statements are enumerator-like expressions of some type T, where
739 // T has a name for linkage, then we infer the return type of the
740 // block to be that type.
741
742 // First case: no return statements, implicit void return type.
743 ASTContext &Ctx = getASTContext();
744 if (CSI.Returns.empty()) {
745 // It's possible there were simply no /valid/ return statements.
746 // In this case, the first one we found may have at least given us a type.
747 if (CSI.ReturnType.isNull())
748 CSI.ReturnType = Ctx.VoidTy;
749 return;
750 }
751
752 // Second case: at least one return statement has dependent type.
753 // Delay type checking until instantiation.
754 assert(!CSI.ReturnType.isNull() && "We should have a tentative return type.");
755 if (CSI.ReturnType->isDependentType())
756 return;
757
758 // Try to apply the enum-fuzz rule.
759 if (!getLangOpts().CPlusPlus) {
760 assert(isa<BlockScopeInfo>(CSI));
762 if (ED) {
763 CSI.ReturnType = Context.getCanonicalTagType(ED);
765 return;
766 }
767 }
768
769 // Third case: only one return statement. Don't bother doing extra work!
770 if (CSI.Returns.size() == 1)
771 return;
772
773 // General case: many return statements.
774 // Check that they all have compatible return types.
775
776 // We require the return types to strictly match here.
777 // Note that we've already done the required promotions as part of
778 // processing the return statement.
779 for (const ReturnStmt *RS : CSI.Returns) {
780 const Expr *RetE = RS->getRetValue();
781
782 QualType ReturnType =
783 (RetE ? RetE->getType() : Context.VoidTy).getUnqualifiedType();
784 if (Context.getCanonicalFunctionResultType(ReturnType) ==
785 Context.getCanonicalFunctionResultType(CSI.ReturnType)) {
786 // Use the return type with the strictest possible nullability annotation.
787 auto RetTyNullability = ReturnType->getNullability();
788 auto BlockNullability = CSI.ReturnType->getNullability();
789 if (BlockNullability &&
790 (!RetTyNullability ||
791 hasWeakerNullability(*RetTyNullability, *BlockNullability)))
792 CSI.ReturnType = ReturnType;
793 continue;
794 }
795
796 // FIXME: This is a poor diagnostic for ReturnStmts without expressions.
797 // TODO: It's possible that the *first* return is the divergent one.
798 Diag(RS->getBeginLoc(),
799 diag::err_typecheck_missing_return_type_incompatible)
800 << ReturnType << CSI.ReturnType << isa<LambdaScopeInfo>(CSI);
801 // Continue iterating so that we keep emitting diagnostics.
802 }
803}
804
806 SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc,
807 UnsignedOrNone NumExpansions, IdentifierInfo *Id, bool IsDirectInit,
808 Expr *&Init) {
809 // Create an 'auto' or 'auto&' TypeSourceInfo that we can use to
810 // deduce against.
811 QualType DeductType = Context.getAutoDeductType();
812 TypeLocBuilder TLB;
813 AutoTypeLoc TL = TLB.push<AutoTypeLoc>(DeductType);
814 TL.setNameLoc(Loc);
815 if (ByRef) {
816 DeductType = BuildReferenceType(DeductType, true, Loc, Id);
817 assert(!DeductType.isNull() && "can't build reference to auto");
818 TLB.push<ReferenceTypeLoc>(DeductType).setSigilLoc(Loc);
819 }
820 if (EllipsisLoc.isValid()) {
821 if (Init->containsUnexpandedParameterPack()) {
822 Diag(EllipsisLoc, getLangOpts().CPlusPlus20
823 ? diag::warn_cxx17_compat_init_capture_pack
824 : diag::ext_init_capture_pack);
825 DeductType = Context.getPackExpansionType(DeductType, NumExpansions,
826 /*ExpectPackInType=*/false);
827 TLB.push<PackExpansionTypeLoc>(DeductType).setEllipsisLoc(EllipsisLoc);
828 } else {
829 // Just ignore the ellipsis for now and form a non-pack variable. We'll
830 // diagnose this later when we try to capture it.
831 }
832 }
833 TypeSourceInfo *TSI = TLB.getTypeSourceInfo(Context, DeductType);
834
835 // Deduce the type of the init capture.
837 /*VarDecl*/nullptr, DeclarationName(Id), DeductType, TSI,
838 SourceRange(Loc, Loc), IsDirectInit, Init);
839 if (DeducedType.isNull())
840 return QualType();
841
842 // Are we a non-list direct initialization?
843 ParenListExpr *CXXDirectInit = dyn_cast<ParenListExpr>(Init);
844
845 // Perform initialization analysis and ensure any implicit conversions
846 // (such as lvalue-to-rvalue) are enforced.
847 InitializedEntity Entity =
848 InitializedEntity::InitializeLambdaCapture(Id, DeducedType, Loc);
849 InitializationKind Kind =
850 IsDirectInit
851 ? (CXXDirectInit ? InitializationKind::CreateDirect(
852 Loc, Init->getBeginLoc(), Init->getEndLoc())
854 : InitializationKind::CreateCopy(Loc, Init->getBeginLoc());
855
856 MultiExprArg Args = Init;
857 if (CXXDirectInit)
858 Args =
859 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
860 QualType DclT;
861 InitializationSequence InitSeq(*this, Entity, Kind, Args);
862 ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Args, &DclT);
863
864 if (Result.isInvalid())
865 return QualType();
866
867 Init = Result.getAs<Expr>();
868 return DeducedType;
869}
870
872 SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc,
873 IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx) {
874 // FIXME: Retain the TypeSourceInfo from buildLambdaInitCaptureInitialization
875 // rather than reconstructing it here.
876 TypeSourceInfo *TSI = Context.getTrivialTypeSourceInfo(InitCaptureType, Loc);
877 if (auto PETL = TSI->getTypeLoc().getAs<PackExpansionTypeLoc>())
878 PETL.setEllipsisLoc(EllipsisLoc);
879
880 // Create a dummy variable representing the init-capture. This is not actually
881 // used as a variable, and only exists as a way to name and refer to the
882 // init-capture.
883 // FIXME: Pass in separate source locations for '&' and identifier.
884 VarDecl *NewVD = VarDecl::Create(Context, DeclCtx, Loc, Loc, Id,
885 InitCaptureType, TSI, SC_Auto);
886 NewVD->setInitCapture(true);
887 NewVD->setReferenced(true);
888 // FIXME: Pass in a VarDecl::InitializationStyle.
889 NewVD->setInitStyle(static_cast<VarDecl::InitializationStyle>(InitStyle));
890 NewVD->markUsed(Context);
891 NewVD->setInit(Init);
892 if (NewVD->isParameterPack())
893 getCurLambda()->LocalPacks.push_back(NewVD);
894 return NewVD;
895}
896
897void Sema::addInitCapture(LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef) {
898 assert(Var->isInitCapture() && "init capture flag should be set");
899 LSI->addCapture(Var, /*isBlock=*/false, ByRef,
900 /*isNested=*/false, Var->getLocation(), SourceLocation(),
901 Var->getType(), /*Invalid=*/false);
902}
903
904// Unlike getCurLambda, getCurrentLambdaScopeUnsafe doesn't
905// check that the current lambda is in a consistent or fully constructed state.
907 assert(!S.FunctionScopes.empty());
909}
910
911static TypeSourceInfo *
913 // C++11 [expr.prim.lambda]p4:
914 // If a lambda-expression does not include a lambda-declarator, it is as
915 // if the lambda-declarator were ().
917 /*IsVariadic=*/false, /*IsCXXMethod=*/true));
918 EPI.HasTrailingReturn = true;
919 EPI.TypeQuals.addConst();
921 if (AS != LangAS::Default)
923
924 // C++1y [expr.prim.lambda]:
925 // The lambda return type is 'auto', which is replaced by the
926 // trailing-return type if provided and/or deduced from 'return'
927 // statements
928 // We don't do this before C++1y, because we don't support deduced return
929 // types there.
930 QualType DefaultTypeForNoTrailingReturn = S.getLangOpts().CPlusPlus14
933 QualType MethodTy =
934 S.Context.getFunctionType(DefaultTypeForNoTrailingReturn, {}, EPI);
935 return S.Context.getTrivialTypeSourceInfo(MethodTy, Loc);
936}
937
939 Declarator &ParamInfo, Scope *CurScope,
940 SourceLocation Loc,
941 bool &ExplicitResultType) {
942
943 ExplicitResultType = false;
944
945 assert(
946 (ParamInfo.getDeclSpec().getStorageClassSpec() ==
949 "Unexpected storage specifier");
950 bool IsLambdaStatic =
952
953 TypeSourceInfo *MethodTyInfo;
954
955 if (ParamInfo.getNumTypeObjects() == 0) {
956 MethodTyInfo = getDummyLambdaType(S, Loc);
957 } else {
958 // Check explicit parameters
959 S.CheckExplicitObjectLambda(ParamInfo);
960
962
963 bool HasExplicitObjectParameter =
965
966 ExplicitResultType = FTI.hasTrailingReturnType();
967 if (!FTI.hasMutableQualifier() && !IsLambdaStatic &&
968 !HasExplicitObjectParameter)
970
971 if (ExplicitResultType && S.getLangOpts().HLSL) {
972 QualType RetTy = FTI.getTrailingReturnType().get();
973 if (!RetTy.isNull()) {
974 // HLSL does not support specifying an address space on a lambda return
975 // type.
976 LangAS AddressSpace = RetTy.getAddressSpace();
977 if (AddressSpace != LangAS::Default)
979 diag::err_return_value_with_address_space);
980 }
981 }
982
983 MethodTyInfo = S.GetTypeForDeclarator(ParamInfo);
984 assert(MethodTyInfo && "no type from lambda-declarator");
985
986 // Check for unexpanded parameter packs in the method type.
987 if (MethodTyInfo->getType()->containsUnexpandedParameterPack())
988 S.DiagnoseUnexpandedParameterPack(Intro.Range.getBegin(), MethodTyInfo,
990 }
991 return MethodTyInfo;
992}
993
996
997 // C++20 [expr.prim.lambda.closure]p3:
998 // The closure type for a lambda-expression has a public inline function
999 // call operator (for a non-generic lambda) or function call operator
1000 // template (for a generic lambda) whose parameters and return type are
1001 // described by the lambda-expression's parameter-declaration-clause
1002 // and trailing-return-type respectively.
1003 DeclarationName MethodName =
1004 Context.DeclarationNames.getCXXOperatorName(OO_Call);
1005 DeclarationNameLoc MethodNameLoc =
1009 DeclarationNameInfo(MethodName, IntroducerRange.getBegin(),
1010 MethodNameLoc),
1011 QualType(), /*Tinfo=*/nullptr, SC_None,
1012 getCurFPFeatures().isFPConstrained(),
1013 /*isInline=*/true, ConstexprSpecKind::Unspecified, SourceLocation(),
1014 /*TrailingRequiresClause=*/{});
1015 Method->setAccess(AS_public);
1016 return Method;
1017}
1018
1020 CXXMethodDecl *CallOperator, CXXRecordDecl *Class,
1021 TemplateParameterList *TemplateParams) {
1022 assert(TemplateParams && "no template parameters");
1024 Context, Class, CallOperator->getLocation(), CallOperator->getDeclName(),
1025 TemplateParams, CallOperator);
1026 TemplateMethod->setAccess(AS_public);
1027 CallOperator->setDescribedFunctionTemplate(TemplateMethod);
1028}
1029
1032 SourceLocation CallOperatorLoc,
1033 const AssociatedConstraint &TrailingRequiresClause,
1034 TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind,
1036 bool HasExplicitResultType) {
1037
1039
1040 if (TrailingRequiresClause)
1041 Method->setTrailingRequiresClause(TrailingRequiresClause);
1042
1043 TemplateParameterList *TemplateParams =
1045
1046 DeclContext *DC = Method->getLexicalDeclContext();
1047 // DeclContext::addDecl() assumes that the DeclContext we're adding to is the
1048 // lexical context of the Method. Do so.
1049 Method->setLexicalDeclContext(LSI->Lambda);
1050 if (TemplateParams) {
1051 FunctionTemplateDecl *TemplateMethod =
1052 Method->getDescribedFunctionTemplate();
1053 assert(TemplateMethod &&
1054 "AddTemplateParametersToLambdaCallOperator should have been called");
1055
1056 LSI->Lambda->addDecl(TemplateMethod);
1057 TemplateMethod->setLexicalDeclContext(DC);
1058 } else {
1059 LSI->Lambda->addDecl(Method);
1060 }
1061 LSI->Lambda->setLambdaIsGeneric(TemplateParams);
1062 LSI->Lambda->setLambdaTypeInfo(MethodTyInfo);
1063
1064 Method->setLexicalDeclContext(DC);
1065 Method->setLocation(LambdaLoc);
1066 Method->setInnerLocStart(CallOperatorLoc);
1067 Method->setTypeSourceInfo(MethodTyInfo);
1068 Method->setType(buildTypeForLambdaCallOperator(*this, LSI->Lambda,
1069 TemplateParams, MethodTyInfo));
1070 Method->setConstexprKind(ConstexprKind);
1071 Method->setStorageClass(SC);
1072 if (!Params.empty()) {
1073 CheckParmsForFunctionDef(Params, /*CheckParameterNames=*/false);
1074 Method->setParams(Params);
1075 for (auto P : Method->parameters()) {
1076 assert(P && "null in a parameter list");
1077 P->setOwningFunction(Method);
1078 }
1079 }
1080
1081 buildLambdaScopeReturnType(*this, LSI, Method, HasExplicitResultType);
1082}
1083
1085 Scope *CurrentScope) {
1086
1088 assert(LSI && "LambdaScopeInfo should be on stack!");
1089
1090 if (Intro.Default == LCD_ByCopy)
1091 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByval;
1092 else if (Intro.Default == LCD_ByRef)
1093 LSI->ImpCaptureStyle = LambdaScopeInfo::ImpCap_LambdaByref;
1094 LSI->CaptureDefaultLoc = Intro.DefaultLoc;
1095 LSI->IntroducerRange = Intro.Range;
1096 LSI->AfterParameterList = false;
1097
1098 assert(LSI->NumExplicitTemplateParams == 0);
1099
1100 // Determine if we're within a context where we know that the lambda will
1101 // be dependent, because there are template parameters in scope.
1102 CXXRecordDecl::LambdaDependencyKind LambdaDependencyKind =
1104 if (CurScope->getTemplateParamParent() != nullptr) {
1105 LambdaDependencyKind = CXXRecordDecl::LDK_AlwaysDependent;
1106 } else if (Scope *ParentScope = CurScope->getParent()) {
1107 // Given a lambda defined inside a requires expression,
1108 //
1109 // struct S {
1110 // S(auto var) requires requires { [&] -> decltype(var) { }; }
1111 // {}
1112 // };
1113 //
1114 // The parameter var is not injected into the function Decl at the point of
1115 // parsing lambda. In such scenarios, perceiving it as dependent could
1116 // result in the constraint being evaluated, which matches what GCC does.
1117 Scope *LookupScope = ParentScope;
1118 while (LookupScope->getEntity() &&
1119 LookupScope->getEntity()->isRequiresExprBody())
1120 LookupScope = LookupScope->getParent();
1121
1122 if (LookupScope != ParentScope &&
1123 LookupScope->isFunctionDeclarationScope() &&
1124 llvm::any_of(LookupScope->decls(), [](Decl *D) {
1125 return isa<ParmVarDecl>(D) &&
1126 cast<ParmVarDecl>(D)->getType()->isTemplateTypeParmType();
1127 }))
1128 LambdaDependencyKind = CXXRecordDecl::LDK_AlwaysDependent;
1129 }
1130
1132 Intro.Range, /*Info=*/nullptr, LambdaDependencyKind, Intro.Default);
1133 LSI->Lambda = Class;
1134
1136 LSI->CallOperator = Method;
1137 // Temporarily set the lexical declaration context to the current
1138 // context, so that the Scope stack matches the lexical nesting.
1139 Method->setLexicalDeclContext(CurContext);
1140
1141 PushDeclContext(CurScope, Method);
1142
1143 bool ContainsUnexpandedParameterPack = false;
1144
1145 // Distinct capture names, for diagnostics.
1146 llvm::DenseMap<IdentifierInfo *, ValueDecl *> CaptureNames;
1147
1148 // Handle explicit captures.
1149 SourceLocation PrevCaptureLoc =
1150 Intro.Default == LCD_None ? Intro.Range.getBegin() : Intro.DefaultLoc;
1151 for (auto C = Intro.Captures.begin(), E = Intro.Captures.end(); C != E;
1152 PrevCaptureLoc = C->Loc, ++C) {
1153 if (C->Kind == LCK_This || C->Kind == LCK_StarThis) {
1154 if (C->Kind == LCK_StarThis)
1155 Diag(C->Loc, !getLangOpts().CPlusPlus17
1156 ? diag::ext_star_this_lambda_capture_cxx17
1157 : diag::warn_cxx14_compat_star_this_lambda_capture);
1158
1159 // C++11 [expr.prim.lambda]p8:
1160 // An identifier or this shall not appear more than once in a
1161 // lambda-capture.
1162 if (LSI->isCXXThisCaptured()) {
1163 Diag(C->Loc, diag::err_capture_more_than_once)
1164 << "'this'" << SourceRange(LSI->getCXXThisCapture().getLocation())
1166 SourceRange(getLocForEndOfToken(PrevCaptureLoc), C->Loc));
1167 continue;
1168 }
1169
1170 // C++20 [expr.prim.lambda]p8:
1171 // If a lambda-capture includes a capture-default that is =,
1172 // each simple-capture of that lambda-capture shall be of the form
1173 // "&identifier", "this", or "* this". [ Note: The form [&,this] is
1174 // redundant but accepted for compatibility with ISO C++14. --end note ]
1175 if (Intro.Default == LCD_ByCopy && C->Kind != LCK_StarThis)
1176 Diag(C->Loc, !getLangOpts().CPlusPlus20
1177 ? diag::ext_equals_this_lambda_capture_cxx20
1178 : diag::warn_cxx17_compat_equals_this_lambda_capture);
1179
1180 // C++11 [expr.prim.lambda]p12:
1181 // If this is captured by a local lambda expression, its nearest
1182 // enclosing function shall be a non-static member function.
1183 QualType ThisCaptureType = getCurrentThisType();
1184 if (ThisCaptureType.isNull()) {
1185 Diag(C->Loc, diag::err_this_capture) << true;
1186 continue;
1187 }
1188
1189 CheckCXXThisCapture(C->Loc, /*Explicit=*/true, /*BuildAndDiagnose*/ true,
1190 /*FunctionScopeIndexToStopAtPtr*/ nullptr,
1191 C->Kind == LCK_StarThis);
1192 if (!LSI->Captures.empty())
1193 LSI->ExplicitCaptureRanges[LSI->Captures.size() - 1] = C->ExplicitRange;
1194 continue;
1195 }
1196
1197 assert(C->Id && "missing identifier for capture");
1198
1199 if (C->Init.isInvalid())
1200 continue;
1201
1202 ValueDecl *Var = nullptr;
1203 if (C->Init.isUsable()) {
1205 ? diag::warn_cxx11_compat_init_capture
1206 : diag::ext_init_capture);
1207
1208 // If the initializer expression is usable, but the InitCaptureType
1209 // is not, then an error has occurred - so ignore the capture for now.
1210 // for e.g., [n{0}] { }; <-- if no <initializer_list> is included.
1211 // FIXME: we should create the init capture variable and mark it invalid
1212 // in this case.
1213 if (C->InitCaptureType.get().isNull())
1214 continue;
1215
1216 if (C->Init.get()->containsUnexpandedParameterPack() &&
1217 !C->InitCaptureType.get()->getAs<PackExpansionType>())
1219
1220 unsigned InitStyle;
1221 switch (C->InitKind) {
1223 llvm_unreachable("not an init-capture?");
1225 InitStyle = VarDecl::CInit;
1226 break;
1228 InitStyle = VarDecl::CallInit;
1229 break;
1231 InitStyle = VarDecl::ListInit;
1232 break;
1233 }
1234 Var = createLambdaInitCaptureVarDecl(C->Loc, C->InitCaptureType.get(),
1235 C->EllipsisLoc, C->Id, InitStyle,
1236 C->Init.get(), Method);
1237 assert(Var && "createLambdaInitCaptureVarDecl returned a null VarDecl?");
1238 if (auto *V = dyn_cast<VarDecl>(Var))
1239 CheckShadow(CurrentScope, V);
1240 PushOnScopeChains(Var, CurrentScope, false);
1241 } else {
1242 assert(C->InitKind == LambdaCaptureInitKind::NoInit &&
1243 "init capture has valid but null init?");
1244
1245 // C++11 [expr.prim.lambda]p8:
1246 // If a lambda-capture includes a capture-default that is &, the
1247 // identifiers in the lambda-capture shall not be preceded by &.
1248 // If a lambda-capture includes a capture-default that is =, [...]
1249 // each identifier it contains shall be preceded by &.
1250 if (C->Kind == LCK_ByRef && Intro.Default == LCD_ByRef) {
1251 Diag(C->Loc, diag::err_reference_capture_with_reference_default)
1253 SourceRange(getLocForEndOfToken(PrevCaptureLoc), C->Loc));
1254 continue;
1255 } else if (C->Kind == LCK_ByCopy && Intro.Default == LCD_ByCopy) {
1256 Diag(C->Loc, diag::err_copy_capture_with_copy_default)
1258 SourceRange(getLocForEndOfToken(PrevCaptureLoc), C->Loc));
1259 continue;
1260 }
1261
1262 // C++11 [expr.prim.lambda]p10:
1263 // The identifiers in a capture-list are looked up using the usual
1264 // rules for unqualified name lookup (3.4.1)
1265 DeclarationNameInfo Name(C->Id, C->Loc);
1266 LookupResult R(*this, Name, LookupOrdinaryName);
1267 LookupName(R, CurScope);
1268 if (R.isAmbiguous())
1269 continue;
1270 if (R.empty()) {
1271 // FIXME: Disable corrections that would add qualification?
1272 CXXScopeSpec ScopeSpec;
1273 DeclFilterCCC<VarDecl> Validator{};
1274 if (DiagnoseEmptyLookup(CurScope, ScopeSpec, R, Validator))
1275 continue;
1276 }
1277
1278 if (auto *BD = R.getAsSingle<BindingDecl>())
1279 Var = BD;
1280 else if (R.getAsSingle<FieldDecl>()) {
1281 Diag(C->Loc, diag::err_capture_class_member_does_not_name_variable)
1282 << C->Id;
1283 continue;
1284 } else
1285 Var = R.getAsSingle<VarDecl>();
1286 if (Var && DiagnoseUseOfDecl(Var, C->Loc))
1287 continue;
1288 }
1289
1290 // C++11 [expr.prim.lambda]p10:
1291 // [...] each such lookup shall find a variable with automatic storage
1292 // duration declared in the reaching scope of the local lambda expression.
1293 // Note that the 'reaching scope' check happens in tryCaptureVariable().
1294 if (!Var) {
1295 Diag(C->Loc, diag::err_capture_does_not_name_variable) << C->Id;
1296 continue;
1297 }
1298
1299 // C++11 [expr.prim.lambda]p8:
1300 // An identifier or this shall not appear more than once in a
1301 // lambda-capture.
1302 if (auto [It, Inserted] = CaptureNames.insert(std::pair{C->Id, Var});
1303 !Inserted) {
1304 if (C->InitKind == LambdaCaptureInitKind::NoInit &&
1305 !Var->isInitCapture()) {
1306 Diag(C->Loc, diag::err_capture_more_than_once)
1307 << C->Id << It->second->getBeginLoc()
1309 SourceRange(getLocForEndOfToken(PrevCaptureLoc), C->Loc));
1310 Var->setInvalidDecl();
1311 } else if (Var && Var->isPlaceholderVar(getLangOpts())) {
1313 } else {
1314 // Previous capture captured something different (one or both was
1315 // an init-capture): no fixit.
1316 Diag(C->Loc, diag::err_capture_more_than_once) << C->Id;
1317 continue;
1318 }
1319 }
1320
1321 // Ignore invalid decls; they'll just confuse the code later.
1322 if (Var->isInvalidDecl())
1323 continue;
1324
1325 VarDecl *Underlying = Var->getPotentiallyDecomposedVarDecl();
1326
1327 if (!Underlying->hasLocalStorage()) {
1328 Diag(C->Loc, diag::err_capture_non_automatic_variable) << C->Id;
1329 Diag(Var->getLocation(), diag::note_previous_decl) << C->Id;
1330 continue;
1331 }
1332
1333 // C++11 [expr.prim.lambda]p23:
1334 // A capture followed by an ellipsis is a pack expansion (14.5.3).
1335 SourceLocation EllipsisLoc;
1336 if (C->EllipsisLoc.isValid()) {
1337 if (Var->isParameterPack()) {
1338 EllipsisLoc = C->EllipsisLoc;
1339 } else {
1340 Diag(C->EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
1341 << (C->Init.isUsable() ? C->Init.get()->getSourceRange()
1342 : SourceRange(C->Loc));
1343
1344 // Just ignore the ellipsis.
1345 }
1346 } else if (Var->isParameterPack()) {
1347 ContainsUnexpandedParameterPack = true;
1348 }
1349
1350 if (C->Init.isUsable()) {
1351 addInitCapture(LSI, cast<VarDecl>(Var), C->Kind == LCK_ByRef);
1352 } else {
1353 TryCaptureKind Kind = C->Kind == LCK_ByRef
1356 tryCaptureVariable(Var, C->Loc, Kind, EllipsisLoc);
1357 }
1358 if (!LSI->Captures.empty())
1359 LSI->ExplicitCaptureRanges[LSI->Captures.size() - 1] = C->ExplicitRange;
1360 }
1362 LSI->ContainsUnexpandedParameterPack |= ContainsUnexpandedParameterPack;
1364}
1365
1367 SourceLocation MutableLoc) {
1368
1370 LSI->Mutable = MutableLoc.isValid();
1371 ContextRAII Context(*this, LSI->CallOperator, /*NewThisContext*/ false);
1372
1373 // C++11 [expr.prim.lambda]p9:
1374 // A lambda-expression whose smallest enclosing scope is a block scope is a
1375 // local lambda expression; any other lambda expression shall not have a
1376 // capture-default or simple-capture in its lambda-introducer.
1377 //
1378 // For simple-captures, this is covered by the check below that any named
1379 // entity is a variable that can be captured.
1380 //
1381 // For DR1632, we also allow a capture-default in any context where we can
1382 // odr-use 'this' (in particular, in a default initializer for a non-static
1383 // data member).
1384 if (Intro.Default != LCD_None &&
1385 !LSI->Lambda->getParent()->isFunctionOrMethod() &&
1386 (getCurrentThisType().isNull() ||
1387 CheckCXXThisCapture(SourceLocation(), /*Explicit=*/true,
1388 /*BuildAndDiagnose=*/false)))
1389 Diag(Intro.DefaultLoc, diag::err_capture_default_non_local);
1390}
1391
1395 PushDeclContext(LambdaScope, LSI->CallOperator);
1396
1397 for (const DeclaratorChunk::ParamInfo &P : Params) {
1398 auto *Param = cast<ParmVarDecl>(P.Param);
1399 Param->setOwningFunction(LSI->CallOperator);
1400 if (Param->getIdentifier())
1401 PushOnScopeChains(Param, LambdaScope, false);
1402 }
1403
1404 // After the parameter list, we may parse a noexcept/requires/trailing return
1405 // type which need to know whether the call operator constiture a dependent
1406 // context, so we need to setup the FunctionTemplateDecl of generic lambdas
1407 // now.
1408 TemplateParameterList *TemplateParams =
1410 if (TemplateParams) {
1412 TemplateParams);
1413 LSI->Lambda->setLambdaIsGeneric(true);
1415 TemplateParams->containsUnexpandedParameterPack();
1416 }
1417 LSI->AfterParameterList = true;
1418}
1419
1421 Declarator &ParamInfo,
1422 const DeclSpec &DS) {
1423
1426
1428 bool ExplicitResultType;
1429
1430 SourceLocation TypeLoc, CallOperatorLoc;
1431 if (ParamInfo.getNumTypeObjects() == 0) {
1432 CallOperatorLoc = TypeLoc = Intro.Range.getEnd();
1433 } else {
1434 unsigned Index;
1435 ParamInfo.isFunctionDeclarator(Index);
1436 const auto &Object = ParamInfo.getTypeObject(Index);
1437 TypeLoc =
1438 Object.Loc.isValid() ? Object.Loc : ParamInfo.getSourceRange().getEnd();
1439 CallOperatorLoc = ParamInfo.getSourceRange().getEnd();
1440 }
1441
1442 CXXRecordDecl *Class = LSI->Lambda;
1444
1445 TypeSourceInfo *MethodTyInfo = getLambdaType(
1446 *this, Intro, ParamInfo, getCurScope(), TypeLoc, ExplicitResultType);
1447
1448 if (ParamInfo.isFunctionDeclarator() != 0) {
1449 const auto &FTI = ParamInfo.getFunctionTypeInfo();
1450 LSI->ExplicitParams = FTI.getLParenLoc().isValid();
1451 if (!FTIHasSingleVoidParameter(FTI)) {
1452 Params.reserve(Params.size());
1453 for (unsigned I = 0; I < FTI.NumParams; ++I) {
1454 auto *Param = cast<ParmVarDecl>(FTI.Params[I].Param);
1455 Param->setScopeInfo(0, Params.size());
1456 Params.push_back(Param);
1457 }
1458 }
1459 }
1460
1461 bool IsLambdaStatic =
1463
1465 Method, Intro.Range.getBegin(), CallOperatorLoc,
1466 AssociatedConstraint(ParamInfo.getTrailingRequiresClause()), MethodTyInfo,
1467 ParamInfo.getDeclSpec().getConstexprSpecifier(),
1468 IsLambdaStatic ? SC_Static : SC_None, Params, ExplicitResultType);
1469
1471
1472 // This represents the function body for the lambda function, check if we
1473 // have to apply optnone due to a pragma.
1475
1476 // code_seg attribute on lambda apply to the method.
1478 Method, /*IsDefinition=*/true))
1479 Method->addAttr(A);
1480
1481 // Attributes on the lambda apply to the method.
1482 ProcessDeclAttributes(CurScope, Method, ParamInfo);
1483
1484 if (Context.getTargetInfo().getTriple().isAArch64())
1486
1487 // CUDA lambdas get implicit host and device attributes.
1488 if (getLangOpts().CUDA)
1490
1491 // OpenMP lambdas might get assumumption attributes.
1492 if (LangOpts.OpenMP)
1494
1496
1497 for (auto &&C : LSI->Captures) {
1498 if (!C.isVariableCapture())
1499 continue;
1500 ValueDecl *Var = C.getVariable();
1501 if (Var && Var->isInitCapture()) {
1502 PushOnScopeChains(Var, CurScope, false);
1503 }
1504 }
1505
1506 auto CheckRedefinition = [&](ParmVarDecl *Param) {
1507 for (const auto &Capture : Intro.Captures) {
1508 if (Capture.Id == Param->getIdentifier()) {
1509 Diag(Param->getLocation(), diag::err_parameter_shadow_capture);
1510 Diag(Capture.Loc, diag::note_var_explicitly_captured_here)
1511 << Capture.Id << true;
1512 return false;
1513 }
1514 }
1515 return true;
1516 };
1517
1518 for (ParmVarDecl *P : Params) {
1519 if (!P->getIdentifier())
1520 continue;
1521 if (CheckRedefinition(P))
1522 CheckShadow(CurScope, P);
1523 PushOnScopeChains(P, CurScope);
1524 }
1525
1526 // C++23 [expr.prim.lambda.capture]p5:
1527 // If an identifier in a capture appears as the declarator-id of a parameter
1528 // of the lambda-declarator's parameter-declaration-clause or as the name of a
1529 // template parameter of the lambda-expression's template-parameter-list, the
1530 // program is ill-formed.
1531 TemplateParameterList *TemplateParams =
1533 if (TemplateParams) {
1534 for (const auto *TP : TemplateParams->asArray()) {
1535 if (!TP->getIdentifier())
1536 continue;
1537 for (const auto &Capture : Intro.Captures) {
1538 if (Capture.Id == TP->getIdentifier()) {
1539 Diag(Capture.Loc, diag::err_template_param_shadow) << Capture.Id;
1541 }
1542 }
1543 }
1544 }
1545
1546 // C++20: dcl.decl.general p4:
1547 // The optional requires-clause ([temp.pre]) in an init-declarator or
1548 // member-declarator shall be present only if the declarator declares a
1549 // templated function ([dcl.fct]).
1550 if (const AssociatedConstraint &TRC = Method->getTrailingRequiresClause()) {
1551 // [temp.pre]/8:
1552 // An entity is templated if it is
1553 // - a template,
1554 // - an entity defined ([basic.def]) or created ([class.temporary]) in a
1555 // templated entity,
1556 // - a member of a templated entity,
1557 // - an enumerator for an enumeration that is a templated entity, or
1558 // - the closure type of a lambda-expression ([expr.prim.lambda.closure])
1559 // appearing in the declaration of a templated entity. [Note 6: A local
1560 // class, a local or block variable, or a friend function defined in a
1561 // templated entity is a templated entity. — end note]
1562 //
1563 // A templated function is a function template or a function that is
1564 // templated. A templated class is a class template or a class that is
1565 // templated. A templated variable is a variable template or a variable
1566 // that is templated.
1567
1568 // Note: we only have to check if this is defined in a template entity, OR
1569 // if we are a template, since the rest don't apply. The requires clause
1570 // applies to the call operator, which we already know is a member function,
1571 // AND defined.
1572 if (!Method->getDescribedFunctionTemplate() && !Method->isTemplated()) {
1573 Diag(TRC.ConstraintExpr->getBeginLoc(),
1574 diag::err_constrained_non_templated_function);
1575 }
1576 }
1577
1578 // Enter a new evaluation context to insulate the lambda from any
1579 // cleanups from the enclosing full-expression.
1582}
1583
1585 bool IsInstantiation) {
1587
1588 // Leave the expression-evaluation context.
1591
1592 // Leave the context of the lambda.
1593 if (!IsInstantiation)
1595
1596 // Finalize the lambda.
1597 CXXRecordDecl *Class = LSI->Lambda;
1598 Class->setInvalidDecl();
1599 SmallVector<Decl*, 4> Fields(Class->fields());
1600 ActOnFields(nullptr, Class->getLocation(), Class, Fields, SourceLocation(),
1602 CheckCompletedCXXClass(nullptr, Class);
1603
1605}
1606
1607template <typename Func>
1609 Sema &S, const FunctionProtoType &CallOpProto, Func F) {
1611 CallOpProto.isVariadic(), /*IsCXXMethod=*/false);
1613 CallOpProto.isVariadic(), /*IsCXXMethod=*/true);
1614 CallingConv CallOpCC = CallOpProto.getCallConv();
1615
1616 /// Implement emitting a version of the operator for many of the calling
1617 /// conventions for MSVC, as described here:
1618 /// https://devblogs.microsoft.com/oldnewthing/20150220-00/?p=44623.
1619 /// Experimentally, we determined that cdecl, stdcall, fastcall, and
1620 /// vectorcall are generated by MSVC when it is supported by the target.
1621 /// Additionally, we are ensuring that the default-free/default-member and
1622 /// call-operator calling convention are generated as well.
1623 /// NOTE: We intentionally generate a 'thiscall' on Win32 implicitly from the
1624 /// 'member default', despite MSVC not doing so. We do this in order to ensure
1625 /// that someone who intentionally places 'thiscall' on the lambda call
1626 /// operator will still get that overload, since we don't have the a way of
1627 /// detecting the attribute by the time we get here.
1628 if (S.getLangOpts().MSVCCompat) {
1629 CallingConv Convs[] = {
1631 DefaultFree, DefaultMember, CallOpCC};
1632 llvm::sort(Convs);
1633 llvm::iterator_range<CallingConv *> Range(std::begin(Convs),
1634 llvm::unique(Convs));
1635 const TargetInfo &TI = S.getASTContext().getTargetInfo();
1636
1637 for (CallingConv C : Range) {
1639 F(C);
1640 }
1641 return;
1642 }
1643
1644 if (CallOpCC == DefaultMember && DefaultMember != DefaultFree) {
1645 F(DefaultFree);
1646 F(DefaultMember);
1647 } else {
1648 F(CallOpCC);
1649 }
1650}
1651
1652// Returns the 'standard' calling convention to be used for the lambda
1653// conversion function, that is, the 'free' function calling convention unless
1654// it is overridden by a non-default calling convention attribute.
1655static CallingConv
1657 const FunctionProtoType *CallOpProto) {
1659 CallOpProto->isVariadic(), /*IsCXXMethod=*/false);
1661 CallOpProto->isVariadic(), /*IsCXXMethod=*/true);
1662 CallingConv CallOpCC = CallOpProto->getCallConv();
1663
1664 // If the call-operator hasn't been changed, return both the 'free' and
1665 // 'member' function calling convention.
1666 if (CallOpCC == DefaultMember && DefaultMember != DefaultFree)
1667 return DefaultFree;
1668 return CallOpCC;
1669}
1670
1672 const FunctionProtoType *CallOpProto, CallingConv CC) {
1673 const FunctionProtoType::ExtProtoInfo CallOpExtInfo =
1674 CallOpProto->getExtProtoInfo();
1675 FunctionProtoType::ExtProtoInfo InvokerExtInfo = CallOpExtInfo;
1676 InvokerExtInfo.ExtInfo = InvokerExtInfo.ExtInfo.withCallingConv(CC);
1677 InvokerExtInfo.TypeQuals = Qualifiers();
1678 assert(InvokerExtInfo.RefQualifier == RQ_None &&
1679 "Lambda's call operator should not have a reference qualifier");
1680 return Context.getFunctionType(CallOpProto->getReturnType(),
1681 CallOpProto->getParamTypes(), InvokerExtInfo);
1682}
1683
1684/// Add a lambda's conversion to function pointer, as described in
1685/// C++11 [expr.prim.lambda]p6.
1686static void addFunctionPointerConversion(Sema &S, SourceRange IntroducerRange,
1687 CXXRecordDecl *Class,
1688 CXXMethodDecl *CallOperator,
1689 QualType InvokerFunctionTy) {
1690 // This conversion is explicitly disabled if the lambda's function has
1691 // pass_object_size attributes on any of its parameters.
1692 auto HasPassObjectSizeAttr = [](const ParmVarDecl *P) {
1693 return P->hasAttr<PassObjectSizeAttr>();
1694 };
1695 if (llvm::any_of(CallOperator->parameters(), HasPassObjectSizeAttr))
1696 return;
1697
1698 // Add the conversion to function pointer.
1699 QualType PtrToFunctionTy = S.Context.getPointerType(InvokerFunctionTy);
1700
1701 // Create the type of the conversion function.
1704 /*IsVariadic=*/false, /*IsCXXMethod=*/true));
1705 // The conversion function is always const and noexcept.
1706 ConvExtInfo.TypeQuals = Qualifiers();
1707 ConvExtInfo.TypeQuals.addConst();
1708 ConvExtInfo.ExceptionSpec.Type = EST_BasicNoexcept;
1709 QualType ConvTy = S.Context.getFunctionType(PtrToFunctionTy, {}, ConvExtInfo);
1710
1711 SourceLocation Loc = IntroducerRange.getBegin();
1712 DeclarationName ConversionName
1714 S.Context.getCanonicalType(PtrToFunctionTy));
1715 // Construct a TypeSourceInfo for the conversion function, and wire
1716 // all the parameters appropriately for the FunctionProtoTypeLoc
1717 // so that everything works during transformation/instantiation of
1718 // generic lambdas.
1719 // The main reason for wiring up the parameters of the conversion
1720 // function with that of the call operator is so that constructs
1721 // like the following work:
1722 // auto L = [](auto b) { <-- 1
1723 // return [](auto a) -> decltype(a) { <-- 2
1724 // return a;
1725 // };
1726 // };
1727 // int (*fp)(int) = L(5);
1728 // Because the trailing return type can contain DeclRefExprs that refer
1729 // to the original call operator's variables, we hijack the call
1730 // operators ParmVarDecls below.
1731 TypeSourceInfo *ConvNamePtrToFunctionTSI =
1732 S.Context.getTrivialTypeSourceInfo(PtrToFunctionTy, Loc);
1733 DeclarationNameLoc ConvNameLoc =
1734 DeclarationNameLoc::makeNamedTypeLoc(ConvNamePtrToFunctionTSI);
1735
1736 // The conversion function is a conversion to a pointer-to-function.
1737 TypeSourceInfo *ConvTSI = S.Context.getTrivialTypeSourceInfo(ConvTy, Loc);
1738 FunctionProtoTypeLoc ConvTL =
1740 // Get the result of the conversion function which is a pointer-to-function.
1741 PointerTypeLoc PtrToFunctionTL =
1742 ConvTL.getReturnLoc().getAs<PointerTypeLoc>();
1743 // Do the same for the TypeSourceInfo that is used to name the conversion
1744 // operator.
1745 PointerTypeLoc ConvNamePtrToFunctionTL =
1746 ConvNamePtrToFunctionTSI->getTypeLoc().getAs<PointerTypeLoc>();
1747
1748 // Get the underlying function types that the conversion function will
1749 // be converting to (should match the type of the call operator).
1750 FunctionProtoTypeLoc CallOpConvTL =
1751 PtrToFunctionTL.getPointeeLoc().getAs<FunctionProtoTypeLoc>();
1752 FunctionProtoTypeLoc CallOpConvNameTL =
1753 ConvNamePtrToFunctionTL.getPointeeLoc().getAs<FunctionProtoTypeLoc>();
1754
1755 // Wire up the FunctionProtoTypeLocs with the call operator's parameters.
1756 // These parameter's are essentially used to transform the name and
1757 // the type of the conversion operator. By using the same parameters
1758 // as the call operator's we don't have to fix any back references that
1759 // the trailing return type of the call operator's uses (such as
1760 // decltype(some_type<decltype(a)>::type{} + decltype(a){}) etc.)
1761 // - we can simply use the return type of the call operator, and
1762 // everything should work.
1763 SmallVector<ParmVarDecl *, 4> InvokerParams;
1764 for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I) {
1765 ParmVarDecl *From = CallOperator->getParamDecl(I);
1766
1767 InvokerParams.push_back(ParmVarDecl::Create(
1768 S.Context,
1769 // Temporarily add to the TU. This is set to the invoker below.
1771 From->getLocation(), From->getIdentifier(), From->getType(),
1772 From->getTypeSourceInfo(), From->getStorageClass(),
1773 /*DefArg=*/nullptr));
1774 CallOpConvTL.setParam(I, From);
1775 CallOpConvNameTL.setParam(I, From);
1776 }
1777
1779 S.Context, Class, Loc,
1780 DeclarationNameInfo(ConversionName, Loc, ConvNameLoc), ConvTy, ConvTSI,
1782 /*isInline=*/true, ExplicitSpecifier(),
1785 CallOperator->getBody()->getEndLoc());
1786 Conversion->setAccess(AS_public);
1787 Conversion->setImplicit(true);
1788
1789 // A non-generic lambda may still be a templated entity. We need to preserve
1790 // constraints when converting the lambda to a function pointer. See GH63181.
1791 if (const AssociatedConstraint &Requires =
1792 CallOperator->getTrailingRequiresClause())
1793 Conversion->setTrailingRequiresClause(Requires);
1794
1795 if (Class->isGenericLambda()) {
1796 // Create a template version of the conversion operator, using the template
1797 // parameter list of the function call operator.
1798 FunctionTemplateDecl *TemplateCallOperator =
1799 CallOperator->getDescribedFunctionTemplate();
1800 FunctionTemplateDecl *ConversionTemplate =
1802 Loc, ConversionName,
1803 TemplateCallOperator->getTemplateParameters(),
1804 Conversion);
1805 ConversionTemplate->setAccess(AS_public);
1806 ConversionTemplate->setImplicit(true);
1807 Conversion->setDescribedFunctionTemplate(ConversionTemplate);
1808 Class->addDecl(ConversionTemplate);
1809 } else
1810 Class->addDecl(Conversion);
1811
1812 // If the lambda is not static, we need to add a static member
1813 // function that will be the result of the conversion with a
1814 // certain unique ID.
1815 // When it is static we just return the static call operator instead.
1816 if (CallOperator->isImplicitObjectMemberFunction()) {
1817 DeclarationName InvokerName =
1819 // FIXME: Instead of passing in the CallOperator->getTypeSourceInfo()
1820 // we should get a prebuilt TrivialTypeSourceInfo from Context
1821 // using FunctionTy & Loc and get its TypeLoc as a FunctionProtoTypeLoc
1822 // then rewire the parameters accordingly, by hoisting up the InvokeParams
1823 // loop below and then use its Params to set Invoke->setParams(...) below.
1824 // This would avoid the 'const' qualifier of the calloperator from
1825 // contaminating the type of the invoker, which is currently adjusted
1826 // in SemaTemplateDeduction.cpp:DeduceTemplateArguments. Fixing the
1827 // trailing return type of the invoker would require a visitor to rebuild
1828 // the trailing return type and adjusting all back DeclRefExpr's to refer
1829 // to the new static invoker parameters - not the call operator's.
1831 S.Context, Class, Loc, DeclarationNameInfo(InvokerName, Loc),
1832 InvokerFunctionTy, CallOperator->getTypeSourceInfo(), SC_Static,
1834 /*isInline=*/true, CallOperator->getConstexprKind(),
1835 CallOperator->getBody()->getEndLoc());
1836 for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I)
1837 InvokerParams[I]->setOwningFunction(Invoke);
1838 Invoke->setParams(InvokerParams);
1839 Invoke->setAccess(AS_private);
1840 Invoke->setImplicit(true);
1841 if (Class->isGenericLambda()) {
1842 FunctionTemplateDecl *TemplateCallOperator =
1843 CallOperator->getDescribedFunctionTemplate();
1844 FunctionTemplateDecl *StaticInvokerTemplate =
1846 S.Context, Class, Loc, InvokerName,
1847 TemplateCallOperator->getTemplateParameters(), Invoke);
1848 StaticInvokerTemplate->setAccess(AS_private);
1849 StaticInvokerTemplate->setImplicit(true);
1850 Invoke->setDescribedFunctionTemplate(StaticInvokerTemplate);
1851 Class->addDecl(StaticInvokerTemplate);
1852 } else
1853 Class->addDecl(Invoke);
1854 }
1855}
1856
1857/// Add a lambda's conversion to function pointers, as described in
1858/// C++11 [expr.prim.lambda]p6. Note that in most cases, this should emit only a
1859/// single pointer conversion. In the event that the default calling convention
1860/// for free and member functions is different, it will emit both conventions.
1861static void addFunctionPointerConversions(Sema &S, SourceRange IntroducerRange,
1862 CXXRecordDecl *Class,
1863 CXXMethodDecl *CallOperator) {
1864 const FunctionProtoType *CallOpProto =
1865 CallOperator->getType()->castAs<FunctionProtoType>();
1866
1868 S, *CallOpProto, [&](CallingConv CC) {
1869 QualType InvokerFunctionTy =
1870 S.getLambdaConversionFunctionResultType(CallOpProto, CC);
1871 addFunctionPointerConversion(S, IntroducerRange, Class, CallOperator,
1872 InvokerFunctionTy);
1873 });
1874}
1875
1876/// Add a lambda's conversion to block pointer.
1878 SourceRange IntroducerRange,
1879 CXXRecordDecl *Class,
1880 CXXMethodDecl *CallOperator) {
1881 const FunctionProtoType *CallOpProto =
1882 CallOperator->getType()->castAs<FunctionProtoType>();
1884 CallOpProto, getLambdaConversionFunctionCallConv(S, CallOpProto));
1885 QualType BlockPtrTy = S.Context.getBlockPointerType(FunctionTy);
1886
1887 FunctionProtoType::ExtProtoInfo ConversionEPI(
1889 /*IsVariadic=*/false, /*IsCXXMethod=*/true));
1890 ConversionEPI.TypeQuals = Qualifiers();
1891 ConversionEPI.TypeQuals.addConst();
1892 QualType ConvTy = S.Context.getFunctionType(BlockPtrTy, {}, ConversionEPI);
1893
1894 SourceLocation Loc = IntroducerRange.getBegin();
1895 DeclarationName Name
1897 S.Context.getCanonicalType(BlockPtrTy));
1899 S.Context.getTrivialTypeSourceInfo(BlockPtrTy, Loc));
1901 S.Context, Class, Loc, DeclarationNameInfo(Name, Loc, NameLoc), ConvTy,
1902 S.Context.getTrivialTypeSourceInfo(ConvTy, Loc),
1905 CallOperator->getBody()->getEndLoc());
1906 Conversion->setAccess(AS_public);
1907 Conversion->setImplicit(true);
1908 Class->addDecl(Conversion);
1909}
1910
1912 SourceLocation ImplicitCaptureLoc,
1913 bool IsOpenMPMapping) {
1914 // VLA captures don't have a stored initialization expression.
1915 if (Cap.isVLATypeCapture())
1916 return ExprResult();
1917
1918 // An init-capture is initialized directly from its stored initializer.
1919 if (Cap.isInitCapture())
1920 return cast<VarDecl>(Cap.getVariable())->getInit();
1921
1922 // For anything else, build an initialization expression. For an implicit
1923 // capture, the capture notionally happens at the capture-default, so use
1924 // that location here.
1925 SourceLocation Loc =
1926 ImplicitCaptureLoc.isValid() ? ImplicitCaptureLoc : Cap.getLocation();
1927
1928 // C++11 [expr.prim.lambda]p21:
1929 // When the lambda-expression is evaluated, the entities that
1930 // are captured by copy are used to direct-initialize each
1931 // corresponding non-static data member of the resulting closure
1932 // object. (For array members, the array elements are
1933 // direct-initialized in increasing subscript order.) These
1934 // initializations are performed in the (unspecified) order in
1935 // which the non-static data members are declared.
1936
1937 // C++ [expr.prim.lambda]p12:
1938 // An entity captured by a lambda-expression is odr-used (3.2) in
1939 // the scope containing the lambda-expression.
1941 IdentifierInfo *Name = nullptr;
1942 if (Cap.isThisCapture()) {
1943 QualType ThisTy = getCurrentThisType();
1944 Expr *This = BuildCXXThisExpr(Loc, ThisTy, ImplicitCaptureLoc.isValid());
1945 if (Cap.isCopyCapture())
1946 Init = CreateBuiltinUnaryOp(Loc, UO_Deref, This);
1947 else
1948 Init = This;
1949 } else {
1950 assert(Cap.isVariableCapture() && "unknown kind of capture");
1951 ValueDecl *Var = Cap.getVariable();
1952 Name = Var->getIdentifier();
1954 CXXScopeSpec(), DeclarationNameInfo(Var->getDeclName(), Loc), Var);
1955 }
1956
1957 // In OpenMP, the capture kind doesn't actually describe how to capture:
1958 // variables are "mapped" onto the device in a process that does not formally
1959 // make a copy, even for a "copy capture".
1960 if (IsOpenMPMapping)
1961 return Init;
1962
1963 if (Init.isInvalid())
1964 return ExprError();
1965
1966 Expr *InitExpr = Init.get();
1968 Name, Cap.getCaptureType(), Loc);
1969 InitializationKind InitKind =
1970 InitializationKind::CreateDirect(Loc, Loc, Loc);
1971 InitializationSequence InitSeq(*this, Entity, InitKind, InitExpr);
1972 return InitSeq.Perform(*this, Entity, InitKind, InitExpr);
1973}
1974
1977
1978 if (LSI.CallOperator->hasAttr<SYCLKernelEntryPointAttr>())
1980
1981 ActOnFinishFunctionBody(LSI.CallOperator, Body, /*IsInstantiation=*/false,
1982 /*RetainFunctionScopeInfo=*/true);
1983
1984 return BuildLambdaExpr(StartLoc, Body->getEndLoc());
1985}
1986
1989 switch (ICS) {
1991 return LCD_None;
1993 return LCD_ByCopy;
1996 return LCD_ByRef;
1998 llvm_unreachable("block capture in lambda");
1999 }
2000 llvm_unreachable("Unknown implicit capture style");
2001}
2002
2004 if (From.isInitCapture()) {
2005 Expr *Init = cast<VarDecl>(From.getVariable())->getInit();
2006 if (Init && Init->HasSideEffects(Context))
2007 return true;
2008 }
2009
2010 if (!From.isCopyCapture())
2011 return false;
2012
2013 const QualType T = From.isThisCapture()
2015 : From.getCaptureType();
2016
2017 if (T.isVolatileQualified())
2018 return true;
2019
2020 const Type *BaseT = T->getBaseElementTypeUnsafe();
2021 if (const CXXRecordDecl *RD = BaseT->getAsCXXRecordDecl())
2022 return !RD->isCompleteDefinition() || !RD->hasTrivialCopyConstructor() ||
2023 !RD->hasTrivialDestructor();
2024
2025 return false;
2026}
2027
2029 SourceRange FixItRange,
2030 const Capture &From) {
2031 if (CaptureHasSideEffects(From))
2032 return false;
2033
2034 if (From.isVLATypeCapture())
2035 return false;
2036
2037 // FIXME: maybe we should warn on these if we can find a sensible diagnostic
2038 // message
2039 if (From.isInitCapture() &&
2041 return false;
2042
2043 auto diag = Diag(From.getLocation(), diag::warn_unused_lambda_capture);
2044 if (From.isThisCapture())
2045 diag << "'this'";
2046 else
2047 diag << From.getVariable();
2048 diag << From.isNonODRUsed();
2049 // If we were able to resolve the fixit range we'll create a fixit,
2050 // otherwise we just use the raw capture range for the diagnostic.
2051 if (FixItRange.isValid())
2052 diag << FixItHint::CreateRemoval(FixItRange);
2053 else
2054 diag << CaptureRange;
2055 return true;
2056}
2057
2058/// Create a field within the lambda class or captured statement record for the
2059/// given capture.
2061 const sema::Capture &Capture) {
2063 QualType FieldType = Capture.getCaptureType();
2064
2065 TypeSourceInfo *TSI = nullptr;
2066 if (Capture.isVariableCapture()) {
2067 const auto *Var = dyn_cast_or_null<VarDecl>(Capture.getVariable());
2068 if (Var && Var->isInitCapture())
2069 TSI = Var->getTypeSourceInfo();
2070 }
2071
2072 // FIXME: Should we really be doing this? A null TypeSourceInfo seems more
2073 // appropriate, at least for an implicit capture.
2074 if (!TSI)
2075 TSI = Context.getTrivialTypeSourceInfo(FieldType, Loc);
2076
2077 // Build the non-static data member.
2078 FieldDecl *Field =
2079 FieldDecl::Create(Context, RD, /*StartLoc=*/Loc, /*IdLoc=*/Loc,
2080 /*Id=*/nullptr, FieldType, TSI, /*BW=*/nullptr,
2081 /*Mutable=*/false, ICIS_NoInit);
2082 // If the variable being captured has an invalid type, mark the class as
2083 // invalid as well.
2084 if (!FieldType->isDependentType()) {
2085 if (RequireCompleteSizedType(Loc, FieldType,
2086 diag::err_field_incomplete_or_sizeless)) {
2087 RD->setInvalidDecl();
2088 Field->setInvalidDecl();
2089 } else {
2090 NamedDecl *Def;
2091 FieldType->isIncompleteType(&Def);
2092 if (Def && Def->isInvalidDecl()) {
2093 RD->setInvalidDecl();
2094 Field->setInvalidDecl();
2095 }
2096 }
2097 }
2098 Field->setImplicit(true);
2099 Field->setAccess(AS_private);
2100 RD->addDecl(Field);
2101
2103 Field->setCapturedVLAType(Capture.getCapturedVLAType());
2104
2105 return Field;
2106}
2107
2108static SourceRange
2110 SourceLocation PrevCaptureLoc,
2111 bool CurHasPreviousCapture, bool IsLast) {
2112 if (!CaptureRange.isValid())
2113 return SourceRange();
2114
2115 auto GetTrailingEndLocation = [&](SourceLocation StartPoint) {
2116 SourceRange NextToken = S.getRangeForNextToken(
2117 StartPoint, /*IncludeMacros=*/false, /*IncludeComments=*/true);
2118 if (!NextToken.isValid())
2119 return SourceLocation();
2120 // Return the last location preceding the next token
2121 return NextToken.getBegin().getLocWithOffset(-1);
2122 };
2123
2124 if (!CurHasPreviousCapture && !IsLast) {
2125 // If there are no captures preceding this capture, remove the
2126 // trailing comma and anything up to the next token
2127 SourceRange CommaRange =
2128 S.getRangeForNextToken(CaptureRange.getEnd(), /*IncludeMacros=*/false,
2129 /*IncludeComments=*/false, tok::comma);
2130 SourceLocation FixItEnd = GetTrailingEndLocation(CommaRange.getBegin());
2131 return SourceRange(CaptureRange.getBegin(), FixItEnd);
2132 }
2133
2134 // Otherwise, remove the comma since the last used capture, and
2135 // anything up to the next token
2136 SourceLocation FixItStart = S.getLocForEndOfToken(PrevCaptureLoc);
2137 SourceLocation FixItEnd = GetTrailingEndLocation(CaptureRange.getEnd());
2138 return SourceRange(FixItStart, FixItEnd);
2139}
2140
2142 SourceLocation EndLoc) {
2144 // Collect information from the lambda scope.
2146 SmallVector<Expr *, 4> CaptureInits;
2147 SourceLocation CaptureDefaultLoc = LSI->CaptureDefaultLoc;
2148 LambdaCaptureDefault CaptureDefault =
2150 CXXRecordDecl *Class = LSI->Lambda;
2151 CXXMethodDecl *CallOperator = LSI->CallOperator;
2152 SourceRange IntroducerRange = LSI->IntroducerRange;
2153 bool ExplicitParams = LSI->ExplicitParams;
2154 bool ExplicitResultType = !LSI->HasImplicitReturnType;
2155 CleanupInfo LambdaCleanup = LSI->Cleanup;
2156 bool ContainsUnexpandedParameterPack = LSI->ContainsUnexpandedParameterPack;
2157 bool IsGenericLambda = Class->isGenericLambda();
2158
2159 CallOperator->setLexicalDeclContext(Class);
2160 Decl *TemplateOrNonTemplateCallOperatorDecl =
2161 CallOperator->getDescribedFunctionTemplate()
2162 ? CallOperator->getDescribedFunctionTemplate()
2163 : cast<Decl>(CallOperator);
2164
2165 // FIXME: Is this really the best choice? Keeping the lexical decl context
2166 // set as CurContext seems more faithful to the source.
2167 TemplateOrNonTemplateCallOperatorDecl->setLexicalDeclContext(Class);
2168
2169 {
2170 // TreeTransform of immediate functions may call getCurLambda, which
2171 // requires both the paired LSI and the lambda DeclContext.
2172 ContextRAII SavedContext(*this, CallOperator, /*NewThisContext=*/false);
2174 }
2175
2177 AnalysisWarnings.getPolicyInEffectAt(EndLoc);
2178 // We cannot release LSI until we finish computing captures, which
2179 // requires the scope to be popped.
2181
2182 // True if the current capture has a used capture or default before it.
2183 bool CurHasPreviousCapture = CaptureDefault != LCD_None;
2184 SourceLocation PrevCaptureLoc =
2185 CurHasPreviousCapture ? CaptureDefaultLoc : IntroducerRange.getBegin();
2186
2187 for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) {
2188 const Capture &From = LSI->Captures[I];
2189
2190 if (From.isInvalid())
2191 return ExprError();
2192
2193 assert(!From.isBlockCapture() && "Cannot capture __block variables");
2194 bool IsImplicit = I >= LSI->NumExplicitCaptures;
2195 SourceLocation ImplicitCaptureLoc =
2196 IsImplicit ? CaptureDefaultLoc : SourceLocation();
2197
2198 // Use source ranges of explicit captures for fixits where available.
2199 SourceRange CaptureRange = LSI->ExplicitCaptureRanges[I];
2200
2201 // Warn about unused explicit captures.
2202 bool IsCaptureUsed = true;
2203 if (!CurContext->isDependentContext() && !IsImplicit && !From.isODRUsed()) {
2204 // Initialized captures that are non-ODR used may not be eliminated.
2205 // FIXME: Where did the IsGenericLambda here come from?
2206 bool NonODRUsedInitCapture =
2207 IsGenericLambda && From.isNonODRUsed() && From.isInitCapture();
2208 if (!NonODRUsedInitCapture) {
2209 bool IsLast = (I + 1) == LSI->NumExplicitCaptures;
2211 *this, CaptureRange, PrevCaptureLoc, CurHasPreviousCapture, IsLast);
2212 IsCaptureUsed =
2213 !DiagnoseUnusedLambdaCapture(CaptureRange, FixItRange, From);
2214 }
2215 }
2216
2217 if (CaptureRange.isValid()) {
2218 CurHasPreviousCapture |= IsCaptureUsed;
2219 PrevCaptureLoc = CaptureRange.getEnd();
2220 }
2221
2222 // Map the capture to our AST representation.
2223 LambdaCapture Capture = [&] {
2224 if (From.isThisCapture()) {
2225 // Capturing 'this' implicitly with a default of '[=]' is deprecated,
2226 // because it results in a reference capture. Don't warn prior to
2227 // C++2a; there's nothing that can be done about it before then.
2228 if (getLangOpts().CPlusPlus20 && IsImplicit &&
2229 CaptureDefault == LCD_ByCopy) {
2230 Diag(From.getLocation(), diag::warn_deprecated_this_capture);
2231 Diag(CaptureDefaultLoc, diag::note_deprecated_this_capture)
2233 getLocForEndOfToken(CaptureDefaultLoc), ", this");
2234 }
2235 return LambdaCapture(From.getLocation(), IsImplicit,
2237 } else if (From.isVLATypeCapture()) {
2238 return LambdaCapture(From.getLocation(), IsImplicit, LCK_VLAType);
2239 } else {
2240 assert(From.isVariableCapture() && "unknown kind of capture");
2241 ValueDecl *Var = From.getVariable();
2243 return LambdaCapture(From.getLocation(), IsImplicit, Kind, Var,
2244 From.getEllipsisLoc());
2245 }
2246 }();
2247
2248 // Form the initializer for the capture field.
2249 ExprResult Init = BuildCaptureInit(From, ImplicitCaptureLoc);
2250
2251 // FIXME: Skip this capture if the capture is not used, the initializer
2252 // has no side-effects, the type of the capture is trivial, and the
2253 // lambda is not externally visible.
2254
2255 // Add a FieldDecl for the capture and form its initializer.
2256 BuildCaptureField(Class, From);
2257 Captures.push_back(Capture);
2258 CaptureInits.push_back(Init.get());
2259
2260 if (LangOpts.CUDA)
2261 CUDA().CheckLambdaCapture(CallOperator, From);
2262 }
2263
2264 Class->setCaptures(Context, Captures);
2265
2266 // C++11 [expr.prim.lambda]p6:
2267 // The closure type for a lambda-expression with no lambda-capture
2268 // has a public non-virtual non-explicit const conversion function
2269 // to pointer to function having the same parameter and return
2270 // types as the closure type's function call operator.
2271 if (Captures.empty() && CaptureDefault == LCD_None)
2272 addFunctionPointerConversions(*this, IntroducerRange, Class, CallOperator);
2273
2274 // Objective-C++:
2275 // The closure type for a lambda-expression has a public non-virtual
2276 // non-explicit const conversion function to a block pointer having the
2277 // same parameter and return types as the closure type's function call
2278 // operator.
2279 // FIXME: Fix generic lambda to block conversions.
2280 if (getLangOpts().Blocks && getLangOpts().ObjC && !IsGenericLambda)
2281 addBlockPointerConversion(*this, IntroducerRange, Class, CallOperator);
2282
2283 // Finalize the lambda class.
2284 SmallVector<Decl *, 4> Fields(Class->fields());
2285 ActOnFields(nullptr, Class->getLocation(), Class, Fields, SourceLocation(),
2287 CheckCompletedCXXClass(nullptr, Class);
2288
2289 Cleanup.mergeFrom(LambdaCleanup);
2290
2291 LambdaExpr *Lambda =
2292 LambdaExpr::Create(Context, Class, IntroducerRange, CaptureDefault,
2293 CaptureDefaultLoc, ExplicitParams, ExplicitResultType,
2294 CaptureInits, EndLoc, ContainsUnexpandedParameterPack);
2295
2296 // If the lambda expression's call operator is not explicitly marked constexpr
2297 // and is not dependent, analyze the call operator to infer
2298 // its constexpr-ness, suppressing diagnostics while doing so.
2299 if (getLangOpts().CPlusPlus17 && !CallOperator->isInvalidDecl() &&
2300 !CallOperator->isConstexpr() &&
2301 !isa<CoroutineBodyStmt>(CallOperator->getBody()) &&
2302 !Class->isDependentContext()) {
2303 CallOperator->setConstexprKind(
2308 }
2309
2310 // Emit delayed shadowing warnings now that the full capture list is known.
2312
2313 if (!CurContext->isDependentContext()) {
2314 switch (ExprEvalContexts.back().Context) {
2315 // C++11 [expr.prim.lambda]p2:
2316 // A lambda-expression shall not appear in an unevaluated operand
2317 // (Clause 5).
2321 // C++1y [expr.const]p2:
2322 // A conditional-expression e is a core constant expression unless the
2323 // evaluation of e, following the rules of the abstract machine, would
2324 // evaluate [...] a lambda-expression.
2325 //
2326 // This is technically incorrect, there are some constant evaluated contexts
2327 // where this should be allowed. We should probably fix this when DR1607 is
2328 // ratified, it lays out the exact set of conditions where we shouldn't
2329 // allow a lambda-expression.
2332 // We don't actually diagnose this case immediately, because we
2333 // could be within a context where we might find out later that
2334 // the expression is potentially evaluated (e.g., for typeid).
2335 ExprEvalContexts.back().Lambdas.push_back(Lambda);
2336 break;
2337
2341 break;
2342 }
2344 }
2345
2346 return MaybeBindToTemporary(Lambda);
2347}
2348
2350 SourceLocation ConvLocation,
2351 CXXConversionDecl *Conv,
2352 Expr *Src) {
2353 // Make sure that the lambda call operator is marked used.
2354 CXXRecordDecl *Lambda = Conv->getParent();
2355 CXXMethodDecl *CallOperator
2357 Lambda->lookup(
2358 Context.DeclarationNames.getCXXOperatorName(OO_Call)).front());
2359 CallOperator->setReferenced();
2360 CallOperator->markUsed(Context);
2361
2364 CurrentLocation, Src);
2365 if (!Init.isInvalid())
2366 Init = ActOnFinishFullExpr(Init.get(), /*DiscardedValue*/ false);
2367
2368 if (Init.isInvalid())
2369 return ExprError();
2370
2371 // Create the new block to be returned.
2373
2374 // Set the type information.
2375 Block->setSignatureAsWritten(CallOperator->getTypeSourceInfo());
2376 Block->setIsVariadic(CallOperator->isVariadic());
2377 Block->setBlockMissingReturnType(false);
2378
2379 // Add parameters.
2381 for (unsigned I = 0, N = CallOperator->getNumParams(); I != N; ++I) {
2382 ParmVarDecl *From = CallOperator->getParamDecl(I);
2383 BlockParams.push_back(ParmVarDecl::Create(
2384 Context, Block, From->getBeginLoc(), From->getLocation(),
2385 From->getIdentifier(), From->getType(), From->getTypeSourceInfo(),
2386 From->getStorageClass(),
2387 /*DefArg=*/nullptr));
2388 }
2389 Block->setParams(BlockParams);
2390
2391 Block->setIsConversionFromLambda(true);
2392
2393 // Add capture. The capture uses a fake variable, which doesn't correspond
2394 // to any actual memory location. However, the initializer copy-initializes
2395 // the lambda object.
2396 TypeSourceInfo *CapVarTSI =
2397 Context.getTrivialTypeSourceInfo(Src->getType());
2398 VarDecl *CapVar = VarDecl::Create(Context, Block, ConvLocation,
2399 ConvLocation, nullptr,
2400 Src->getType(), CapVarTSI,
2401 SC_None);
2402 BlockDecl::Capture Capture(/*variable=*/CapVar, /*byRef=*/false,
2403 /*nested=*/false, /*copy=*/Init.get());
2404 Block->setCaptures(Context, Capture, /*CapturesCXXThis=*/false);
2405
2406 // Add a fake function body to the block. IR generation is responsible
2407 // for filling in the actual body, which cannot be expressed as an AST.
2408 Block->setBody(new (Context) CompoundStmt(ConvLocation));
2409
2410 // Create the block literal expression.
2411 // TODO: Do we ever get here if we have unexpanded packs in the lambda???
2412 Expr *BuildBlock =
2414 /*ContainsUnexpandedParameterPack=*/false);
2415 ExprCleanupObjects.push_back(Block);
2416 Cleanup.setExprNeedsCleanups(true);
2417
2418 return BuildBlock;
2419}
2420
2425 return FD;
2426 }
2427
2429 return FD->getInstantiatedFromDecl();
2430
2432 if (!FTD)
2433 return nullptr;
2434
2437
2438 return FTD->getTemplatedDecl();
2439}
2440
2441bool Sema::addInstantiatedCapturesToScope(
2442 FunctionDecl *Function, const FunctionDecl *PatternDecl,
2444 const MultiLevelTemplateArgumentList &TemplateArgs) {
2445 const auto *LambdaClass = cast<CXXMethodDecl>(Function)->getParent();
2446 const auto *LambdaPattern = cast<CXXMethodDecl>(PatternDecl)->getParent();
2447
2448 unsigned Instantiated = 0;
2449
2450 // FIXME: This is a workaround for not having deferred lambda body
2451 // instantiation.
2452 // When transforming a lambda's body, if we encounter another call to a
2453 // nested lambda that contains a constraint expression, we add all of the
2454 // outer lambda's instantiated captures to the current instantiation scope to
2455 // facilitate constraint evaluation. However, these captures don't appear in
2456 // the CXXRecordDecl until after the lambda expression is rebuilt, so we
2457 // pull them out from the corresponding LSI.
2458 LambdaScopeInfo *InstantiatingScope = nullptr;
2459 if (LambdaPattern->capture_size() && !LambdaClass->capture_size()) {
2460 for (FunctionScopeInfo *Scope : llvm::reverse(FunctionScopes)) {
2461 auto *LSI = dyn_cast<LambdaScopeInfo>(Scope);
2462 if (!LSI || getPatternFunctionDecl(LSI->CallOperator) != PatternDecl)
2463 continue;
2464 InstantiatingScope = LSI;
2465 break;
2466 }
2467 assert(InstantiatingScope);
2468 }
2469
2470 auto AddSingleCapture = [&](const ValueDecl *CapturedPattern,
2471 unsigned Index) {
2472 ValueDecl *CapturedVar =
2473 InstantiatingScope ? InstantiatingScope->Captures[Index].getVariable()
2474 : LambdaClass->getCapture(Index)->getCapturedVar();
2475 assert(CapturedVar->isInitCapture());
2476 Scope.InstantiatedLocal(CapturedPattern, CapturedVar);
2477 };
2478
2479 for (const LambdaCapture &CapturePattern : LambdaPattern->captures()) {
2480 if (!CapturePattern.capturesVariable()) {
2481 Instantiated++;
2482 continue;
2483 }
2484 ValueDecl *CapturedPattern = CapturePattern.getCapturedVar();
2485
2486 if (!CapturedPattern->isInitCapture()) {
2487 Instantiated++;
2488 continue;
2489 }
2490
2491 if (!CapturedPattern->isParameterPack()) {
2492 AddSingleCapture(CapturedPattern, Instantiated++);
2493 } else {
2494 Scope.MakeInstantiatedLocalArgPack(CapturedPattern);
2495 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2496 SemaRef.collectUnexpandedParameterPacks(
2497 dyn_cast<VarDecl>(CapturedPattern)->getInit(), Unexpanded);
2498 auto NumArgumentsInExpansion =
2499 getNumArgumentsInExpansionFromUnexpanded(Unexpanded, TemplateArgs);
2500 if (!NumArgumentsInExpansion)
2501 continue;
2502 for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg)
2503 AddSingleCapture(CapturedPattern, Instantiated++);
2504 }
2505 }
2506 return false;
2507}
2508
2512 LocalInstantiationScope &Scope, bool ShouldAddDeclsFromParentScope)
2514 if (!isLambdaCallOperator(FD)) {
2516 return;
2517 }
2518
2519 SemaRef.RebuildLambdaScopeInfo(cast<CXXMethodDecl>(FD));
2520
2521 FunctionDecl *FDPattern = getPatternFunctionDecl(FD);
2522 if (!FDPattern)
2523 return;
2524
2525 if (!ShouldAddDeclsFromParentScope)
2526 return;
2527
2529 InstantiationAndPatterns;
2530 while (FDPattern && FD) {
2531 InstantiationAndPatterns.emplace_back(FDPattern, FD);
2532
2533 FDPattern =
2534 dyn_cast<FunctionDecl>(getLambdaAwareParentOfDeclContext(FDPattern));
2535 FD = dyn_cast<FunctionDecl>(getLambdaAwareParentOfDeclContext(FD));
2536 }
2537
2538 // Add instantiated parameters and local vars to scopes, starting from the
2539 // outermost lambda to the innermost lambda. This ordering ensures that
2540 // the outer instantiations can be found when referenced from within inner
2541 // lambdas.
2542 //
2543 // auto L = [](auto... x) {
2544 // return [](decltype(x)... y) { }; // Instantiating y needs x
2545 // };
2546 //
2547
2548 for (auto [FDPattern, FD] : llvm::reverse(InstantiationAndPatterns)) {
2549 SemaRef.addInstantiatedParametersToScope(FD, FDPattern, Scope, MLTAL);
2550 SemaRef.addInstantiatedLocalVarsToScope(FD, FDPattern, Scope);
2551
2552 if (isLambdaCallOperator(FD))
2553 SemaRef.addInstantiatedCapturesToScope(FD, FDPattern, Scope, MLTAL);
2554 }
2555}
#define V(N, I)
This file provides some common utility functions for processing Lambda related AST Constructs.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the clang::Expr interface and subclasses for C++ expressions.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis for CUDA constructs.
static LambdaCaptureDefault mapImplicitCaptureStyle(CapturingScopeInfo::ImplicitCaptureStyle ICS)
static CallingConv getLambdaConversionFunctionCallConv(Sema &S, const FunctionProtoType *CallOpProto)
static EnumDecl * findEnumForBlockReturn(Expr *E)
If this expression is an enumerator-like expression of some type T, return the type T; otherwise,...
static EnumDecl * findCommonEnumForBlockReturns(ArrayRef< ReturnStmt * > returns)
Attempt to find a common type T for which all of the returned expressions in a block are enumerator-l...
static TypeSourceInfo * getLambdaType(Sema &S, LambdaIntroducer &Intro, Declarator &ParamInfo, Scope *CurScope, SourceLocation Loc, bool &ExplicitResultType)
static FunctionDecl * getPatternFunctionDecl(FunctionDecl *FD)
static LambdaScopeInfo * getCurrentLambdaScopeUnsafe(Sema &S)
static UnsignedOrNone getStackIndexOfNearestEnclosingCaptureReadyLambda(ArrayRef< const clang::sema::FunctionScopeInfo * > FunctionScopes, ValueDecl *VarToCapture)
Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda...
static void adjustBlockReturnsToEnum(Sema &S, ArrayRef< ReturnStmt * > returns, QualType returnType)
Adjust the given return statements so that they formally return the given type.
static TemplateParameterList * getGenericLambdaTemplateParameterList(LambdaScopeInfo *LSI, Sema &SemaRef)
static void addBlockPointerConversion(Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
Add a lambda's conversion to block pointer.
static void buildLambdaScopeReturnType(Sema &S, LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator, bool ExplicitResultType)
static SourceRange ConstructFixItRangeForUnusedCapture(Sema &S, SourceRange CaptureRange, SourceLocation PrevCaptureLoc, bool CurHasPreviousCapture, bool IsLast)
static TypeSourceInfo * getDummyLambdaType(Sema &S, SourceLocation Loc=SourceLocation())
static QualType buildTypeForLambdaCallOperator(Sema &S, clang::CXXRecordDecl *Class, TemplateParameterList *TemplateParams, TypeSourceInfo *MethodTypeInfo)
static bool isInInlineFunction(const DeclContext *DC)
Determine whether the given context is or is enclosed in an inline function.
static void addFunctionPointerConversions(Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
Add a lambda's conversion to function pointers, as described in C++11 [expr.prim.lambda]p6.
static void repeatForLambdaConversionFunctionCallingConvs(Sema &S, const FunctionProtoType &CallOpProto, Func F)
static void addFunctionPointerConversion(Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator, QualType InvokerFunctionTy)
Add a lambda's conversion to function pointer, as described in C++11 [expr.prim.lambda]p6.
This file provides some common utility functions for processing Lambdas.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for SYCL constructs.
a trap message and trap category.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
Definition ASTContext.h:794
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CanQualType DependentTy
IdentifierTable & Idents
Definition ASTContext.h:790
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType VoidTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:909
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
CanQualType getCanonicalTagType(const TagDecl *TD) const
PtrTy get() const
Definition Ownership.h:171
Attr - This represents one attribute.
Definition Attr.h:46
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4038
A binding in a decomposition declaration.
Definition DeclCXX.h:4181
A class which contains all the information about a particular captured value.
Definition Decl.h:4677
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4671
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition Decl.cpp:5640
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6624
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
CXXBasePath & front()
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2939
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
Definition DeclCXX.cpp:3223
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Definition DeclCXX.h:2979
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
Definition DeclCXX.cpp:2710
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
Definition DeclCXX.cpp:2488
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2255
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
void setLambdaTypeInfo(TypeSourceInfo *TS)
Definition DeclCXX.h:1864
void setLambdaIsGeneric(bool IsGeneric)
Definition DeclCXX.h:1875
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
Definition DeclCXX.cpp:141
bool isCapturelessLambda() const
Definition DeclCXX.h:1064
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:73
ConditionalOperator - The ?
Definition Expr.h:4391
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition DeclBase.h:2238
bool isRequiresExprBody() const
Definition DeclBase.h:2194
bool isFileContext() const
Definition DeclBase.h:2180
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
Definition DeclBase.h:2125
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
Definition DeclBase.h:2185
void addDecl(Decl *D)
Add the declaration D into this context.
bool isFunctionOrMethod() const
Definition DeclBase.h:2161
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1270
Captures information about "declaration specifiers".
Definition DeclSpec.h:217
SCS getStorageClassSpec() const
Definition DeclSpec.h:471
bool SetTypeQual(TQ T, SourceLocation Loc)
Definition DeclSpec.cpp:991
ConstexprSpecKind getConstexprSpecifier() const
Definition DeclSpec.h:802
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition DeclBase.cpp:590
bool isInvalidDecl() const
Definition DeclBase.h:588
void setAccess(AccessSpecifier AS)
Definition DeclBase.h:502
SourceLocation getLocation() const
Definition DeclBase.h:439
void setImplicit(bool I=true)
Definition DeclBase.h:594
void setReferenced(bool R=true)
Definition DeclBase.h:623
DeclContext * getDeclContext()
Definition DeclBase.h:448
bool hasAttr() const
Definition DeclBase.h:577
void setLexicalDeclContext(DeclContext *DC)
Definition DeclBase.cpp:386
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
DeclarationName getCXXConversionFunctionName(CanQualType Ty)
Returns the name of a C++ conversion function for the given Type.
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:831
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Definition Decl.h:855
void setTrailingRequiresClause(const AssociatedConstraint &AC)
Definition Decl.cpp:2030
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1874
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
Definition DeclSpec.h:2430
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
Definition DeclSpec.h:2372
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Definition DeclSpec.h:2021
Expr * getTrailingRequiresClause()
Sets a trailing requires clause for this declarator.
Definition DeclSpec.h:2607
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
Definition DeclSpec.h:2368
bool isExplicitObjectMemberFunction()
Definition DeclSpec.cpp:398
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
Definition DeclSpec.h:2056
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
Definition DeclSpec.h:2461
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
Represents an enum.
Definition Decl.h:4010
Store information needed for an explicit specifier.
Definition DeclCXX.h:1924
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3661
This represents one expression.
Definition Expr.h:112
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3085
QualType getType() const
Definition Expr.h:144
Represents difference between two FPOptions values.
bool isFPConstrained() const
Represents a member of a struct/union/class.
Definition Decl.h:3160
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
Definition Decl.cpp:4700
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition Diagnostic.h:129
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition Diagnostic.h:103
void setSubExpr(Expr *E)
As with any mutator of the AST, be very careful when modifying an existing AST to preserve its invari...
Definition Expr.h:1067
const Expr * getSubExpr() const
Definition Expr.h:1062
Represents a function declaration or definition.
Definition Decl.h:2000
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2797
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition Decl.cpp:3279
ConstexprSpecKind getConstexprKind() const
Definition Decl.h:2476
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition Decl.cpp:4198
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4193
QualType getReturnType() const
Definition Decl.h:2845
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2774
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4313
bool isVariadic() const
Whether this function is variadic.
Definition Decl.cpp:3133
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4144
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition Decl.h:2470
FunctionDecl * getInstantiatedFromDecl() const
Definition Decl.cpp:4217
void setConstexprKind(ConstexprSpecKind CSK)
Definition Decl.h:2473
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4165
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3826
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.h:2805
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5269
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5673
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5558
ArrayRef< QualType > getParamTypes() const
Definition TypeBase.h:5554
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeLoc getReturnLoc() const
Definition TypeLoc.h:1697
ExtInfo withCallingConv(CallingConv cc) const
Definition TypeBase.h:4688
CallingConv getCallConv() const
Definition TypeBase.h:4820
QualType getReturnType() const
Definition TypeBase.h:4805
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3853
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2072
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
Describes an entity that is being initialized.
static InitializedEntity InitializeLambdaToBlock(SourceLocation BlockVarLoc, QualType Type)
static InitializedEntity InitializeLambdaCapture(IdentifierInfo *VarID, QualType FieldType, SourceLocation Loc)
Create the initialization entity for a lambda capture.
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition ExprCXX.h:1968
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
Definition ExprCXX.cpp:1312
A stack-allocated class that identifies which local variable declaration instantiations are present i...
Definition Template.h:371
void InstantiatedLocal(const Decl *D, Decl *Inst)
Represents the results of name lookup.
Definition Lookup.h:147
DeclClass * getAsSingle() const
Definition Lookup.h:558
bool empty() const
Return true if no decls were found.
Definition Lookup.h:362
bool isAmbiguous() const
Definition Lookup.h:324
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
virtual unsigned getDeviceManglingNumber(const CXXMethodDecl *)
Retrieve the mangling number of a new lambda expression with the given call operator within the devic...
Data structure that captures multiple levels of template argument lists for use in template instantia...
Definition Template.h:76
This represents a decl that may have a name.
Definition Decl.h:274
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition Decl.cpp:1095
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
PtrTy get() const
Definition Ownership.h:81
Expr ** getExprs()
Definition Expr.h:6121
unsigned getNumExprs() const
Return the number of expressions in this paren list.
Definition Expr.h:6110
Represents a parameter to a function.
Definition Decl.h:1790
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Definition Decl.cpp:2957
Wrapper for source info for pointers.
Definition TypeLoc.h:1485
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8418
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8386
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
void addAddressSpace(LangAS space)
Definition TypeBase.h:597
Represents a struct/union/class.
Definition Decl.h:4324
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3152
void setRetValue(Expr *E)
Definition Stmt.h:3181
SourceLocation getBeginLoc() const
Definition Stmt.h:3204
Expr * getRetValue()
Definition Stmt.h:3179
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
DeclContext * getEntity() const
Get the entity corresponding to this scope.
Definition Scope.h:401
decl_range decls() const
Definition Scope.h:356
bool isFunctionDeclarationScope() const
isFunctionDeclarationScope - Return true if this scope is a function prototype scope.
Definition Scope.h:493
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Definition Scope.h:287
void CheckSMEFunctionDefAttributes(const FunctionDecl *FD)
Definition SemaARM.cpp:1430
Sema & SemaRef
Definition SemaBase.h:40
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
void CheckLambdaCapture(CXXMethodDecl *D, const sema::Capture &Capture)
void SetLambdaAttrs(CXXMethodDecl *Method)
Set device or host device attributes on the given lambda operator() method.
void ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(Decl *D)
Act on D, a function definition inside of an omp [begin/end] assumes.
void CheckSYCLEntryPointFunctionDecl(FunctionDecl *FD)
Definition SemaSYCL.cpp:270
A RAII object to temporarily push a declaration context.
Definition Sema.h:3494
LambdaScopeForCallOperatorInstantiationRAII(Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL, LocalInstantiationScope &Scope, bool ShouldAddDeclsFromParentScope=true)
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:856
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1121
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8266
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9353
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
VarDecl * createLambdaInitCaptureVarDecl(SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc, IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx)
Create a dummy variable within the declcontext of the lambda's call operator, for name lookup purpose...
ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body)
ActOnLambdaExpr - This is called when the body of a lambda expression was successfully completed.
SemaOpenMP & OpenMP()
Definition Sema.h:1508
CXXRecordDecl * createLambdaClosureType(SourceRange IntroducerRange, TypeSourceInfo *Info, unsigned LambdaDependencyKind, LambdaCaptureDefault CaptureDefault)
Create a new lambda closure type.
SemaCUDA & CUDA()
Definition Sema.h:1448
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1224
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurContext)
Once the Lambdas capture are known, we can start to create the closure, call operator method,...
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef)
Add an init-capture to a lambda scope.
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
SemaSYCL & SYCL()
Definition Sema.h:1533
ASTContext & Context
Definition Sema.h:1288
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:225
SemaObjC & ObjC()
Definition Sema.h:1493
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ASTContext & getASTContext() const
Definition Sema.h:927
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1061
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
void PopExpressionEvaluationContext()
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Definition Sema.cpp:2589
void handleLambdaNumbering(CXXRecordDecl *Class, CXXMethodDecl *Method, std::optional< CXXRecordDecl::LambdaNumbering > NumberingOverride=std::nullopt)
Number lambda for linkage purposes if necessary.
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1679
ExprResult BuildCaptureInit(const sema::Capture &Capture, SourceLocation ImplicitCaptureLoc, bool IsOpenMPMapping=false)
Initialize the given capture with a suitable expression.
FPOptions & getCurFPFeatures()
Definition Sema.h:922
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
@ UPPC_Initializer
An initializer.
Definition Sema.h:14444
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14417
void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool Mutable)
Endow the lambda scope info with the relevant properties.
const LangOptions & getLangOpts() const
Definition Sema.h:920
bool CaptureHasSideEffects(const sema::Capture &From)
Does copying/destroying the captured variable have side effects?
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2449
void ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, Declarator &ParamInfo, const DeclSpec &DS)
ActOnStartOfLambdaDefinition - This is called just before we start parsing the body of a lambda; it a...
void ActOnLambdaClosureParameters(Scope *LambdaScope, MutableArrayRef< DeclaratorChunk::ParamInfo > ParamInfo)
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
const LangOptions & LangOpts
Definition Sema.h:1286
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2564
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, const AssociatedConstraint &TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
Definition Sema.h:15677
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:6983
void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI)
Diagnose shadowing for variables shadowed in the lambda record LambdaRD when these variables are capt...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1421
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13963
void ActOnLambdaExplicitTemplateParameterList(LambdaIntroducer &Intro, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > TParams, SourceLocation RAngleLoc, ExprResult RequiresClause)
This is called after parsing the explicit template parameter list on a lambda (if it exists) in C++2a...
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange, SourceRange FixItRange, const sema::Capture &From)
Diagnose if an explicit lambda capture is unused.
QualType buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions, IdentifierInfo *Id, bool DirectInit, Expr *&Init)
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
Definition Sema.h:6987
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
Definition Sema.h:1326
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
Definition Sema.h:6746
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
Definition Sema.h:6736
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6751
@ DiscardedStatement
The current expression occurs within a discarded statement.
Definition Sema.h:6741
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6761
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6730
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6756
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
Definition Sema.h:6771
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
QualType getLambdaConversionFunctionResultType(const FunctionProtoType *CallOpType, CallingConv CC)
Get the return type to use for a lambda's conversion function(s) to function pointer type,...
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8339
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
friend class InitializationSequence
Definition Sema.h:1563
void PopDeclContext()
ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc)
Complete a lambda-expression having processed and attached the lambda body.
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
Definition Sema.cpp:88
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
void finishLambdaExplicitCaptures(sema::LambdaScopeInfo *LSI)
Note that we have finished the explicit captures for the given lambda.
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6441
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
UnsignedOrNone getNumArgumentsInExpansionFromUnexpanded(llvm::ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs)
void NoteTemplateParameterLocation(const NamedDecl &Decl)
SemaARM & ARM()
Definition Sema.h:1428
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition Sema.h:8681
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4595
Stmt - This represents one statement.
Definition Stmt.h:86
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:362
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
Definition Decl.h:3947
Exposes information about the current target.
Definition TargetInfo.h:226
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
bool containsUnexpandedParameterPack() const
Determine whether this template parameter list contains an unexpanded parameter pack.
ArrayRef< NamedDecl * > asArray()
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:89
A container of type source information.
Definition TypeBase.h:8263
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8274
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:551
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isVoidType() const
Definition TypeBase.h:8891
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
Definition Type.cpp:2116
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9178
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:753
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2783
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition TypeBase.h:2405
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition TypeBase.h:9027
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
Definition Type.h:53
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2436
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
Definition Type.cpp:5015
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
QualType getType() const
Definition Decl.h:723
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Definition Decl.cpp:5588
VarDecl * getPotentiallyDecomposedVarDecl()
Definition DeclCXX.cpp:3635
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.cpp:5582
Represents a variable declaration or definition.
Definition Decl.h:926
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2162
void setInitStyle(InitializationStyle Style)
Definition Decl.h:1452
void setInitCapture(bool IC)
Definition Decl.h:1581
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.h:1578
InitializationStyle
Initialization styles.
Definition Decl.h:929
@ ListInit
Direct list-initialization (C++11)
Definition Decl.h:937
@ CInit
C-style initialization with assignment.
Definition Decl.h:931
@ CallInit
Call-style initialization (C++98)
Definition Decl.h:934
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
Definition Decl.h:1184
void setInit(Expr *I)
Definition Decl.cpp:2488
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1168
ValueDecl * getVariable() const
Definition ScopeInfo.h:675
bool isVariableCapture() const
Definition ScopeInfo.h:650
bool isBlockCapture() const
Definition ScopeInfo.h:656
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
Definition ScopeInfo.h:686
bool isNonODRUsed() const
Definition ScopeInfo.h:667
bool isODRUsed() const
Definition ScopeInfo.h:666
bool isInitCapture() const
Determine whether this capture is an init-capture.
bool isInvalid() const
Definition ScopeInfo.h:661
bool isVLATypeCapture() const
Definition ScopeInfo.h:657
SourceLocation getEllipsisLoc() const
Retrieve the source location of the ellipsis, whose presence indicates that the capture is a pack exp...
Definition ScopeInfo.h:690
bool isThisCapture() const
Definition ScopeInfo.h:649
QualType getCaptureType() const
Retrieve the capture type for this capture, which is effectively the type of the non-static data memb...
Definition ScopeInfo.h:695
bool isCopyCapture() const
Definition ScopeInfo.h:654
const VariableArrayType * getCapturedVLAType() const
Definition ScopeInfo.h:680
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
Definition ScopeInfo.h:732
bool isCaptured(ValueDecl *Var) const
Determine whether the given variable has been captured.
Definition ScopeInfo.h:764
bool ContainsUnexpandedParameterPack
Whether this contains an unexpanded parameter pack.
Definition ScopeInfo.h:728
SmallVector< Capture, 4 > Captures
Captures - The captures.
Definition ScopeInfo.h:721
ImplicitCaptureStyle ImpCaptureStyle
Definition ScopeInfo.h:708
Capture & getCXXThisCapture()
Retrieve the capture of C++ 'this', if it has been captured.
Definition ScopeInfo.h:758
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
Definition ScopeInfo.h:755
SmallVector< NamedDecl *, 4 > LocalPacks
Packs introduced by this, if any.
Definition ScopeInfo.h:735
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
Definition ScopeInfo.h:737
SmallVector< ReturnStmt *, 4 > Returns
The list of return statements that occur within the function or block, if there is any chance of appl...
Definition ScopeInfo.h:214
SourceLocation PotentialThisCaptureLocation
Definition ScopeInfo.h:950
void finishedExplicitCaptures()
Note when all explicit captures have been added.
Definition ScopeInfo.h:961
CleanupInfo Cleanup
Whether any of the capture expressions requires cleanups.
Definition ScopeInfo.h:902
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
Definition ScopeInfo.h:884
bool ExplicitParams
Whether the (empty) parameter list is explicit.
Definition ScopeInfo.h:899
TemplateParameterList * GLTemplateParameterList
If this is a generic lambda, and the template parameter list has been created (from the TemplateParam...
Definition ScopeInfo.h:915
ExprResult RequiresClause
The requires-clause immediately following the explicit template parameter list, if any.
Definition ScopeInfo.h:910
SourceRange ExplicitTemplateParamsRange
Source range covering the explicit template parameter list (if it exists).
Definition ScopeInfo.h:905
CXXRecordDecl * Lambda
The class that describes the lambda.
Definition ScopeInfo.h:871
unsigned NumExplicitCaptures
The number of captures in the Captures list that are explicit captures.
Definition ScopeInfo.h:892
SourceLocation CaptureDefaultLoc
Source location of the '&' or '=' specifying the default capture type, if any.
Definition ScopeInfo.h:888
llvm::DenseMap< unsigned, SourceRange > ExplicitCaptureRanges
A map of explicit capture indices to their introducer source ranges.
Definition ScopeInfo.h:939
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
Definition ScopeInfo.h:879
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
Definition ScopeInfo.h:874
bool Mutable
Whether this is a mutable lambda.
Definition ScopeInfo.h:896
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus20
@ CPlusPlus
@ CPlusPlus14
@ CPlusPlus17
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
Definition ASTLambda.h:102
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:35
TryCaptureKind
Definition Sema.h:653
@ ICIS_NoInit
No in-class initializer.
Definition Specifiers.h:272
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1782
UnsignedOrNone getStackIndexOfNearestEnclosingCaptureCapableLambda(ArrayRef< const sema::FunctionScopeInfo * > FunctionScopes, ValueDecl *VarToCapture, Sema &S)
Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda...
LambdaCaptureKind
The different capture forms in a lambda introducer.
Definition Lambda.h:33
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
Definition Lambda.h:36
@ LCK_ByRef
Capturing by reference.
Definition Lambda.h:37
@ LCK_VLAType
Capturing variable-length array type.
Definition Lambda.h:38
@ LCK_StarThis
Capturing the *this object by copy.
Definition Lambda.h:35
@ LCK_This
Capturing the *this object by reference.
Definition Lambda.h:34
@ AS_public
Definition Specifiers.h:124
@ AS_private
Definition Specifiers.h:126
bool isLambdaCallWithExplicitObjectParameter(const DeclContext *DC)
Definition ASTLambda.h:45
StorageClass
Storage classes.
Definition Specifiers.h:248
@ SC_Auto
Definition Specifiers.h:256
@ SC_Static
Definition Specifiers.h:252
@ SC_None
Definition Specifiers.h:250
bool FTIHasSingleVoidParameter(const DeclaratorChunk::FunctionTypeInfo &FTI)
MutableArrayRef< Expr * > MultiExprArg
Definition Ownership.h:259
@ CopyInit
[a = b], [a = {b}]
Definition DeclSpec.h:2800
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
bool hasWeakerNullability(NullabilityKind L, NullabilityKind R)
Return true if L has a weaker nullability annotation than R.
Definition Specifiers.h:369
ExprResult ExprError()
Definition Ownership.h:265
LangAS
Defines the address space values used by the address space qualifier of QualType.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
Definition Lambda.h:22
@ LCD_ByRef
Definition Lambda.h:25
@ LCD_None
Definition Lambda.h:23
@ LCD_ByCopy
Definition Lambda.h:24
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
StringRef getLambdaStaticInvokerName()
Definition ASTLambda.h:23
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:149
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
@ CC_X86VectorCall
Definition Specifiers.h:283
@ CC_X86StdCall
Definition Specifiers.h:280
@ CC_X86FastCall
Definition Specifiers.h:281
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5879
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ EST_BasicNoexcept
noexcept
Information about how a lambda is numbered within its context.
Definition DeclCXX.h:1796
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getTrailingReturnTypeLoc() const
Get the trailing-return-type location for this function declarator.
Definition DeclSpec.h:1565
bool hasTrailingReturnType() const
Determine whether this function declarator had a trailing-return-type.
Definition DeclSpec.h:1556
ParsedType getTrailingReturnType() const
Get the trailing-return-type for this function declarator.
Definition DeclSpec.h:1559
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
Definition DeclSpec.h:1528
ParamInfo - An array of paraminfo objects is allocated whenever a function declarator is parsed.
Definition DeclSpec.h:1303
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5328
Extra information about a function prototype.
Definition TypeBase.h:5354
unsigned NumExplicitTemplateParams
The number of parameters in the template parameter list that were explicitly specified by the user,...
Definition DeclSpec.h:2857
SmallVector< NamedDecl *, 4 > TemplateParams
Store the list of the template parameters for a generic lambda or an abbreviated function template.
Definition DeclSpec.h:2870
Represents a complete lambda introducer.
Definition DeclSpec.h:2806
SmallVector< LambdaCapture, 4 > Captures
Definition DeclSpec.h:2831
SourceLocation DefaultLoc
Definition DeclSpec.h:2829
LambdaCaptureDefault Default
Definition DeclSpec.h:2830