https://github.com/Anupamvashistha2002 updated https://github.com/llvm/llvm-project/pull/186741
>From 7ad44dde5bd674ae5f433ce16278713ffeec1118 Mon Sep 17 00:00:00 2001 From: Anupam Vashistha <[email protected]> Date: Mon, 16 Mar 2026 12:13:16 +0530 Subject: [PATCH] [Sema] Propagate preferred_name attribute to existing specializations --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/Sema/SemaDeclAttr.cpp | 16 +++++++++++++--- clang/test/SemaCXX/gh106358.cpp | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 clang/test/SemaCXX/gh106358.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index af124fce2bc64..a6661fac84987 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -299,6 +299,7 @@ Bug Fixes in This Version - Fixed an assertion failure when evaluating ``_Countof`` on invalid ``void``-typed operands. (#GH180893) - Fixed an assertion failure in the serialized diagnostic printer when it is destroyed without calling ``finish()``. (#GH140433) - Fixed an assertion failure caused by error recovery while extending a nested name specifier with results from ordinary lookup. (#GH181470) +- Fixed a bug where the ``preferred_name`` attribute was not propagated to existing specializations. (#GH106358) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 3abc69d0e4b96..519c0d59c3214 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1209,7 +1209,6 @@ static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL) { TSI = S.Context.getTrivialTypeSourceInfo(T, AL.getLoc()); if (!T.hasQualifiers() && T->isTypedefNameType()) { - // Find the template name, if this type names a template specialization. const TemplateDecl *Template = nullptr; if (const auto *CTSD = dyn_cast_if_present<ClassTemplateSpecializationDecl>( T->getAsCXXRecordDecl())) { @@ -1222,7 +1221,19 @@ static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL) { } if (Template && declaresSameEntity(Template, CTD)) { - D->addAttr(::new (S.Context) PreferredNameAttr(S.Context, AL, TSI)); + auto *PNA = ::new (S.Context) PreferredNameAttr(S.Context, AL, TSI); + D->addAttr(PNA); + + for (auto *Spec : CTD->specializations()) { + const TypeDecl *TD = static_cast<const TypeDecl *>(Spec); + if (S.Context.hasSameType(S.Context.getTypeDeclType(TD), + TSI->getType())) { + for (auto *R : Spec->redecls()) { + if (!R->hasAttr<PreferredNameAttr>()) + R->addAttr(PNA->clone(S.Context)); + } + } + } return; } } @@ -1233,7 +1244,6 @@ static void handlePreferredName(Sema &S, Decl *D, const ParsedAttr &AL) { S.Diag(TT->getDecl()->getLocation(), diag::note_entity_declared_at) << TT->getDecl(); } - static void handleNoSpecializations(Sema &S, Decl *D, const ParsedAttr &AL) { StringRef Message; if (AL.getNumArgs() != 0) diff --git a/clang/test/SemaCXX/gh106358.cpp b/clang/test/SemaCXX/gh106358.cpp new file mode 100644 index 0000000000000..82d6378ad12eb --- /dev/null +++ b/clang/test/SemaCXX/gh106358.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// GH106358: Test that preferred_name propagates to specializations +// instantiated before the attribute is seen. + +template<typename T> +void foo(T arg) {} // expected-note {{candidate function template not viable: no known conversion from 'int' to 'my_string' (aka 'my_basic_string<char>') for 1st argument}} + +template<typename T> struct my_basic_string; +using my_string = my_basic_string<char>; + +// This attribute application now correctly propagates to the existing specialization +template<typename T> +struct __attribute__((__preferred_name__(my_string))) my_basic_string {}; + +int main() { + foo<my_string>(123); // expected-error {{no matching function for call to 'foo'}} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
