https://github.com/to268 updated 
https://github.com/llvm/llvm-project/pull/182208

>From 0f1f0cc6976c457f27fc3890da6dc2998af53c99 Mon Sep 17 00:00:00 2001
From: Tony Guillot <[email protected]>
Date: Thu, 19 Feb 2026 02:46:41 +0100
Subject: [PATCH 1/2] Fixed init_priority attribute when used with auto

---
 clang/docs/ReleaseNotes.rst               |  1 +
 clang/include/clang/Basic/Attr.td         |  1 +
 clang/include/clang/Sema/Sema.h           |  1 +
 clang/lib/Sema/SemaDeclAttr.cpp           | 19 +++++++++++--------
 clang/test/Sema/type-dependent-attrs.cpp  | 11 +++++++++++
 clang/test/SemaCXX/init-priority-attr.cpp |  6 ++++++
 6 files changed, 31 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Sema/type-dependent-attrs.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c648e8b0ec6fa..67d01fae0c2f0 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -275,6 +275,7 @@ Bug Fixes to Compiler Builtins
 Bug Fixes to Attribute Support
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - Fixed a behavioral discrepancy between deleted functions and private members 
when checking the ``enable_if`` attribute. (#GH175895)
+- Fixed ``init_priority`` attribute by delaying type checks until after the 
type is deduced.
 
 Bug Fixes to C++ Support
 ^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 2621d178d99e8..a18d02f12d6d8 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -3275,6 +3275,7 @@ def InitPriority : InheritableAttr, 
TargetSpecificAttr<TargetSupportsInitPriorit
   let Args = [UnsignedArgument<"Priority">];
   let Subjects = SubjectList<[Var], ErrorDiag>;
   let Documentation = [InitPriorityDocs];
+  let IsTypeDependent = 1;
 }
 
 def Section : InheritableAttr {
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 9424b80d5cdb6..35ea799296805 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -15577,6 +15577,7 @@ class Sema final : public SemaBase {
   ActOnEffectExpression(Expr *CondExpr, StringRef AttributeName);
 
   void ActOnCleanupAttr(Decl *D, const Attr *A);
+  void ActOnInitPriorityAttr(Decl *D, const Attr *A);
 
 private:
   /// The implementation of RequireCompleteType
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 5dbff18fff7a9..e69c49b87a31e 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -3834,14 +3834,6 @@ static void handleInitPriorityAttr(Sema &S, Decl *D, 
const ParsedAttr &AL) {
     AL.setInvalid();
     return;
   }
-  QualType T = cast<VarDecl>(D)->getType();
-  if (S.Context.getAsArrayType(T))
-    T = S.Context.getBaseElementType(T);
-  if (!T->isRecordType()) {
-    S.Diag(AL.getLoc(), diag::err_init_priority_object_attr);
-    AL.setInvalid();
-    return;
-  }
 
   Expr *E = AL.getArgAsExpr(0);
   uint32_t prioritynum;
@@ -8660,3 +8652,14 @@ void Sema::ActOnCleanupAttr(Decl *D, const Attr *A) {
     return;
   }
 }
+
+void Sema::ActOnInitPriorityAttr(Decl *D, const Attr *A) {
+  QualType T = cast<VarDecl>(D)->getType();
+  if (this->Context.getAsArrayType(T))
+    T = this->Context.getBaseElementType(T);
+  if (!T->isRecordType()) {
+    this->Diag(A->getLoc(), diag::err_init_priority_object_attr);
+    D->dropAttr<InitPriorityAttr>();
+    return;
+  }
+}
diff --git a/clang/test/Sema/type-dependent-attrs.cpp 
b/clang/test/Sema/type-dependent-attrs.cpp
new file mode 100644
index 0000000000000..366b130c62c94
--- /dev/null
+++ b/clang/test/Sema/type-dependent-attrs.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+namespace InitPriorityAttribute {
+  struct S1 {} s1;
+  struct S2 {} s2; // #S2_INIT_PRIORITY
+  [[gnu::init_priority(1000)]] auto auto_var = s1;
+  [[gnu::init_priority(1000)]] S1 struct_var = s1;
+  [[gnu::init_priority(1000)]] S2 invalid_var = s1; // expected-error {{no 
viable conversion from 'struct S1' to 'S2'}} \
+                                                       
expected-note@#S2_INIT_PRIORITY {{candidate constructor (the implicit copy 
constructor) not viable: no known conversion from 'struct S1' to 'const S2 &' 
for 1st argument}} \
+                                                       
expected-note@#S2_INIT_PRIORITY {{candidate constructor (the implicit move 
constructor) not viable: no known conversion from 'struct S1' to 'S2 &&' for 
1st argument}}
+}
diff --git a/clang/test/SemaCXX/init-priority-attr.cpp 
b/clang/test/SemaCXX/init-priority-attr.cpp
index 8151bf7aecb95..c5fab7b42502e 100644
--- a/clang/test/SemaCXX/init-priority-attr.cpp
+++ b/clang/test/SemaCXX/init-priority-attr.cpp
@@ -65,3 +65,9 @@ int main() {
   Two foo __attribute__((init_priority(1001))); // expected-error {{can only 
use 'init_priority' attribute on file-scope definitions of objects of class 
type}}
 // unknown-warning@-1 {{unknown attribute 'init_priority' ignored}}
 }
+
+struct S1 {} s1;
+[[gnu::init_priority(1001)]] auto auto_var = s1;
+// unknown-warning@-1 {{unknown attribute 'gnu::init_priority' ignored}}
+[[gnu::init_priority(1001)]] S1 struct_var = s1;
+// unknown-warning@-1 {{unknown attribute 'gnu::init_priority' ignored}}

>From acdefca452aafa731d4e45e4133354fb4df11dbf Mon Sep 17 00:00:00 2001
From: Tony Guillot <[email protected]>
Date: Thu, 19 Feb 2026 11:17:50 +0100
Subject: [PATCH 2/2] Removed useless return statement

---
 clang/lib/Sema/SemaDeclAttr.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index e69c49b87a31e..73c8e48499451 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -8660,6 +8660,5 @@ void Sema::ActOnInitPriorityAttr(Decl *D, const Attr *A) {
   if (!T->isRecordType()) {
     this->Diag(A->getLoc(), diag::err_init_priority_object_attr);
     D->dropAttr<InitPriorityAttr>();
-    return;
   }
 }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to