Commit 33463cfb authored by Krasimir Georgiev's avatar Krasimir Georgiev
Browse files

clang-format: fix spacing in `operator const char*()`

Summary:
Revision a75f8d98 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
parent ea91758a
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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) {
+9 −0
Original line number Diff line number Diff line
@@ -15007,6 +15007,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);
@@ -15014,6 +15017,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);
@@ -15021,6 +15027,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);