https://github.com/Katze719 updated 
https://github.com/llvm/llvm-project/pull/160853

>From 189c4b6bf18cc91feb62f017446b87366ada2f8a Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Fri, 26 Sep 2025 09:37:35 +0000
Subject: [PATCH 1/8] Add support for new C++ declaration specifiers in
 QualifierOrder

---
 clang/lib/Format/QualifierAlignmentFixer.cpp  |  24 +++
 clang/unittests/Format/QualifierFixerTest.cpp | 142 +++++++++++++-----
 2 files changed, 131 insertions(+), 35 deletions(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 3d1a9dc868208..b9e214d5aeee6 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -175,6 +175,18 @@ static bool isQualifier(const FormatToken *const Tok) {
   case tok::kw___ptr32:
   case tok::kw___ptr64:
   case tok::kw___funcref:
+  case tok::kw_typedef:
+  case tok::kw_consteval:
+  case tok::kw_constinit:
+  case tok::kw_thread_local:
+  case tok::kw_extern:
+  case tok::kw_mutable:
+  case tok::kw_signed:
+  case tok::kw_unsigned:
+  case tok::kw_long:
+  case tok::kw_short:
+  case tok::kw_decltype:
+  case tok::kw_explicit:
     return true;
   default:
     return false;
@@ -544,6 +556,18 @@ tok::TokenKind 
LeftRightQualifierAlignmentFixer::getTokenFromQualifier(
       .Case("constexpr", tok::kw_constexpr)
       .Case("restrict", tok::kw_restrict)
       .Case("friend", tok::kw_friend)
+      .Case("typedef", tok::kw_typedef)
+      .Case("consteval", tok::kw_consteval)
+      .Case("constinit", tok::kw_constinit)
+      .Case("thread_local", tok::kw_thread_local)
+      .Case("extern", tok::kw_extern)
+      .Case("mutable", tok::kw_mutable)
+      .Case("signed", tok::kw_signed)
+      .Case("unsigned", tok::kw_unsigned)
+      .Case("long", tok::kw_long)
+      .Case("short", tok::kw_short)
+      .Case("decltype", tok::kw_decltype)
+      .Case("explicit", tok::kw_explicit)
       .Default(tok::identifier);
 }
 
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index edde7bb3b5c97..419ab741ffba6 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -50,6 +50,30 @@ TEST_F(QualifierFixerTest, RotateTokens) {
             tok::kw_restrict);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("friend"),
             tok::kw_friend);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("typedef"),
+            tok::kw_typedef);
+  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("consteval"),
+            tok::kw_consteval);
+  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("constinit"),
+            tok::kw_constinit);
+  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("thread_local"),
+            tok::kw_thread_local);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("extern"),
+            tok::kw_extern);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("mutable"),
+            tok::kw_mutable);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("signed"),
+            tok::kw_signed);
+  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("unsigned"),
+            tok::kw_unsigned);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("long"),
+            tok::kw_long);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("short"),
+            tok::kw_short);
+  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("decltype"),
+            tok::kw_decltype);
+  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("explicit"),
+            tok::kw_explicit);
 }
 
 TEST_F(QualifierFixerTest, FailQualifierInvalidConfiguration) {
@@ -1059,48 +1083,37 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   ConfiguredTokens.push_back(tok::kw_restrict);
   ConfiguredTokens.push_back(tok::kw_constexpr);
   ConfiguredTokens.push_back(tok::kw_friend);
+  ConfiguredTokens.push_back(tok::kw_typedef);
+  ConfiguredTokens.push_back(tok::kw_consteval);
+  ConfiguredTokens.push_back(tok::kw_constinit);
+  ConfiguredTokens.push_back(tok::kw_thread_local);
+  ConfiguredTokens.push_back(tok::kw_extern);
+  ConfiguredTokens.push_back(tok::kw_mutable);
+  ConfiguredTokens.push_back(tok::kw_signed);
+  ConfiguredTokens.push_back(tok::kw_unsigned);
+  ConfiguredTokens.push_back(tok::kw_long);
+  ConfiguredTokens.push_back(tok::kw_short);
+  ConfiguredTokens.push_back(tok::kw_decltype);
+  ConfiguredTokens.push_back(tok::kw_explicit);
 
   TestLexer lexer{Allocator, Buffers};
   const auto LangOpts = getFormattingLangOpts();
 
   auto Tokens = lexer.lex(
-      "const static inline auto restrict int double long constexpr friend");
-  ASSERT_EQ(Tokens.size(), 11u) << Tokens;
-
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[0], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[1], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[2], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[3], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[4], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[5], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[6], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[7], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[8], ConfiguredTokens, LangOpts));
-  EXPECT_TRUE(
-      isConfiguredQualifierOrType(Tokens[9], ConfiguredTokens, LangOpts));
-
-  EXPECT_TRUE(isQualifierOrType(Tokens[0], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[1], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[2], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[3], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[4], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[5], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[6], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[7], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[8], LangOpts));
-  EXPECT_TRUE(isQualifierOrType(Tokens[9], LangOpts));
+      "const static inline restrict int double long constexpr friend "
+      "typedef consteval constinit thread_local extern mutable signed unsigned 
short decltype explicit");
+  ASSERT_EQ(Tokens.size(), 20u) << Tokens;
+
+  // Test that all tokens are recognized
+  for (size_t i = 0; i < 20; ++i) {
+    EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[i], ConfiguredTokens, 
LangOpts)) 
+        << "Token " << i << " should be recognized";
+    EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts)) 
+        << "Token " << i << " should be recognized by isQualifierOrType";
+  }
 
   auto NotTokens = lexer.lex("for while do Foo Bar ");
-  ASSERT_EQ(NotTokens.size(), 6u) << Tokens;
+  ASSERT_EQ(NotTokens.size(), 6u) << NotTokens;
 
   EXPECT_FALSE(
       isConfiguredQualifierOrType(NotTokens[0], ConfiguredTokens, LangOpts));
