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
