https://github.com/Backl1ght updated https://github.com/llvm/llvm-project/pull/167159
>From 74abefc47084055f65210320260513ed06e6060f Mon Sep 17 00:00:00 2001 From: Backl1ght <[email protected]> Date: Sat, 8 Nov 2025 17:13:21 +0000 Subject: [PATCH 1/4] add check --- clang/docs/ReleaseNotes.rst | 2 ++ clang/lib/Sema/SemaInit.cpp | 2 ++ .../SemaTemplate/temp_arg_nontype_cxx2c.cpp | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 63930f43c25e3..2e056ffb79ff0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -489,6 +489,8 @@ Bug Fixes in This Version - Accept empty enumerations in MSVC-compatible C mode. (#GH114402) - Fix a bug leading to incorrect code generation with complex number compound assignment and bitfield values, which also caused a crash with UBsan. (#GH166798) - 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/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 >From 2d7ea82dfedfa9fcf37e58517b67d330484416b3 Mon Sep 17 00:00:00 2001 From: Backl1ght <[email protected]> Date: Sat, 8 Nov 2025 17:26:08 +0000 Subject: [PATCH 2/4] fix typo --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 2e056ffb79ff0..56fe8d46d9801 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -489,7 +489,7 @@ Bug Fixes in This Version - Accept empty enumerations in MSVC-compatible C mode. (#GH114402) - Fix a bug leading to incorrect code generation with complex number compound assignment and bitfield values, which also caused a crash with UBsan. (#GH166798) - Fixed false-positive shadow diagnostics for lambdas in explicit object member functions. (#GH163731) -- Fixed a incorrect diagnostic for ambiguous function call that use a +- Fixed an incorrect diagnostic for ambiguous function call that use a designated-initializer as template argument. (#GH166784) Bug Fixes to Compiler Builtins >From 99a7b2f082967aaf3dc58306fb95c8eebecb8b0f Mon Sep 17 00:00:00 2001 From: Backl1ght <[email protected]> Date: Sun, 9 Nov 2025 06:51:09 +0000 Subject: [PATCH 3/4] fix typo --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 56fe8d46d9801..eb527f258a74b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -489,7 +489,7 @@ Bug Fixes in This Version - Accept empty enumerations in MSVC-compatible C mode. (#GH114402) - Fix a bug leading to incorrect code generation with complex number compound assignment and bitfield values, which also caused a crash with UBsan. (#GH166798) - Fixed false-positive shadow diagnostics for lambdas in explicit object member functions. (#GH163731) -- Fixed an incorrect diagnostic for ambiguous function call that use a +- Fixed an incorrect diagnostic for ambiguous function call that uses a designated-initializer as template argument. (#GH166784) Bug Fixes to Compiler Builtins >From c4c9ce2aad2d77669b48ec36b3499f9a73ac1d4b Mon Sep 17 00:00:00 2001 From: Backl1ght <[email protected]> Date: Fri, 21 Nov 2025 16:21:41 +0000 Subject: [PATCH 4/4] clear field decls after check done --- clang/include/clang/AST/Expr.h | 5 +++++ clang/lib/Sema/SemaInit.cpp | 2 -- clang/lib/Sema/SemaTemplate.cpp | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 573cc72db35c6..594d21b021a93 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -5628,6 +5628,11 @@ class DesignatedInitExpr final FieldInfo.NameOrField = reinterpret_cast<uintptr_t>(FD); } + void clearFieldDecl() { + assert(isFieldDesignator() && "Only valid on a field designator"); + FieldInfo.NameOrField = reinterpret_cast<uintptr_t>(getFieldName()) | 0x1; + } + SourceLocation getDotLoc() const { assert(isFieldDesignator() && "Only valid on a field designator"); return FieldInfo.DotLoc; diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 58c1c01c9b3ba..cc6ddf568d346 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -2937,8 +2937,6 @@ 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/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 4a9e1bc93b918..393ca402adcea 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -7291,11 +7291,26 @@ ExprResult Sema::CheckTemplateArgument(NamedDecl *Param, QualType ParamType, Result = ActOnConstantExpression(Result.get()); if (Result.isInvalid() || !Result.get()) return ExprError(); + Expr *OldDeductionArg = DeductionArg; setDeductionArg(ActOnFinishFullExpr(Result.get(), Arg->getBeginLoc(), /*DiscardedValue=*/false, /*IsConstexpr=*/true, /*IsTemplateArgument=*/true) .get()); + // As for designated initializer, there might be multiple candidate + // template parameter types, we must clear field decls of designators + // to make sure results of current check will not affect checks for + // later types. + if (InitListExpr *ILE = dyn_cast<InitListExpr>(OldDeductionArg)) { + for (Expr *I : ILE->inits()) { + if (DesignatedInitExpr *DIE = dyn_cast<DesignatedInitExpr>(I)) { + for (DesignatedInitExpr::Designator &D : DIE->designators()) { + if (D.isFieldDesignator()) + D.clearFieldDecl(); + } + } + } + } IsConvertedConstantExpression = false; } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