@@ -1440,6 +1453,65 @@ TEST_F(QualifierFixerTest, TemplatesLeft) {
                "TemplateType<Container const> t;", Style);
 }
 
+TEST_F(QualifierFixerTest, NewQualifierSupport) {
+  FormatStyle Style = getLLVMStyle();
+  Style.QualifierAlignment = FormatStyle::QAS_Custom;
+  
+  // Test typedef qualifier
+  Style.QualifierOrder = {"typedef", "type"};
+  verifyFormat("typedef int MyInt;", Style);
+  
+  // Test consteval qualifier
+  Style.QualifierOrder = {"consteval", "type"};
+  verifyFormat("consteval int func();", "int consteval func();", Style);
+  
+  // Test constinit qualifier
+  Style.QualifierOrder = {"constinit", "static", "type"};
+  verifyFormat("constinit static int var = 10;", "static constinit int var = 
10;", Style);
+  
+  // Test thread_local qualifier
+  Style.QualifierOrder = {"thread_local", "static", "type"};
+  verifyFormat("thread_local static int counter;", "static thread_local int 
counter;", Style);
+  
+  // Test extern qualifier
+  Style.QualifierOrder = {"extern", "type"};
+  verifyFormat("extern int global_var;", "int extern global_var;", Style);
+  
+  // Test mutable qualifier
+  Style.QualifierOrder = {"mutable", "type"};
+  verifyFormat("mutable int cache;", "int mutable cache;", Style);
+  
+  // Test signed/unsigned qualifiers
+  Style.QualifierOrder = {"signed", "type"};
+  verifyFormat("signed int num;", "int signed num;", Style);
+  Style.QualifierOrder = {"unsigned", "type"};
+  verifyFormat("unsigned int num;", "int unsigned num;", Style);
+  
+  // Test long/short qualifiers
+  Style.QualifierOrder = {"long", "type"};
+  verifyFormat("long int num;", "int long num;", Style);
+  Style.QualifierOrder = {"short", "type"};
+  verifyFormat("short int num;", "int short num;", Style);
+  
+  // Test decltype qualifier
+  Style.QualifierOrder = {"decltype", "type"};
+  // Note: decltype is typically used with parentheses and doesn't usually get 
reordered
+  // This test mainly verifies it's recognized as a qualifier
+  
+  // Test explicit qualifier 
+  Style.QualifierOrder = {"explicit", "type"};
+  // Note: explicit is typically used with constructors and doesn't usually 
get reordered
+  // This test mainly verifies it's recognized as a qualifier
+  
+  // Test complex combination with new qualifiers
+  Style.QualifierOrder = {"extern", "thread_local", "static", "constexpr",
+                          "inline", "unsigned", "long", "type", 
+                          "const", "volatile"};
+  
+  verifyFormat("extern thread_local static constexpr inline unsigned long int 
const volatile var;",
+               "volatile const extern constexpr thread_local static inline 
unsigned long int var;", Style);
+}
+
 TEST_F(QualifierFixerTest, Ranges) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;

>From 85fd738d08cb13fdda2d9ce50136ebd498eed0a7 Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Sat, 4 Oct 2025 20:46:49 +0200
Subject: [PATCH 2/8] Remove decltype qualifier handling from
 QualifierAlignmentFixer

---
 clang/lib/Format/QualifierAlignmentFixer.cpp  |  2 --
 clang/unittests/Format/QualifierFixerTest.cpp | 26 +++----------------
 2 files changed, 3 insertions(+), 25 deletions(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index b9e214d5aeee6..d3472e6fb7287 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -185,7 +185,6 @@ static bool isQualifier(const FormatToken *const Tok) {
   case tok::kw_unsigned:
   case tok::kw_long:
   case tok::kw_short:
-  case tok::kw_decltype:
   case tok::kw_explicit:
     return true;
   default:
@@ -566,7 +565,6 @@ tok::TokenKind 
LeftRightQualifierAlignmentFixer::getTokenFromQualifier(
       .Case("unsigned", tok::kw_unsigned)
       .Case("long", tok::kw_long)
       .Case("short", tok::kw_short)
-      .Case("decltype", tok::kw_decltype)
       .Case("explicit", tok::kw_explicit)
       .Default(tok::identifier);
 }
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 419ab741ffba6..5732fafb1c44a 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -70,8 +70,6 @@ TEST_F(QualifierFixerTest, RotateTokens) {
             tok::kw_long);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("short"),
             tok::kw_short);
-  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("decltype"),
-            tok::kw_decltype);
   
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("explicit"),
             tok::kw_explicit);
 }
@@ -1093,7 +1091,6 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   ConfiguredTokens.push_back(tok::kw_unsigned);
   ConfiguredTokens.push_back(tok::kw_long);
   ConfiguredTokens.push_back(tok::kw_short);
-  ConfiguredTokens.push_back(tok::kw_decltype);
   ConfiguredTokens.push_back(tok::kw_explicit);
 
   TestLexer lexer{Allocator, Buffers};
@@ -1101,11 +1098,11 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
 
   auto Tokens = lexer.lex(
       "const static inline restrict int double long constexpr friend "
-      "typedef consteval constinit thread_local extern mutable signed unsigned 
short decltype explicit");
-  ASSERT_EQ(Tokens.size(), 20u) << Tokens;
+  "typedef consteval constinit thread_local extern mutable signed unsigned 
short explicit");
+  ASSERT_EQ(Tokens.size(), 19u) << Tokens;
 
   // Test that all tokens are recognized
-  for (size_t i = 0; i < 20; ++i) {
+  for (size_t i = 0; i < 19; ++i) {
     EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[i], ConfiguredTokens, 
LangOpts)) 
         << "Token " << i << " should be recognized";
     EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts)) 
@@ -1457,53 +1454,36 @@ TEST_F(QualifierFixerTest, NewQualifierSupport) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;
   
