[PATCH] D119136: [clang] Implement Change scope of lambda trailing-return-type

Corentin Jabot via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 7 06:44:40 PST 2022


cor3ntin created this revision.
cor3ntin requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added subscribers: cfe-commits, sstefan1.
Herald added a project: clang.

Implement P2036R3.

Captured variables by copy (explicitely or not), are deduced
correctly at the point we know whether the lambda is mutable,
and ill-formed before that.

Up until now, the entire lambda declaration up to the start
of the body would be parsed in the parent scope, such that capture
would not be available to look up.

The scoping is changed to have an outer lambda scope, followed
by the lambda prototype and body.

The lambda scope is necessary because there may be a template
scope between the start of the lambda (to which we want to attach
the captured variable) and the prototype scope.

We also need to introduce a declaration context to attach
the captured variable to (and several parts of clang assume captures
are handled from the call operator context), before we know
the type of the call operator.

The order of operations is as follow:

- Parse the init capture in the lambda's parent scope

- Introduce a lambda scope

- Create the lambda class and call operator

- Add the init captures to the call operator context and the lambda

scope. But the variables are not capured yet (because we don't know their type).
Instead, explicit  captures are stored in a temporary map
that conserves the order of capture
(for the purpose of having a stable order in the ast dumps).

- A flag is set on LambdaScopeInfo to indicate that we have not yet

injected the captures.

- The parameters are parsed (in the parent context, as lambda

mangling recurses in the parent context, we couldn't mangle a lambda
that is attached to the context of a lambda whose type is not yet known).

- The lambda qualifiers are parsed, at this point We

can switch (for the second time) inside the lambda context,
unset the flag indicating that we have not parsed the lambda qualifiers,
record the lambda is mutable and capture the explicit variables.

- We can parse the resrt of the lambda type, transform the lambda

and call operator's types and also transform the call operator to
a template function decl where necessary.

At this point, both captures and parameters can be injected
in the body's scope.

When trying to capture an implicit variable, if
we are before the qualifiers of a lambda,
we need to remember that the variables are still in the parent's
context (rather than in the call operator's).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D119136

Files:
  clang/include/clang/AST/DeclCXX.h
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/include/clang/Sema/Scope.h
  clang/include/clang/Sema/ScopeInfo.h
  clang/include/clang/Sema/Sema.h
  clang/lib/Parse/ParseExprCXX.cpp
  clang/lib/Sema/Scope.cpp
  clang/lib/Sema/Sema.cpp
  clang/lib/Sema/SemaCXXScopeSpec.cpp
  clang/lib/Sema/SemaExpr.cpp
  clang/lib/Sema/SemaExprCXX.cpp
  clang/lib/Sema/SemaLambda.cpp
  clang/lib/Sema/TreeTransform.h
  clang/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp
  clang/test/SemaCXX/lambda-capture-type-deduction.cpp
  clang/test/SemaCXX/warn-shadow-in-lambdas.cpp
  clang/www/cxx_status.html

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119136.406439.patch
Type: text/x-patch
Size: 69340 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220207/7965a309/attachment-0001.bin>


More information about the cfe-commits mailing list