[llvm-branch-commits] [clang] 99e5b2f - clang-format: fix spacing in `operator const char*()`
Hans Wennborg via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Mar 2 02:21:19 PST 2020
Author: Krasimir Georgiev
Date: 2020-03-02T11:19:33+01:00
New Revision: 99e5b2ff9df5ca4c7fe13b63f60d953058cd9ca3
URL: https://github.com/llvm/llvm-project/commit/99e5b2ff9df5ca4c7fe13b63f60d953058cd9ca3
DIFF: https://github.com/llvm/llvm-project/commit/99e5b2ff9df5ca4c7fe13b63f60d953058cd9ca3.diff
LOG: clang-format: fix spacing in `operator const char*()`
Summary:
Revision a75f8d98d7ac9e557b238a229a9a2647c71feed1 fixed spacing for operators,
but caused the const and non-const versions to diverge:
```
// With Style.PointerAlignment = FormatStyle::PAS_Left:
struct A {
operator char*() { return ""; }
operator const char *() const { return ""; }
};
```
The code was checking if the type specifier was directly preceded by `operator`.
However there could be comments and `const/volatile` in between.
Reviewers: mprobst
Reviewed By: mprobst
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D72911
(cherry picked from commit 33463cfba2be7c8d6c08e666123cc34f114a1f3e)
Added:
Modified:
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index 88564e02f23e..70bcd7048c55 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -2707,10 +2707,17 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
return false;
if (Right.isOneOf(tok::star, tok::amp, tok::ampamp) &&
(Left.is(tok::identifier) || Left.isSimpleTypeSpecifier()) &&
- Left.Previous && Left.Previous->is(tok::kw_operator))
- // Space between the type and the *
- // operator void*(), operator char*(), operator Foo*() dependant
- // on PointerAlignment style.
+ // Space between the type and the * in:
+ // operator void*()
+ // operator char*()
+ // operator /*comment*/ const char*()
+ // operator volatile /*comment*/ char*()
+ // operator Foo*()
+ // dependent on PointerAlignment style.
+ Left.Previous &&
+ (Left.Previous->endsSequence(tok::kw_operator) ||
+ Left.Previous->endsSequence(tok::kw_const, tok::kw_operator) ||
+ Left.Previous->endsSequence(tok::kw_volatile, tok::kw_operator)))
return (Style.PointerAlignment != FormatStyle::PAS_Left);
const auto SpaceRequiredForArrayInitializerLSquare =
[](const FormatToken &LSquareTok, const FormatStyle &Style) {
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index c47e2e9a116e..a5a26b5c1e8e 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -15008,6 +15008,9 @@ TEST_F(FormatTest, OperatorSpacing) {
Style.PointerAlignment = FormatStyle::PAS_Left;
verifyFormat("Foo::operator*();", Style);
verifyFormat("Foo::operator void*();", Style);
+ verifyFormat("Foo::operator/*comment*/ void*();", Style);
+ verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
+ verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
verifyFormat("Foo::operator()(void*);", Style);
verifyFormat("Foo::operator*(void*);", Style);
verifyFormat("Foo::operator*();", Style);
@@ -15015,6 +15018,9 @@ TEST_F(FormatTest, OperatorSpacing) {
verifyFormat("Foo::operator&();", Style);
verifyFormat("Foo::operator void&();", Style);
+ verifyFormat("Foo::operator/*comment*/ void&();", Style);
+ verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
+ verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
verifyFormat("Foo::operator()(void&);", Style);
verifyFormat("Foo::operator&(void&);", Style);
verifyFormat("Foo::operator&();", Style);
@@ -15022,6 +15028,9 @@ TEST_F(FormatTest, OperatorSpacing) {
verifyFormat("Foo::operator&&();", Style);
verifyFormat("Foo::operator void&&();", Style);
+ verifyFormat("Foo::operator/*comment*/ void&&();", Style);
+ verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
+ verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
verifyFormat("Foo::operator()(void&&);", Style);
verifyFormat("Foo::operator&&(void&&);", Style);
verifyFormat("Foo::operator&&();", Style);
More information about the llvm-branch-commits
mailing list