-  // Test typedef qualifier
   Style.QualifierOrder = {"typedef", "type"};
   verifyFormat("typedef int MyInt;", Style);
   
-  // Test consteval qualifier
   Style.QualifierOrder = {"consteval", "type"};
   verifyFormat("consteval int func();", "int consteval func();", Style);
   
-  // Test constinit qualifier
   Style.QualifierOrder = {"constinit", "static", "type"};
   verifyFormat("constinit static int var = 10;", "static constinit int var = 
10;", Style);
   
-  // Test thread_local qualifier
   Style.QualifierOrder = {"thread_local", "static", "type"};
   verifyFormat("thread_local static int counter;", "static thread_local int 
counter;", Style);
   
-  // Test extern qualifier
   Style.QualifierOrder = {"extern", "type"};
   verifyFormat("extern int global_var;", "int extern global_var;", Style);
   
-  // Test mutable qualifier
   Style.QualifierOrder = {"mutable", "type"};
   verifyFormat("mutable int cache;", "int mutable cache;", Style);
   
-  // Test signed/unsigned qualifiers
   Style.QualifierOrder = {"signed", "type"};
   verifyFormat("signed int num;", "int signed num;", Style);
   Style.QualifierOrder = {"unsigned", "type"};
   verifyFormat("unsigned int num;", "int unsigned num;", Style);
   
-  // Test long/short qualifiers
   Style.QualifierOrder = {"long", "type"};
   verifyFormat("long int num;", "int long num;", Style);
   Style.QualifierOrder = {"short", "type"};
   verifyFormat("short int num;", "int short num;", Style);
   
-  // Test decltype qualifier
-  Style.QualifierOrder = {"decltype", "type"};
-  // Note: decltype is typically used with parentheses and doesn't usually get 
reordered
-  // This test mainly verifies it's recognized as a qualifier
-  
-  // Test explicit qualifier 
   Style.QualifierOrder = {"explicit", "type"};
-  // Note: explicit is typically used with constructors and doesn't usually 
get reordered
-  // This test mainly verifies it's recognized as a qualifier
   
-  // Test complex combination with new qualifiers
   Style.QualifierOrder = {"extern", "thread_local", "static", "constexpr",
                           "inline", "unsigned", "long", "type", 
                           "const", "volatile"};

>From 05c8a9ae0108987a990e3a58659fe1acd2292d25 Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Wed, 14 Jan 2026 21:09:58 +0100
Subject: [PATCH 3/8] Refactor QualifierFixerTest for improved readability and
 support for new qualifiers

---
 clang/unittests/Format/QualifierFixerTest.cpp | 78 ++++++++++---------
 1 file changed, 41 insertions(+), 37 deletions(-)

diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 5732fafb1c44a..59fa1f874fa91 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -52,12 +52,15 @@ TEST_F(QualifierFixerTest, RotateTokens) {
             tok::kw_friend);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("typedef"),
             tok::kw_typedef);
-  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("consteval"),
-            tok::kw_consteval);
-  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("constinit"),
-            tok::kw_constinit);
-  
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("thread_local"),
-            tok::kw_thread_local);
+  EXPECT_EQ(
+      LeftRightQualifierAlignmentFixer::getTokenFromQualifier("consteval"),
+      tok::kw_consteval);
+  EXPECT_EQ(
+      LeftRightQualifierAlignmentFixer::getTokenFromQualifier("constinit"),
+      tok::kw_constinit);
+  EXPECT_EQ(
+      LeftRightQualifierAlignmentFixer::getTokenFromQualifier("thread_local"),
+      tok::kw_thread_local);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("extern"),
             tok::kw_extern);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("mutable"),
@@ -1097,15 +1100,17 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   const auto LangOpts = getFormattingLangOpts();
 
   auto Tokens = lexer.lex(
-      "const static inline restrict int double long constexpr friend "
-  "typedef consteval constinit thread_local extern mutable signed unsigned 
short explicit");
-  ASSERT_EQ(Tokens.size(), 19u) << Tokens;
+      "const static inline restrict int double constexpr friend "
+      "typedef consteval constinit thread_local extern mutable signed unsigned 
"
+      "long short explicit");
+  ASSERT_EQ(Tokens.size(), 20u) << Tokens;
 
   // Test that all tokens are recognized
-  for (size_t i = 0; i < 19; ++i) {
-    EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[i], ConfiguredTokens, 
LangOpts)) 
+  for (size_t i = 0; i < 20; ++i) {
+    EXPECT_TRUE(
+        isConfiguredQualifierOrType(Tokens[i], ConfiguredTokens, LangOpts))
         << "Token " << i << " should be recognized";
-    EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts)) 
+    EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts))
         << "Token " << i << " should be recognized by isQualifierOrType";
   }
 
