[clang] [Clang][Modules] Fix generic lambda local capture mapping mismatch in template instantiation (PR #202248)
James Y Knight via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 8 07:15:05 PDT 2026
================
@@ -7421,3 +7421,67 @@ void Sema::PerformDependentDiagnostics(const DeclContext *Pattern,
}
}
}
+
+static bool isMappedLocalDecl(const Decl *D) {
+ if (const auto *VD = dyn_cast<VarDecl>(D)) {
+ return VD->isLocalVarDeclOrParm() && !isa<ParmVarDecl>(VD);
+ }
+ return isa<BindingDecl>(D);
+}
+
+const Decl *Sema::getCanonicalLocalDecl(const Decl *D) {
+ if (isa<ParmVarDecl>(D)) {
+ return D;
+ }
+
+ const auto *VD = dyn_cast<VarDecl>(D);
+ const auto *BD = dyn_cast<BindingDecl>(D);
+ if (!VD && !BD) {
+ return D;
+ }
+
+ if (VD && !VD->isLocalVarDeclOrParm()) {
+ return D;
+ }
+
+ const DeclContext *DC = VD ? VD->getDeclContext() : BD->getDeclContext();
+ const auto *FD = dyn_cast<FunctionDecl>(DC);
+ if (!FD) {
+ return D;
+ }
+
+ const auto *CanonFD = FD->getCanonicalDecl();
----------------
jyknight wrote:
We need the canonical _definition_, not just a decl, in order to be able to iterate `decls()` on it. Probably `FD->getDefinition()`? I think that's guaranteed to use return a canonical definition.
That'll end up with this using a different decl than the ParamVar mapping, which uses the `getCanonicalDecl`. But maybe that's fine?
https://github.com/llvm/llvm-project/pull/202248
More information about the cfe-commits
mailing list