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/166784 The cause is that we will cache `KnownField` after check of `B`, and use the cache incorrectly when performing check of type `A`. This pr add a check to make sure we use correct cache. https://github.com/llvm/llvm-project/blob/545c3022d28164f5040036a7b515a85f74dbd5cc/clang/lib/Sema/SemaInit.cpp#L2939-L2957 --- Full diff: https://github.com/llvm/llvm-project/pull/167159.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/lib/Sema/SemaInit.cpp (+2) - (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+8-1) - (modified) clang/test/SemaTemplate/temp_arg_nontype_cxx2c.cpp (+23) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 6b396e7ba63f3..869223512ab29 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -459,6 +459,8 @@ Bug Fixes in This Version - Fixed a crash triggered by unterminated ``__has_embed``. (#GH162953) - Accept empty enumerations in MSVC-compatible C mode. (#GH114402) - Fixed false-positive shadow diagnostics for lambdas in explicit object member functions. (#GH163731) +- Fixed a incorrect diagnostic for ambiguous function call that use a + designated-initializer as template argument. (#GH166784) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index cc6ddf568d346..58c1c01c9b3ba 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2937,6 +2937,8 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, } FieldDecl *KnownField = D->getFieldDecl(); + if (KnownField && KnownField->getParent() != RD) + KnownField = nullptr; if (!KnownField) { const IdentifierInfo *FieldName = D->getFieldName(); ValueDecl *VD = SemaRef.tryLookupUnambiguousFieldDecl(RD, FieldName); diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 4d58f00168298..2d3d8ef5279ce 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -7060,8 +7060,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/SemaTemplate/temp_arg_nontype_cxx2c.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx2c.cpp index c4ac36e263bc8..613956324cb35 100644 --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx2c.cpp +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx2c.cpp @@ -134,3 +134,26 @@ namespace error_on_type_instantiation { template void g<int>(); // expected-note@-1 {{in instantiation of function template specialization}} } + +namespace GH166784 { + +struct A { + int a; +}; +struct B { + int b; +}; +template <A a> void f() { + static_assert(a.a == 42); +} +template <B b> void f() { + static_assert(b.b == 42); +} + +using T1 = decltype(f<{.a = 42}>()); +using T2 = decltype(f<A{.a = 42}>()); + +using T3 = decltype(f<{.b = 42}>()); +using T4 = decltype(f<B{.b = 42}>()); + +} // namespace GH166784 `````````` </details> https://github.com/llvm/llvm-project/pull/167159 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
