[PATCH] D121532: [Clang][WIP] Fix Unevaluated Lambdas
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 14 05:32:02 PDT 2022
aaron.ballman added a reviewer: erichkeane.
aaron.ballman added a comment.
Adding Erich to look at this WIP for early feedback as he's recently been looking at template instantiation guts rather deeply, but I added some questions.
================
Comment at: clang/include/clang/AST/DeclCXX.h:280-282
+ LDKUnknown = 0,
+ LDKAlwaysDependent,
+ LDKNeverDependent,
----------------
(Matches the naming style used just above.)
================
Comment at: clang/lib/Sema/TreeTransform.h:12934
+ // substituting an unevaluated lambda inside of a function's parameter's type
+ // - as parameter type are not instanciated from within a function's DC. We
+ // use isUnevaluatedContext() to distinguish the function parameter case.
----------------
================
Comment at: clang/lib/Sema/TreeTransform.h:12948
+
+ if (OldClass->isDependentContext())
+ getDerived().transformedLocalDecl(OldClass, {Class});
----------------
Can you explain why you only do these transformations when the old class is a dependent context? Also, should this be looking at `getDerived().AlwaysRebuild()`? I'm not certain -- we're not calling any `Rebuild*` functions here because lambdas are not rebuilt but generated entirely from scratch. So I'm guessing we don't need to look at `AlwaysRebuild`, but it's a bit unclear.
================
Comment at: clang/lib/Sema/TreeTransform.h:12968-12971
+ if (E->getCallOperator()->isDependentContext()) {
+ getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
+ getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
+ }
----------------
Are these changes necessary as part of this patch? I'm a bit worried that only doing this in dependent contexts may change behavior for code like this: https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp#L769
================
Comment at: clang/lib/Sema/TreeTransform.h:13040
- getDerived().transformedLocalDecl(OldVD, NewVDs);
+ if (OldVD->isTemplated())
+ getDerived().transformedLocalDecl(OldVD, NewVDs);
----------------
This also seems a bit surprising -- can't the variable declaration be non-templated but still dependent (e.g., an `auto` variable whose initialization is dependent?)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D121532/new/
https://reviews.llvm.org/D121532
More information about the cfe-commits
mailing list