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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to