[PATCH] D119136: [clang] Implement Change scope of lambda trailing-return-type
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 7 20:11:56 PDT 2022
ChuanqiXu added inline comments.
================
Comment at: clang/include/clang/Sema/ScopeInfo.h:843
+ /// and the capture should not be visible before.
+ llvm::DenseMap<unsigned, DelayedCapture> DelayedCaptures;
+
----------------
I hope the comment explains the meaning of unsigned here. If it means index, I think `SmallVector` would make code simpler.
================
Comment at: clang/include/clang/Sema/ScopeInfo.h:842
+
+ bool BeforeLambdaQualifiersScope = false;
+
----------------
cor3ntin wrote:
> ChuanqiXu wrote:
> > I think the name `Before*` is a little bit confusing. From the context, it would be set to true in `ActOnLambdaIntroducer`and be set to false in `ActOnLambdaClosureQualifiers`. So it looks like something `IsInRangeOf...`. The name before implies that it should be true by default and be false after some point...
> >
> > I am not sure if my point is clear...
> I struggle to find a better name, but I added a comment. Does that help?
I'm not good at naming too... I am wondering a name with words like `range` could be fine.
================
Comment at: clang/lib/Sema/Scope.cpp:72
+ // Lambdas have an extra prototype scope that doesn't add any depth
+ if (flags & FunctionPrototypeScope && !(flags & LambdaScope))
+ PrototypeDepth++;
----------------
cor3ntin wrote:
> ChuanqiXu wrote:
> > ChuanqiXu wrote:
> > > This looks like:
> > This isn't addressed. I mean the flags would always be true if the last clause get evaluated.
> I'm not sure I understand your point. We are checking that it's a function scope that is not a lambda scope.
> They are probably other ways to write that but they aren't clearer
I mean the suggested change is equal to the original one and it is shorter. I don't think it would lost any information since they are all in the same line.
================
Comment at: clang/lib/Sema/SemaExpr.cpp:18411
+ Loc = C.second.Loc;
+ Explicitly = 1;
+ break;
----------------
================
Comment at: clang/lib/Sema/SemaLambda.cpp:892
-void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro,
- Declarator &ParamInfo,
- Scope *CurScope) {
+static LambdaScopeInfo *getCurrentLambdaScopeUnsafe(Sema &S) {
+ assert(!S.FunctionScopes.empty());
----------------
I guess it is needed to explain the meaning of `Unsafe`
================
Comment at: clang/lib/Sema/SemaLambda.cpp:894-897
+ auto *CurLSI =
+ dyn_cast<LambdaScopeInfo>(S.FunctionScopes[S.FunctionScopes.size() - 1]);
+ assert(CurLSI);
+ return CurLSI;
----------------
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1076-1078
Var = createLambdaInitCaptureVarDecl(C->Loc, C->InitCaptureType.get(),
C->EllipsisLoc, C->Id, InitStyle,
+ C->Init.get(), Method);
----------------
I suggest to add a assertion for `Var` to check it is not null
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1127-1133
+ auto FindVar = [LSI](VarDecl *V) {
+ auto it = std::find_if(
+ LSI->DelayedCaptures.begin(), LSI->DelayedCaptures.end(),
+ [&](auto &&Pair) { return Pair.second.Var == V; });
+ return it;
+ };
+ auto it = FindVar(Var);
----------------
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1182-1184
+ if (Var)
+ LSI->DelayedCaptures[I] = LambdaScopeInfo::DelayedCapture{
+ Var, C->ExplicitRange.getBegin(), C->Kind};
----------------
If `DelayedCaptures` is SmallVector, we could write:
---
I observed there a lot `continue` in the loop. So we could hoist the definition of `Var` to the start of the loop. And we could fill `DelayedCaptures` by RAII.
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1193
+ LambdaIntroducer &Intro) {
+ unsigned I = 0;
+ SourceLocation PrevCaptureLoc;
----------------
Do you think it is better to replace `I` with `std:distance(Intro.Captures.begin(), C)`? I prefer it since we could reduce the scope of `I` in the style.
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1194
+ unsigned I = 0;
+ SourceLocation PrevCaptureLoc;
+ for (auto C = Intro.Captures.begin(), E = Intro.Captures.end(); C != E;
----------------
It looks like we could define `PrevCaptureLoc` in the loop.
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1214
+
+ // C++2a [expr.prim.lambda]p8:
+ // If a lambda-capture includes a capture-default that is =,
----------------
We prefer C++20 than C++2a now.
================
Comment at: clang/lib/Sema/SemaLambda.cpp:1311-1312
+
+ if (ParamInfo.getTrailingRequiresClause())
+ Method->setTrailingRequiresClause(ParamInfo.getTrailingRequiresClause());
+
----------------
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D119136/new/
https://reviews.llvm.org/D119136
More information about the cfe-commits
mailing list