@@ -1453,43 +1458,42 @@ TEST_F(QualifierFixerTest, TemplatesLeft) {
 TEST_F(QualifierFixerTest, NewQualifierSupport) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;
-  
+
   Style.QualifierOrder = {"typedef", "type"};
   verifyFormat("typedef int MyInt;", Style);
-  
+
   Style.QualifierOrder = {"consteval", "type"};
   verifyFormat("consteval int func();", "int consteval func();", Style);
-  
+  verifyFormat("consteval void func();", "void consteval func();", Style);
+
   Style.QualifierOrder = {"constinit", "static", "type"};
-  verifyFormat("constinit static int var = 10;", "static constinit int var = 
10;", Style);
-  
+  verifyFormat("constinit static int var = 10;",
+               "static constinit int var = 10;", Style);
+
   Style.QualifierOrder = {"thread_local", "static", "type"};
-  verifyFormat("thread_local static int counter;", "static thread_local int 
counter;", Style);
-  
+  verifyFormat("thread_local static int counter;",
+               "static thread_local int counter;", Style);
+
   Style.QualifierOrder = {"extern", "type"};
   verifyFormat("extern int global_var;", "int extern global_var;", Style);
-  
+  verifyFormat("extern void func();", "void extern func();", Style);
+
   Style.QualifierOrder = {"mutable", "type"};
   verifyFormat("mutable int cache;", "int mutable cache;", Style);
-  
-  Style.QualifierOrder = {"signed", "type"};
-  verifyFormat("signed int num;", "int signed num;", Style);
-  Style.QualifierOrder = {"unsigned", "type"};
-  verifyFormat("unsigned int num;", "int unsigned num;", Style);
-  
-  Style.QualifierOrder = {"long", "type"};
-  verifyFormat("long int num;", "int long num;", Style);
-  Style.QualifierOrder = {"short", "type"};
-  verifyFormat("short int num;", "int short num;", Style);
-  
+
   Style.QualifierOrder = {"explicit", "type"};
-  
+  verifyFormat("explicit Foo(int x);", Style);
+  verifyFormat("explicit operator bool();", Style);
+
   Style.QualifierOrder = {"extern", "thread_local", "static", "constexpr",
-                          "inline", "unsigned", "long", "type", 
-                          "const", "volatile"};
-  
-  verifyFormat("extern thread_local static constexpr inline unsigned long int 
const volatile var;",
-               "volatile const extern constexpr thread_local static inline 
unsigned long int var;", Style);
+                          "inline", "unsigned",     "long",   "type",
+                          "const",  "volatile"};
+
+  verifyFormat("extern thread_local static constexpr inline unsigned long int "
+               "const volatile var;",
+               "volatile const extern constexpr thread_local static inline "
+               "unsigned long int var;",
+               Style);
 }
 
 TEST_F(QualifierFixerTest, Ranges) {

>From 4341fac15a1cdd6f3d8afe0a735b2df8728e69d4 Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Wed, 14 Jan 2026 21:28:01 +0100
Subject: [PATCH 4/8] Enhance QualifierAlignmentFixer to handle signed
 qualifiers alongside unsigned.

---
 clang/lib/Format/QualifierAlignmentFixer.cpp  |  8 +++-
 clang/unittests/Format/QualifierFixerTest.cpp | 39 ++++++++++++++-----
 2 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index d3472e6fb7287..1b5decb1da5ca 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -561,7 +561,6 @@ tok::TokenKind 
LeftRightQualifierAlignmentFixer::getTokenFromQualifier(
       .Case("thread_local", tok::kw_thread_local)
       .Case("extern", tok::kw_extern)
       .Case("mutable", tok::kw_mutable)
-      .Case("signed", tok::kw_signed)
       .Case("unsigned", tok::kw_unsigned)
       .Case("long", tok::kw_long)
       .Case("short", tok::kw_short)
@@ -645,8 +644,13 @@ void prepareLeftRightOrderingForQualifierAlignmentFixer(
 
     tok::TokenKind QualifierToken =
         LeftRightQualifierAlignmentFixer::getTokenFromQualifier(s);
-    if (QualifierToken != tok::kw_typeof && QualifierToken != tok::identifier)
+    if (QualifierToken != tok::kw_typeof && QualifierToken != tok::identifier) 
{
       Qualifiers.push_back(QualifierToken);
+      // Handle signed and unsigned together: if unsigned is configured,
+      // also treat signed as configured at the same position.
+      if (QualifierToken == tok::kw_unsigned)
+        Qualifiers.push_back(tok::kw_signed);
+    }
 
     if (left) {
       // Reverse the order for left aligned items.
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 59fa1f874fa91..52a49fbbf65b8 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -65,8 +65,6 @@ TEST_F(QualifierFixerTest, RotateTokens) {
             tok::kw_extern);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("mutable"),
             tok::kw_mutable);
-  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("signed"),
-            tok::kw_signed);
   
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("unsigned"),
             tok::kw_unsigned);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("long"),
@@ -1090,7 +1088,6 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   ConfiguredTokens.push_back(tok::kw_thread_local);
   ConfiguredTokens.push_back(tok::kw_extern);
   ConfiguredTokens.push_back(tok::kw_mutable);
-  ConfiguredTokens.push_back(tok::kw_signed);
   ConfiguredTokens.push_back(tok::kw_unsigned);
   ConfiguredTokens.push_back(tok::kw_long);
   ConfiguredTokens.push_back(tok::kw_short);
@@ -1103,15 +1100,21 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
       "const static inline restrict int double constexpr friend "
       "typedef consteval constinit thread_local extern mutable signed unsigned 
"
       "long short explicit");
-  ASSERT_EQ(Tokens.size(), 20u) << Tokens;
+  ASSERT_EQ(Tokens.size(), 19u) << Tokens;
+
+  for (size_t i = 0; i < 19; ++i) {
+    EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts))
+        << "Token " << i << " should be recognized by isQualifierOrType";
+  }
+
+  // When unsigned is configured, signed is automatically added to
+  // ConfiguredTokens to handle them at the same position
+  ConfiguredTokens.push_back(tok::kw_signed);
 
-  // Test that all tokens are recognized
-  for (size_t i = 0; i < 20; ++i) {
+  for (size_t i = 0; i < 19; ++i) {
     EXPECT_TRUE(
         isConfiguredQualifierOrType(Tokens[i], ConfiguredTokens, LangOpts))
         << "Token " << i << " should be recognized";
-    EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts))
-        << "Token " << i << " should be recognized by isQualifierOrType";
   }
 
   auto NotTokens = lexer.lex("for while do Foo Bar ");
@@ -1476,14 +1479,30 @@ TEST_F(QualifierFixerTest, NewQualifierSupport) {
 
   Style.QualifierOrder = {"extern", "type"};
   verifyFormat("extern int global_var;", "int extern global_var;", Style);
-  verifyFormat("extern void func();", "void extern func();", Style);
 
   Style.QualifierOrder = {"mutable", "type"};
   verifyFormat("mutable int cache;", "int mutable cache;", Style);
 
+  Style.QualifierOrder = {"unsigned", "type"};
+  verifyFormat("unsigned int num;", "int unsigned num;", Style);
+  verifyFormat("unsigned long long value;", "long long unsigned value;", 
Style);
+  // Verify that signed is handled at the same position as unsigned
+  verifyFormat("signed int num;", "int signed num;", Style);
+  verifyFormat("signed long long value;", "long long signed value;", Style);
+
+  Style.QualifierOrder = {"long", "type"};
+  verifyFormat("long int num;", "int long num;", Style);
+  verifyFormat("long unsigned int num;", "unsigned long int num;", Style);
+  verifyFormat("long long int num;", "int long long num;", Style);
+  verifyFormat("long long unsigned int num;", "unsigned long long int num;",
+               Style);
+
+  Style.QualifierOrder = {"short", "type"};
+  verifyFormat("short int num;", "int short num;", Style);
+  verifyFormat("short unsigned value;", "unsigned short value;", Style);
+
   Style.QualifierOrder = {"explicit", "type"};
   verifyFormat("explicit Foo(int x);", Style);
-  verifyFormat("explicit operator bool();", Style);
 
   Style.QualifierOrder = {"extern", "thread_local", "static", "constexpr",
                           "inline", "unsigned",     "long",   "type",

>From 07e797f174a072f2797a803e3ac95168792e3c17 Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Wed, 14 Jan 2026 22:57:14 +0100
Subject: [PATCH 5/8] Enhance QualifierAlignmentFixer to support paired
 qualifiers for signed/unsigned and long/short.

---
 clang/lib/Format/QualifierAlignmentFixer.cpp  | 27 ++++++++--
 clang/unittests/Format/QualifierFixerTest.cpp | 52 ++++++++++++++++++-
 2 files changed, 74 insertions(+), 5 deletions(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 1b5decb1da5ca..42105412ac00c 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -561,6 +561,7 @@ tok::TokenKind 
LeftRightQualifierAlignmentFixer::getTokenFromQualifier(
       .Case("thread_local", tok::kw_thread_local)
       .Case("extern", tok::kw_extern)
       .Case("mutable", tok::kw_mutable)
+      .Case("signed", tok::kw_signed)
       .Case("unsigned", tok::kw_unsigned)
       .Case("long", tok::kw_long)
       .Case("short", tok::kw_short)
@@ -646,10 +647,30 @@ void prepareLeftRightOrderingForQualifierAlignmentFixer(
         LeftRightQualifierAlignmentFixer::getTokenFromQualifier(s);
     if (QualifierToken != tok::kw_typeof && QualifierToken != tok::identifier) 
{
       Qualifiers.push_back(QualifierToken);
-      // Handle signed and unsigned together: if unsigned is configured,
-      // also treat signed as configured at the same position.
+
+      // Ensure signed/unsigned and long/short qualifier pairs are positioned
+      // together by default unless the user has explicitly specified both in
+      // the QualifierOrder. This allows users to override the default pairing
+      // by listing both qualifiers in the order.
+      auto addPairedQualifier = [&](tok::TokenKind PairedToken,
+                                    const std::string &PairedName) {
+        if (!llvm::is_contained(Order, PairedName)) {
+          Qualifiers.push_back(PairedToken);
+          if (left)
+            LeftOrder.insert(LeftOrder.begin(), PairedName);
+          else
+            RightOrder.push_back(PairedName);
+        }
+      };
+
       if (QualifierToken == tok::kw_unsigned)
-        Qualifiers.push_back(tok::kw_signed);
+        addPairedQualifier(tok::kw_signed, "signed");
+      else if (QualifierToken == tok::kw_signed)
+        addPairedQualifier(tok::kw_unsigned, "unsigned");
+      else if (QualifierToken == tok::kw_long)
+        addPairedQualifier(tok::kw_short, "short");
+      else if (QualifierToken == tok::kw_short)
+        addPairedQualifier(tok::kw_long, "long");
     }
 
     if (left) {
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 52a49fbbf65b8..bbdde0214e83d 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -65,6 +65,8 @@ TEST_F(QualifierFixerTest, RotateTokens) {
             tok::kw_extern);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("mutable"),
             tok::kw_mutable);
+  EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("signed"),
+            tok::kw_signed);
   
EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("unsigned"),
             tok::kw_unsigned);
   EXPECT_EQ(LeftRightQualifierAlignmentFixer::getTokenFromQualifier("long"),
@@ -1090,7 +1092,6 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   ConfiguredTokens.push_back(tok::kw_mutable);
   ConfiguredTokens.push_back(tok::kw_unsigned);
   ConfiguredTokens.push_back(tok::kw_long);
-  ConfiguredTokens.push_back(tok::kw_short);
   ConfiguredTokens.push_back(tok::kw_explicit);
 
   TestLexer lexer{Allocator, Buffers};
@@ -1110,6 +1111,9 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   // When unsigned is configured, signed is automatically added to
   // ConfiguredTokens to handle them at the same position
   ConfiguredTokens.push_back(tok::kw_signed);
+  // When long is configured, short is automatically added to
+  // ConfiguredTokens to handle them at the same position
+  ConfiguredTokens.push_back(tok::kw_short);
 
   for (size_t i = 0; i < 19; ++i) {
     EXPECT_TRUE(
@@ -1486,7 +1490,6 @@ TEST_F(QualifierFixerTest, NewQualifierSupport) {
   Style.QualifierOrder = {"unsigned", "type"};
   verifyFormat("unsigned int num;", "int unsigned num;", Style);
   verifyFormat("unsigned long long value;", "long long unsigned value;", 
Style);
-  // Verify that signed is handled at the same position as unsigned
   verifyFormat("signed int num;", "int signed num;", Style);
   verifyFormat("signed long long value;", "long long signed value;", Style);
 
@@ -1515,6 +1518,51 @@ TEST_F(QualifierFixerTest, NewQualifierSupport) {
                Style);
 }
 
+TEST_F(QualifierFixerTest, PairedQualifiersSamePosition) {
+  FormatStyle Style = getLLVMStyle();
+  Style.QualifierAlignment = FormatStyle::QAS_Custom;
+
+  Style.QualifierOrder = {"unsigned", "type"};
+  verifyFormat("unsigned int x;", "int unsigned x;", Style);
+  verifyFormat("signed int x;", "int signed x;", Style);
+  verifyFormat("unsigned long int y;", "long unsigned int y;", Style);
+  verifyFormat("signed long int y;", "long signed int y;", Style);
+
+  Style.QualifierOrder = {"signed", "type"};
+  verifyFormat("signed int x;", "int signed x;", Style);
+  verifyFormat("unsigned int x;", "int unsigned x;", Style);
+
+  Style.QualifierOrder = {"long", "type"};
+  verifyFormat("long int x;", "int long x;", Style);
+  verifyFormat("short int x;", "int short x;", Style);
+  verifyFormat("long unsigned int y;", "unsigned long int y;", Style);
+  verifyFormat("short unsigned int y;", "unsigned short int y;", Style);
+
+  Style.QualifierOrder = {"short", "type"};
+  verifyFormat("short int x;", "int short x;", Style);
+  verifyFormat("long int x;", "int long x;", Style);
+
+  Style.QualifierOrder = {"type", "unsigned"};
+  verifyFormat("int unsigned x;", "unsigned int x;", Style);
+  verifyFormat("int signed x;", "signed int x;", Style);
+
+  Style.QualifierOrder = {"type", "long"};
+  verifyFormat("int long x;", "long int x;", Style);
+  verifyFormat("int short x;", "short int x;", Style);
+
+  Style.QualifierOrder = {"static", "unsigned", "long", "type"};
+  verifyFormat("static unsigned long int x;", "long unsigned static int x;",
+               Style);
+  verifyFormat("static signed short int x;", "short signed static int x;",
+               Style);
+
+  Style.QualifierOrder = {"unsigned", "signed", "type"};
+  verifyFormat("unsigned signed int x;", "signed unsigned int x;", Style);
+
+  Style.QualifierOrder = {"long", "short", "type"};
+  verifyFormat("long short int x;", "short long int x;", Style);
+}
+
 TEST_F(QualifierFixerTest, Ranges) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;

>From 35b499393e5041cd2049d2671ac59ba29959767d Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Thu, 15 Jan 2026 22:19:44 +0100
Subject: [PATCH 6/8] Refine QualifierAlignmentFixer to better handle qualifier
 inclusion at line start and improve type specifier analysis. To fix Tests

---
 clang/lib/Format/QualifierAlignmentFixer.cpp | 31 +++++++++++++++-----
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 42105412ac00c..99957f91350bf 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -414,11 +414,29 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
       TypeToken->ClosesRequiresClause || TypeToken->ClosesTemplateDeclaration 
||
       TypeToken->is(tok::r_square)) {
 
-    // Don't sort past a non-configured qualifier token.
     const FormatToken *FirstQual = Tok;
-    while (isConfiguredQualifier(FirstQual->getPreviousNonComment(),
-                                 ConfiguredQualifierTokens)) {
-      FirstQual = FirstQual->getPreviousNonComment();
+    const FormatToken *Prev = FirstQual->getPreviousNonComment();
+    if (!TypeToken) {
+      // At start of line: include paired qualifiers (long/short with
+      // unsigned/signed) and configured qualifiers, but not unrelated ones.
+      while (Prev &&
+             (isConfiguredQualifier(Prev, ConfiguredQualifierTokens) ||
+              (isQualifier(Prev) &&
+               (((QualifierType == tok::kw_unsigned ||
+                  QualifierType == tok::kw_signed) &&
+                 (Prev->is(tok::kw_long) || Prev->is(tok::kw_short))) ||
+                ((QualifierType == tok::kw_long ||
+                  QualifierType == tok::kw_short) &&
+                 (Prev->is(tok::kw_unsigned) || Prev->is(tok::kw_signed))))))) 
{
+        FirstQual = Prev;
+        Prev = FirstQual->getPreviousNonComment();
+      }
+    } else {
+      // Not at start: only include configured qualifiers
+      while (Prev && isConfiguredQualifier(Prev, ConfiguredQualifierTokens)) {
+        FirstQual = Prev;
+        Prev = FirstQual->getPreviousNonComment();
+      }
     }
 
     if (FirstQual != Tok)
@@ -446,9 +464,8 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
       TypeToken = Prev;
     }
     const FormatToken *LastSimpleTypeSpecifier = TypeToken;
-    while (isConfiguredQualifierOrType(
-        LastSimpleTypeSpecifier->getPreviousNonComment(),
-        ConfiguredQualifierTokens, LangOpts)) {
+    while (isQualifierOrType(LastSimpleTypeSpecifier->getPreviousNonComment(),
+                             LangOpts)) {
       LastSimpleTypeSpecifier =
           LastSimpleTypeSpecifier->getPreviousNonComment();
     }

>From 9cae863c647b507f1da31b813b85389a4c96f9db Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Sat, 15 Aug 2026 14:08:02 +0200
Subject: [PATCH 7/8] Add support for additional qualifiers

---
 clang/docs/ClangFormatStyleOptions.md         | 14 ++++
 clang/docs/ReleaseNotes.md                    |  4 ++
 clang/include/clang/Format/Format.h           | 14 ++++
 clang/lib/Format/QualifierAlignmentFixer.cpp  | 67 +++++++------------
 clang/unittests/Format/QualifierFixerTest.cpp | 30 ++++-----
 5 files changed, 72 insertions(+), 57 deletions(-)

diff --git a/clang/docs/ClangFormatStyleOptions.md 
b/clang/docs/ClangFormatStyleOptions.md
index 9b962e6e1e083..8230e6f5139e7 100644
--- a/clang/docs/ClangFormatStyleOptions.md
+++ b/clang/docs/ClangFormatStyleOptions.md
@@ -6393,6 +6393,17 @@ the configuration (without a prefix: `Auto`).
     - `constexpr`
     - `volatile`
     - `restrict`
+    - `typedef`
+    - `consteval`
+    - `constinit`
+    - `thread_local`
+    - `extern`
+    - `mutable`
+    - `signed`
+    - `unsigned`
+    - `long`
+    - `short`
+    - `explicit`
     - `type`
 
   :::{note}
@@ -6402,6 +6413,9 @@ the configuration (without a prefix: `Auto`).
   Items to the left of `type` will be placed to the left of the type and
   aligned in the order supplied. Items to the right of `type` will be
   placed to the right of the type and aligned in the order supplied.
+  If only one of `signed` and `unsigned` is specified, both are placed at
+  that position. The same applies to `long` and `short`. Specifying both
+  members of a pair allows them to be placed independently.
 
   ```yaml
   QualifierOrder: [inline, static, type, const, volatile]
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 70ea2e35090c6..11081a25c55b1 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -591,6 +591,10 @@ features cannot lower the translation-unit ABI level;
 - Add `SpacesInBlockComments` option to control spacing after `/*` and
   before `*/` in ordinary block comments.
 
+- `QualifierOrder` now supports `typedef`, `consteval`, `constinit`,
+  `thread_local`, `extern`, `mutable`, `signed`, `unsigned`, `long`, `short`,
+  and `explicit` declaration specifiers.
+
 ### libclang
 
 - visit identifier initializers in lambda capture as VarDecl instead of 
VariableRef. Warning: this changes behaviour.
diff --git a/clang/include/clang/Format/Format.h 
b/clang/include/clang/Format/Format.h
index 3948337d2fc3d..49e4666ae5e99 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -4565,6 +4565,17 @@ struct FormatStyle {
   ///   * `constexpr`
   ///   * `volatile`
   ///   * `restrict`
+  ///   * `typedef`
+  ///   * `consteval`
+  ///   * `constinit`
+  ///   * `thread_local`
+  ///   * `extern`
+  ///   * `mutable`
+  ///   * `signed`
+  ///   * `unsigned`
+  ///   * `long`
+  ///   * `short`
+  ///   * `explicit`
   ///   * `type`
   ///
   /// \note
@@ -4574,6 +4585,9 @@ struct FormatStyle {
   /// Items to the left of `type` will be placed to the left of the type and
   /// aligned in the order supplied. Items to the right of `type` will be
   /// placed to the right of the type and aligned in the order supplied.
+  /// If only one of `signed` and `unsigned` is specified, both are placed at
+  /// that position. The same applies to `long` and `short`. Specifying both
+  /// members of a pair allows them to be placed independently.
   ///
   /// \code{.yaml}
   ///   QualifierOrder: [inline, static, type, const, volatile]
diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 99957f91350bf..e8597d020c5cb 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -30,24 +30,28 @@ void addQualifierAlignmentFixerPasses(const FormatStyle 
&Style,
   prepareLeftRightOrderingForQualifierAlignmentFixer(
       Style.QualifierOrder, LeftOrder, RightOrder, ConfiguredQualifierTokens);
 
+  const auto AddPass = [&](const std::string &Qualifier, bool RightAlign) {
+    Passes.emplace_back([&, Qualifier, ConfiguredQualifierTokens,
+                         RightAlign](const Environment &Env) {
+      return LeftRightQualifierAlignmentFixer(
+                 Env, Style, Qualifier, ConfiguredQualifierTokens, RightAlign)
+          .process();
+    });
+  };
+
   // Handle the left and right alignment separately.
   for (const auto &Qualifier : LeftOrder) {
-    Passes.emplace_back(
-        [&, Qualifier, ConfiguredQualifierTokens](const Environment &Env) {
-          return LeftRightQualifierAlignmentFixer(Env, Style, Qualifier,
-                                                  ConfiguredQualifierTokens,
-                                                  /*RightAlign=*/false)
-              .process();
-        });
+    AddPass(Qualifier, /*RightAlign=*/false);
+    // Unlike the other declaration specifiers, `long` can legally occur twice
+    // in the same sequence. A pass moves one occurrence across the type, so a
+    // second pass is needed for `long long` and is otherwise a no-op.
+    if (Qualifier == "long")
+      AddPass(Qualifier, /*RightAlign=*/false);
   }
   for (const auto &Qualifier : RightOrder) {
-    Passes.emplace_back(
-        [&, Qualifier, ConfiguredQualifierTokens](const Environment &Env) {
-          return LeftRightQualifierAlignmentFixer(Env, Style, Qualifier,
-                                                  ConfiguredQualifierTokens,
-                                                  /*RightAlign=*/true)
-              .process();
-        });
+    AddPass(Qualifier, /*RightAlign=*/true);
+    if (Qualifier == "long")
+      AddPass(Qualifier, /*RightAlign=*/true);
   }
 }
 
@@ -181,10 +185,6 @@ static bool isQualifier(const FormatToken *const Tok) {
   case tok::kw_thread_local:
   case tok::kw_extern:
   case tok::kw_mutable:
-  case tok::kw_signed:
-  case tok::kw_unsigned:
-  case tok::kw_long:
-  case tok::kw_short:
   case tok::kw_explicit:
     return true;
   default:
@@ -414,29 +414,11 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
       TypeToken->ClosesRequiresClause || TypeToken->ClosesTemplateDeclaration 
||
       TypeToken->is(tok::r_square)) {
 
+    // Don't sort past a non-configured qualifier token.
     const FormatToken *FirstQual = Tok;
-    const FormatToken *Prev = FirstQual->getPreviousNonComment();
-    if (!TypeToken) {
-      // At start of line: include paired qualifiers (long/short with
-      // unsigned/signed) and configured qualifiers, but not unrelated ones.
-      while (Prev &&
-             (isConfiguredQualifier(Prev, ConfiguredQualifierTokens) ||
-              (isQualifier(Prev) &&
-               (((QualifierType == tok::kw_unsigned ||
-                  QualifierType == tok::kw_signed) &&
-                 (Prev->is(tok::kw_long) || Prev->is(tok::kw_short))) ||
-                ((QualifierType == tok::kw_long ||
-                  QualifierType == tok::kw_short) &&
-                 (Prev->is(tok::kw_unsigned) || Prev->is(tok::kw_signed))))))) 
{
-        FirstQual = Prev;
-        Prev = FirstQual->getPreviousNonComment();
-      }
-    } else {
-      // Not at start: only include configured qualifiers
-      while (Prev && isConfiguredQualifier(Prev, ConfiguredQualifierTokens)) {
-        FirstQual = Prev;
-        Prev = FirstQual->getPreviousNonComment();
-      }
+    while (isConfiguredQualifier(FirstQual->getPreviousNonComment(),
+                                 ConfiguredQualifierTokens)) {
+      FirstQual = FirstQual->getPreviousNonComment();
     }
 
     if (FirstQual != Tok)
@@ -464,8 +446,9 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
       TypeToken = Prev;
     }
     const FormatToken *LastSimpleTypeSpecifier = TypeToken;
-    while (isQualifierOrType(LastSimpleTypeSpecifier->getPreviousNonComment(),
-                             LangOpts)) {
+    while (isConfiguredQualifierOrType(
+        LastSimpleTypeSpecifier->getPreviousNonComment(),
+        ConfiguredQualifierTokens, LangOpts)) {
       LastSimpleTypeSpecifier =
           LastSimpleTypeSpecifier->getPreviousNonComment();
     }
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index bbdde0214e83d..87fca83a3d5be 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1093,34 +1093,33 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
   ConfiguredTokens.push_back(tok::kw_unsigned);
   ConfiguredTokens.push_back(tok::kw_long);
   ConfiguredTokens.push_back(tok::kw_explicit);
+  ConfiguredTokens.push_back(tok::kw_signed);
+  ConfiguredTokens.push_back(tok::kw_short);
 
   TestLexer lexer{Allocator, Buffers};
   const auto LangOpts = getFormattingLangOpts();
 
   auto Tokens = lexer.lex(
-      "const static inline restrict int double constexpr friend "
-      "typedef consteval constinit thread_local extern mutable signed unsigned 
"
-      "long short explicit");
-  ASSERT_EQ(Tokens.size(), 19u) << Tokens;
+      "const static inline restrict constexpr friend typedef consteval "
+      "constinit thread_local extern mutable unsigned long explicit signed "
+      "short");
+  ASSERT_EQ(Tokens.size(), ConfiguredTokens.size() + 1) << Tokens;
 
-  for (size_t i = 0; i < 19; ++i) {
+  for (size_t i = 0; i < ConfiguredTokens.size(); ++i) {
     EXPECT_TRUE(isQualifierOrType(Tokens[i], LangOpts))
         << "Token " << i << " should be recognized by isQualifierOrType";
-  }
-
-  // When unsigned is configured, signed is automatically added to
-  // ConfiguredTokens to handle them at the same position
-  ConfiguredTokens.push_back(tok::kw_signed);
-  // When long is configured, short is automatically added to
-  // ConfiguredTokens to handle them at the same position
-  ConfiguredTokens.push_back(tok::kw_short);
-
-  for (size_t i = 0; i < 19; ++i) {
     EXPECT_TRUE(
         isConfiguredQualifierOrType(Tokens[i], ConfiguredTokens, LangOpts))
         << "Token " << i << " should be recognized";
   }
 
+  auto TypeTokens = lexer.lex("int double");
+  for (size_t i = 0; i < TypeTokens.size() - 1; ++i) {
+    EXPECT_TRUE(isQualifierOrType(TypeTokens[i], LangOpts));
+    EXPECT_TRUE(
+        isConfiguredQualifierOrType(TypeTokens[i], ConfiguredTokens, 
LangOpts));
+  }
+
   auto NotTokens = lexer.lex("for while do Foo Bar ");
   ASSERT_EQ(NotTokens.size(), 6u) << NotTokens;
 
@@ -1549,6 +1548,7 @@ TEST_F(QualifierFixerTest, PairedQualifiersSamePosition) {
   Style.QualifierOrder = {"type", "long"};
   verifyFormat("int long x;", "long int x;", Style);
   verifyFormat("int short x;", "short int x;", Style);
+  verifyFormat("int long long x;", "long long int x;", Style);
 
   Style.QualifierOrder = {"static", "unsigned", "long", "type"};
   verifyFormat("static unsigned long int x;", "long unsigned static int x;",

>From 68f8af1ffb3f22471b90cc9a1d27f9da8f0669e3 Mon Sep 17 00:00:00 2001
From: Katze719 <[email protected]>
Date: Mon, 17 Aug 2026 06:37:43 +0200
Subject: [PATCH 8/8] Update clang/lib/Format/QualifierAlignmentFixer.cpp
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Björn Schäpers <[email protected]>
---
 clang/lib/Format/QualifierAlignmentFixer.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index e8597d020c5cb..68c3417c36e56 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -652,7 +652,7 @@ void prepareLeftRightOrderingForQualifierAlignmentFixer(
       // together by default unless the user has explicitly specified both in
       // the QualifierOrder. This allows users to override the default pairing
       // by listing both qualifiers in the order.
-      auto addPairedQualifier = [&](tok::TokenKind PairedToken,
+      auto AddPairedQualifier = [&](tok::TokenKind PairedToken,
                                     const std::string &PairedName) {
         if (!llvm::is_contained(Order, PairedName)) {
           Qualifiers.push_back(PairedToken);

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

Reply via email to