[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-04 Thread Owen Pan via cfe-commits

https://github.com/owenca closed 
https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-03 Thread via cfe-commits

github-actions[bot] wrote:




:warning: C/C++ code formatter, clang-format found issues in your code. 
:warning:



You can test this locally with the following command:


``bash
git-clang-format --diff b8734797a3f605c4aaa37fcb5007baa273565460 
8052b1553eb05767db6f080d6ee4bbd515994f93 --extensions cpp -- 
clang/lib/Format/QualifierAlignmentFixer.cpp 
clang/unittests/Format/QualifierFixerTest.cpp
``





View the diff from clang-format here.


``diff
diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index e2e0c863f7..23e8b44eee 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -415,8 +415,7 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
 for (const auto *Prev = TypeToken->Previous;
- Prev && Prev->is(tok::coloncolon);
- Prev = Prev->Previous) {
+ Prev && Prev->is(tok::coloncolon); Prev = Prev->Previous) {
   TypeToken = Prev;
   Prev = Prev->Previous;
   if (!(Prev && Prev->is(tok::identifier)))

``




https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-03 Thread Owen Pan via cfe-commits

https://github.com/owenca updated 
https://github.com/llvm/llvm-project/pull/125327

>From af3d964d74634f0dd9f7216572c1d852b7a549dc Mon Sep 17 00:00:00 2001
From: Owen Pan 
Date: Fri, 31 Jan 2025 18:32:33 -0800
Subject: [PATCH 1/3] [clang-format] Hanlde qualified type names

Fixes #125178.
---
 clang/lib/Format/QualifierAlignmentFixer.cpp  |  8 +++-
 clang/unittests/Format/QualifierFixerTest.cpp | 12 
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 21fb5074b4928f7..f777ac2a89f755a 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -132,8 +132,10 @@ static void rotateTokens(const SourceManager &SourceMgr,
   // Then move through the other tokens.
   auto *Tok = Begin;
   while (Tok != End) {
-if (!NewText.empty() && !endsWithSpace(NewText))
+if (!NewText.empty() && !endsWithSpace(NewText) &&
+Tok->isNot(tok::coloncolon)) {
   NewText += " ";
+}
 
 NewText += Tok->TokenText;
 Tok = Tok->Next;
@@ -412,6 +414,10 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+if (const auto *Prev = TypeToken->getPreviousNonComment();
+Prev && Prev->endsSequence(tok::coloncolon, tok::identifier)) {
+  TypeToken = Prev->getPreviousNonComment();
+}
 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
 while (isConfiguredQualifierOrType(
 LastSimpleTypeSpecifier->getPreviousNonComment(),
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 129828b0d187a91..530587bbf2ca744 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1291,6 +1291,18 @@ TEST_F(QualifierFixerTest, WithCpp11Attribute) {
"[[maybe_unused]] constexpr static int A", Style);
 }
 
+TEST_F(QualifierFixerTest, WithQualifiedTypeName) {
+  auto Style = getLLVMStyle();
+  Style.QualifierAlignment = FormatStyle::QAS_Custom;
+  Style.QualifierOrder = {"constexpr", "type", "const"};
+
+  verifyFormat("constexpr std::int64_t x{123};",
+   "std::int64_t constexpr x{123};", Style);
+
+  Style.TypeNames.push_back("bar");
+  verifyFormat("constexpr foo::bar x{12};", "foo::bar constexpr x{12};", 
Style);
+}
+
 TEST_F(QualifierFixerTest, DisableRegions) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;

>From 5cc042e560bf620f283c93e8f25f3013f385d17c Mon Sep 17 00:00:00 2001
From: Owen Pan 
Date: Sun, 2 Feb 2025 01:20:45 -0800
Subject: [PATCH 2/3] Handle ::type and ::foo::type

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

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index f777ac2a89f755a..edef95f965edb7a 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -414,9 +414,14 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
-if (const auto *Prev = TypeToken->getPreviousNonComment();
-Prev && Prev->endsSequence(tok::coloncolon, tok::identifier)) {
-  TypeToken = Prev->getPreviousNonComment();
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();
+  if (!(Prev && Prev->is(tok::identifier)))
+break;
+  TypeToken = Prev;
 }
 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
 while (isConfiguredQualifierOrType(
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 530587bbf2ca744..3eae39f267c3e08 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1296,8 +1296,11 @@ TEST_F(QualifierFixerTest, WithQualifiedTypeName) {
   Style.QualifierAlignment = FormatStyle::QAS_Custom;
   Style.QualifierOrder = {"constexpr", "type", "const"};
 
+  verifyFormat("constexpr ::int64_t x{1};", "::int64_t constexpr x{1};", 
Style);
   verifyFormat("constexpr std::int64_t x{123};",
"std::int64_t constexpr x{123};", Style);
+  verifyFormat("constexpr ::std::int64_t x{123};",
+   "::std::int64_t constexpr x

[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-03 Thread Owen Pan via cfe-commits


@@ -412,6 +414,15 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();

owenca wrote:

```suggestion
for (const auto *Prev = TypeToken->Previous;
 Prev && Prev->is(tok::coloncolon);
 Prev = Prev->Previous) {
  TypeToken = Prev;
  Prev = Prev->Previous;
```

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-03 Thread Owen Pan via cfe-commits

https://github.com/owenca updated 
https://github.com/llvm/llvm-project/pull/125327

>From af3d964d74634f0dd9f7216572c1d852b7a549dc Mon Sep 17 00:00:00 2001
From: Owen Pan 
Date: Fri, 31 Jan 2025 18:32:33 -0800
Subject: [PATCH 1/2] [clang-format] Hanlde qualified type names

Fixes #125178.
---
 clang/lib/Format/QualifierAlignmentFixer.cpp  |  8 +++-
 clang/unittests/Format/QualifierFixerTest.cpp | 12 
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 21fb5074b4928f..f777ac2a89f755 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -132,8 +132,10 @@ static void rotateTokens(const SourceManager &SourceMgr,
   // Then move through the other tokens.
   auto *Tok = Begin;
   while (Tok != End) {
-if (!NewText.empty() && !endsWithSpace(NewText))
+if (!NewText.empty() && !endsWithSpace(NewText) &&
+Tok->isNot(tok::coloncolon)) {
   NewText += " ";
+}
 
 NewText += Tok->TokenText;
 Tok = Tok->Next;
@@ -412,6 +414,10 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+if (const auto *Prev = TypeToken->getPreviousNonComment();
+Prev && Prev->endsSequence(tok::coloncolon, tok::identifier)) {
+  TypeToken = Prev->getPreviousNonComment();
+}
 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
 while (isConfiguredQualifierOrType(
 LastSimpleTypeSpecifier->getPreviousNonComment(),
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 129828b0d187a9..530587bbf2ca74 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1291,6 +1291,18 @@ TEST_F(QualifierFixerTest, WithCpp11Attribute) {
"[[maybe_unused]] constexpr static int A", Style);
 }
 
+TEST_F(QualifierFixerTest, WithQualifiedTypeName) {
+  auto Style = getLLVMStyle();
+  Style.QualifierAlignment = FormatStyle::QAS_Custom;
+  Style.QualifierOrder = {"constexpr", "type", "const"};
+
+  verifyFormat("constexpr std::int64_t x{123};",
+   "std::int64_t constexpr x{123};", Style);
+
+  Style.TypeNames.push_back("bar");
+  verifyFormat("constexpr foo::bar x{12};", "foo::bar constexpr x{12};", 
Style);
+}
+
 TEST_F(QualifierFixerTest, DisableRegions) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;

>From 5cc042e560bf620f283c93e8f25f3013f385d17c Mon Sep 17 00:00:00 2001
From: Owen Pan 
Date: Sun, 2 Feb 2025 01:20:45 -0800
Subject: [PATCH 2/2] Handle ::type and ::foo::type

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

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index f777ac2a89f755..edef95f965edb7 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -414,9 +414,14 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
-if (const auto *Prev = TypeToken->getPreviousNonComment();
-Prev && Prev->endsSequence(tok::coloncolon, tok::identifier)) {
-  TypeToken = Prev->getPreviousNonComment();
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();
+  if (!(Prev && Prev->is(tok::identifier)))
+break;
+  TypeToken = Prev;
 }
 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
 while (isConfiguredQualifierOrType(
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 530587bbf2ca74..3eae39f267c3e0 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1296,8 +1296,11 @@ TEST_F(QualifierFixerTest, WithQualifiedTypeName) {
   Style.QualifierAlignment = FormatStyle::QAS_Custom;
   Style.QualifierOrder = {"constexpr", "type", "const"};
 
+  verifyFormat("constexpr ::int64_t x{1};", "::int64_t constexpr x{1};", 
Style);
   verifyFormat("constexpr std::int64_t x{123};",
"std::int64_t constexpr x{123};", Style);
+  verifyFormat("constexpr ::std::int64_t x{123};",
+   "::std::int64_t constexpr x{123};",

[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-03 Thread via cfe-commits

https://github.com/mydeveloperday approved this pull request.

Thank you

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Owen Pan via cfe-commits


@@ -412,6 +414,15 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();

owenca wrote:

I will replace `getPreviousNonComment()` with `Previous` for simplicity and 
better performance as we really don't need to be concerned about code like 
`::/**/std/**/::/**/int64_t`.

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Owen Pan via cfe-commits


@@ -412,6 +414,15 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();
+  if (!(Prev && Prev->is(tok::identifier)))

owenca wrote:

Neither do I when the conditions inside the parentheses are unrelated. 
Otherwise, I prefer the negated parentheses. Another example is `!(Foo == A || 
Foo == B || Foo == C)` (i.e. `Foo` is not one of `A`, `B`, and `C`) vs `Foo != 
A && Foo != B && Foo != C` (i.e. `Foo` is not `A`, not `B`, and not `C`). The 
former is more readable to me.

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Björn Schäpers via cfe-commits


@@ -412,6 +414,15 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();
+  if (!(Prev && Prev->is(tok::identifier)))

HazardyKnusperkeks wrote:

```suggestion
  if (!Prev || Prev->isNot(tok::identifier))
```
I personally don't like negated parenthesis.

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Björn Schäpers via cfe-commits

https://github.com/HazardyKnusperkeks approved this pull request.


https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Owen Pan via cfe-commits

owenca wrote:

> > Seems to also work for top-level types (`::int_64_t constexpr x{123};` 
> > works correctly) but breaks for fully qualified types (`::std::int64_t 
> > constexpr x{123};` becomes `::constexpr std::int64_t x{123};`)
> 
> Yeah, I intentionally didn't want to use a loop for names like `A1::A2:: ... 
> ::An` and instead just wanted to handle single-level nested names like `A::B`.

Now it handles the general pattern above (and also `::A1::A2:: ... An`).

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Owen Pan via cfe-commits

owenca wrote:

> Seems to also work for top-level types (`::int_64_t constexpr x{123};` works 
> correctly)

It didn't work either.



https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-02 Thread Owen Pan via cfe-commits

https://github.com/owenca updated 
https://github.com/llvm/llvm-project/pull/125327

>From af3d964d74634f0dd9f7216572c1d852b7a549dc Mon Sep 17 00:00:00 2001
From: Owen Pan 
Date: Fri, 31 Jan 2025 18:32:33 -0800
Subject: [PATCH 1/2] [clang-format] Hanlde qualified type names

Fixes #125178.
---
 clang/lib/Format/QualifierAlignmentFixer.cpp  |  8 +++-
 clang/unittests/Format/QualifierFixerTest.cpp | 12 
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 21fb5074b4928f..f777ac2a89f755 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -132,8 +132,10 @@ static void rotateTokens(const SourceManager &SourceMgr,
   // Then move through the other tokens.
   auto *Tok = Begin;
   while (Tok != End) {
-if (!NewText.empty() && !endsWithSpace(NewText))
+if (!NewText.empty() && !endsWithSpace(NewText) &&
+Tok->isNot(tok::coloncolon)) {
   NewText += " ";
+}
 
 NewText += Tok->TokenText;
 Tok = Tok->Next;
@@ -412,6 +414,10 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
+if (const auto *Prev = TypeToken->getPreviousNonComment();
+Prev && Prev->endsSequence(tok::coloncolon, tok::identifier)) {
+  TypeToken = Prev->getPreviousNonComment();
+}
 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
 while (isConfiguredQualifierOrType(
 LastSimpleTypeSpecifier->getPreviousNonComment(),
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 129828b0d187a9..530587bbf2ca74 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1291,6 +1291,18 @@ TEST_F(QualifierFixerTest, WithCpp11Attribute) {
"[[maybe_unused]] constexpr static int A", Style);
 }
 
+TEST_F(QualifierFixerTest, WithQualifiedTypeName) {
+  auto Style = getLLVMStyle();
+  Style.QualifierAlignment = FormatStyle::QAS_Custom;
+  Style.QualifierOrder = {"constexpr", "type", "const"};
+
+  verifyFormat("constexpr std::int64_t x{123};",
+   "std::int64_t constexpr x{123};", Style);
+
+  Style.TypeNames.push_back("bar");
+  verifyFormat("constexpr foo::bar x{12};", "foo::bar constexpr x{12};", 
Style);
+}
+
 TEST_F(QualifierFixerTest, DisableRegions) {
   FormatStyle Style = getLLVMStyle();
   Style.QualifierAlignment = FormatStyle::QAS_Custom;

>From 34653886f25ef3120784d3a5e6794c0bb158952d Mon Sep 17 00:00:00 2001
From: Owen Pan 
Date: Sun, 2 Feb 2025 01:20:45 -0800
Subject: [PATCH 2/2] Handle ::type and ::foo::type

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

diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp 
b/clang/lib/Format/QualifierAlignmentFixer.cpp
index f777ac2a89f755..edef95f965edb7 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -414,9 +414,14 @@ const FormatToken 
*LeftRightQualifierAlignmentFixer::analyzeLeft(
   // The case `const long long volatile int` -> `const volatile long long int`
   // The case `long volatile long int const` -> `const volatile long long int`
   if (TypeToken->isTypeName(LangOpts)) {
-if (const auto *Prev = TypeToken->getPreviousNonComment();
-Prev && Prev->endsSequence(tok::coloncolon, tok::identifier)) {
-  TypeToken = Prev->getPreviousNonComment();
+for (const auto *Prev = TypeToken->getPreviousNonComment();
+ Prev && Prev->is(tok::coloncolon);
+ Prev = Prev->getPreviousNonComment()) {
+  TypeToken = Prev;
+  Prev = Prev->getPreviousNonComment();
+  if (!(Prev && Prev->is(tok::identifier)))
+break;
+  TypeToken = Prev;
 }
 const FormatToken *LastSimpleTypeSpecifier = TypeToken;
 while (isConfiguredQualifierOrType(
diff --git a/clang/unittests/Format/QualifierFixerTest.cpp 
b/clang/unittests/Format/QualifierFixerTest.cpp
index 530587bbf2ca74..3eae39f267c3e0 100644
--- a/clang/unittests/Format/QualifierFixerTest.cpp
+++ b/clang/unittests/Format/QualifierFixerTest.cpp
@@ -1296,8 +1296,11 @@ TEST_F(QualifierFixerTest, WithQualifiedTypeName) {
   Style.QualifierAlignment = FormatStyle::QAS_Custom;
   Style.QualifierOrder = {"constexpr", "type", "const"};
 
+  verifyFormat("constexpr ::int64_t x{1};", "::int64_t constexpr x{1};", 
Style);
   verifyFormat("constexpr std::int64_t x{123};",
"std::int64_t constexpr x{123};", Style);
+  verifyFormat("constexpr ::std::int64_t x{123};",
+   "::std::int64_t constexpr x{123};",

[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-01 Thread Owen Pan via cfe-commits

owenca wrote:

Same reason we almost never handle them, just like we (almost?) never handle 
the possibility of templated qualified names of arbitrary nesting levels (e.g. 
`A1::A2 … An`) and of comments before _every_ token. We can always 
tweak the code if and when we need to handle these rare cases.

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-02-01 Thread Björn Schäpers via cfe-commits

HazardyKnusperkeks wrote:

> > Seems to also work for top-level types (`::int_64_t constexpr x{123};` 
> > works correctly) but breaks for fully qualified types (`::std::int64_t 
> > constexpr x{123};` becomes `::constexpr std::int64_t x{123};`)
> 
> Yeah, I intentionally didn't want to use a loop for names like `A1::A2:: ... 
> ::An` and instead just wanted to handle single-level nested names like `A::B`.

But why?

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-01-31 Thread Owen Pan via cfe-commits

owenca wrote:

> Seems to also work for top-level types (`::int_64_t constexpr x{123};` works 
> correctly) but breaks for fully qualified types (`::std::int64_t constexpr 
> x{123};` becomes `::constexpr std::int64_t x{123};`)

Yeah, I intentionally didn't want to use a loop for names like `A1::A2:: ... 
::An` and instead just wanted to handle single-level nested names like `A::B`.

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-01-31 Thread Emilia Kond via cfe-commits

rymiel wrote:

Seems to also work for top-level types (`::int_64_t constexpr x{123};` works 
correctly) but breaks for fully qualified types (`::std::int64_t constexpr 
x{123};` becomes `::constexpr std::int64_t x{123};`)

https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)

2025-01-31 Thread Owen Pan via cfe-commits

https://github.com/owenca edited 
https://github.com/llvm/llvm-project/pull/125327
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits