[clang] [Clang] Fix a wrong diagnostic about a local variable inside a lambda in unevaluated contexts need capture (PR #165098)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 25 08:40:36 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Zhikai Zeng (Backl1ght)
<details>
<summary>Changes</summary>
Fixes https://github.com/llvm/llvm-project/issues/163837
We should return true here https://github.com/llvm/llvm-project/blob/035f81138888f30aab67ee12ce09982cd03370cb/clang/lib/Sema/SemaExpr.cpp#L19398-L19400 , but we won't currently due to mismatch of `VarDC` and `DC` while `DC` is instantiated version of `VarDC`.
The reason of mismatch is that `FindInstantiatedDecl` to `result` returns uninstantiated version incorrectly here
https://github.com/llvm/llvm-project/blob/059d90d08f610d5919c42646f267bbab77f7bee4/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp#L7064-L7065
We should return instantiated version if we can find one.
---
Full diff: https://github.com/llvm/llvm-project/pull/165098.diff
3 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+2)
- (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+8-1)
- (modified) clang/test/SemaCXX/lambda-unevaluated.cpp (+19)
``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e6e33e7a9a280..dd7206ba2b253 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -429,6 +429,8 @@ Bug Fixes in This Version
- Fixed a failed assertion with empty filename arguments in ``__has_embed``. (#GH159898)
- Fixed a failed assertion with empty filename in ``#embed`` directive. (#GH162951)
- Fixed a crash triggered by unterminated ``__has_embed``. (#GH162953)
+- Fixed a wrong diagnostic about a local variable inside a lambda in unevaluated
+ contexts need capture. (#GH163837)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 28925cca8f956..439a5317f06f1 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -7061,8 +7061,15 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
// anonymous unions in class templates).
}
- if (!ParentDependsOnArgs)
+ if (!ParentDependsOnArgs) {
+ if (auto Found =
+ CurrentInstantiationScope
+ ? CurrentInstantiationScope->getInstantiationOfIfExists(D)
+ : nullptr) {
+ return cast<NamedDecl>(Found->dyn_cast<Decl *>());
+ }
return D;
+ }
ParentDC = FindInstantiatedContext(Loc, ParentDC, TemplateArgs);
if (!ParentDC)
diff --git a/clang/test/SemaCXX/lambda-unevaluated.cpp b/clang/test/SemaCXX/lambda-unevaluated.cpp
index 9289fc9ec1243..4b0e1abdb38f0 100644
--- a/clang/test/SemaCXX/lambda-unevaluated.cpp
+++ b/clang/test/SemaCXX/lambda-unevaluated.cpp
@@ -282,3 +282,22 @@ static_assert(__is_same_as(int, helper<int>));
} // namespace GH138018
+
+namespace GH163837 {
+
+template<int N>
+void f();
+
+template<class>
+struct X {
+ using type = decltype([](auto) {
+ f<[]{
+ int result = 0;
+ return result;
+ }()>();
+ }(0));
+};
+
+X<void> l;
+
+} // namespace GH163837
``````````
</details>
https://github.com/llvm/llvm-project/pull/165098
More information about the cfe-commits
mailing list