[clang] [clang-format] Hanlde qualified type name for `QualifierAlignment` (PR #125327)
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)
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)
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)
@@ -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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
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)
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)
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)
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
