Skip to content

Commit 696f8b3

Browse files
committed
Revert "[clang-format] Add a space between an overloaded operator and '>'"
This reverts commit b05dc1b. Makes clang-format crash on `struct Foo { operator enum foo{} };`
1 parent 0666c59 commit 696f8b3

File tree

5 files changed

+15
-124
lines changed

5 files changed

+15
-124
lines changed

clang/lib/Format/FormatTokenLexer.cpp

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ void FormatTokenLexer::tryMergePreviousTokens() {
103103
return;
104104
if (tryMergeLessLess())
105105
return;
106-
if (tryMergeGreaterGreater())
107-
return;
108106
if (tryMergeForEach())
109107
return;
110108
if (Style.isCpp() && tryTransformTryUsageForC())
@@ -462,11 +460,12 @@ bool FormatTokenLexer::tryMergeLessLess() {
462460
return false;
463461

464462
auto X = Tokens.size() > 3 ? First[-1] : nullptr;
465-
if (X && X->is(tok::less))
463+
auto Y = First[2];
464+
if ((X && X->is(tok::less)) || Y->is(tok::less))
466465
return false;
467466

468-
auto Y = First[2];
469-
if ((!X || X->isNot(tok::kw_operator)) && Y->is(tok::less))
467+
// Do not remove a whitespace between the two "<" e.g. "operator< <>".
468+
if (X && X->is(tok::kw_operator) && Y->is(tok::greater))
470469
return false;
471470

472471
First[0]->Tok.setKind(tok::lessless);
@@ -476,30 +475,6 @@ bool FormatTokenLexer::tryMergeLessLess() {
476475
return true;
477476
}
478477

479-
bool FormatTokenLexer::tryMergeGreaterGreater() {
480-
// Merge kw_operator,greater,greater into kw_operator,greatergreater.
481-
if (Tokens.size() < 2)
482-
return false;
483-
484-
auto First = Tokens.end() - 2;
485-
if (First[0]->isNot(tok::greater) || First[1]->isNot(tok::greater))
486-
return false;
487-
488-
// Only merge if there currently is no whitespace between the first two ">".
489-
if (First[1]->hasWhitespaceBefore())
490-
return false;
491-
492-
auto Tok = Tokens.size() > 2 ? First[-1] : nullptr;
493-
if (Tok && Tok->isNot(tok::kw_operator))
494-
return false;
495-
496-
First[0]->Tok.setKind(tok::greatergreater);
497-
First[0]->TokenText = ">>";
498-
First[0]->ColumnWidth += 1;
499-
Tokens.erase(Tokens.end() - 1);
500-
return true;
501-
}
502-
503478
bool FormatTokenLexer::tryMergeTokens(ArrayRef<tok::TokenKind> Kinds,
504479
TokenType NewType) {
505480
if (Tokens.size() < Kinds.size())

clang/lib/Format/FormatTokenLexer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ class FormatTokenLexer {
5151
void tryMergePreviousTokens();
5252

5353
bool tryMergeLessLess();
54-
bool tryMergeGreaterGreater();
5554
bool tryMergeNSStringLiteral();
5655
bool tryMergeJSPrivateIdentifier();
5756
bool tryMergeCSharpStringLiteral();

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,25 +1215,19 @@ class AnnotatingParser {
12151215
!CurrentToken->isOneOf(tok::l_paren, tok::semi, tok::r_paren)) {
12161216
if (CurrentToken->isOneOf(tok::star, tok::amp))
12171217
CurrentToken->setType(TT_PointerOrReference);
1218-
auto Next = CurrentToken->getNextNonComment();
1219-
if (!Next)
1220-
break;
1221-
if (Next->is(tok::less))
1222-
next();
1223-
else
1224-
consumeToken();
1225-
assert(CurrentToken);
1226-
auto Previous = CurrentToken->getPreviousNonComment();
1227-
assert(Previous);
1228-
if (CurrentToken->is(tok::comma) && Previous->isNot(tok::kw_operator))
1218+
consumeToken();
1219+
if (!CurrentToken)
1220+
continue;
1221+
if (CurrentToken->is(tok::comma) &&
1222+
CurrentToken->Previous->isNot(tok::kw_operator)) {
12291223
break;
1230-
if (Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator, tok::comma,
1231-
tok::star, tok::arrow, tok::amp, tok::ampamp) ||
1224+
}
1225+
if (CurrentToken->Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator,
1226+
tok::comma, tok::star, tok::arrow,
1227+
tok::amp, tok::ampamp) ||
12321228
// User defined literal.
1233-
Previous->TokenText.startswith("\"\"")) {
1234-
Previous->setType(TT_OverloadedOperator);
1235-
if (CurrentToken->isOneOf(tok::less, tok::greater))
1236-
break;
1229+
CurrentToken->Previous->TokenText.startswith("\"\"")) {
1230+
CurrentToken->Previous->setType(TT_OverloadedOperator);
12371231
}
12381232
}
12391233
if (CurrentToken && CurrentToken->is(tok::l_paren))
@@ -4054,10 +4048,6 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
40544048
return true;
40554049

40564050
if (Style.isCpp()) {
4057-
if (Left.is(TT_OverloadedOperator) &&
4058-
Right.isOneOf(TT_TemplateOpener, TT_TemplateCloser)) {
4059-
return true;
4060-
}
40614051
// Space between UDL and dot: auto b = 4s .count();
40624052
if (Right.is(tok::period) && Left.is(tok::numeric_constant))
40634053
return true;

clang/unittests/Format/FormatTest.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10604,14 +10604,6 @@ TEST_F(FormatTest, UnderstandsOverloadedOperators) {
1060410604
verifyFormat("foo() { ::operator new(n * sizeof(foo)); }");
1060510605
}
1060610606

10607-
TEST_F(FormatTest, SpaceBeforeTemplateCloser) {
10608-
verifyFormat("C<&operator- > minus;");
10609-
verifyFormat("C<&operator> > gt;");
10610-
verifyFormat("C<&operator>= > ge;");
10611-
verifyFormat("C<&operator<= > le;");
10612-
verifyFormat("C<&operator< <X>> lt;");
10613-
}
10614-
1061510607
TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
1061610608
verifyFormat("void A::b() && {}");
1061710609
verifyFormat("void A::b() && noexcept {}");

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -578,71 +578,6 @@ TEST_F(TokenAnnotatorTest, UnderstandsOverloadedOperators) {
578578
EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_OverloadedOperatorLParen);
579579
}
580580

581-
TEST_F(TokenAnnotatorTest, OverloadedOperatorInTemplate) {
582-
struct {
583-
const char *Text;
584-
tok::TokenKind Kind;
585-
} Operators[] = {{"+", tok::plus},
586-
{"-", tok::minus},
587-
// FIXME:
588-
// {"*", tok::star},
589-
{"/", tok::slash},
590-
{"%", tok::percent},
591-
{"^", tok::caret},
592-
// FIXME:
593-
// {"&", tok::amp},
594-
{"|", tok::pipe},
595-
{"~", tok::tilde},
596-
{"!", tok::exclaim},
597-
{"=", tok::equal},
598-
// FIXME:
599-
// {"<", tok::less},
600-
{">", tok::greater},
601-
{"+=", tok::plusequal},
602-
{"-=", tok::minusequal},
603-
{"*=", tok::starequal},
604-
{"/=", tok::slashequal},
605-
{"%=", tok::percentequal},
606-
{"^=", tok::caretequal},
607-
{"&=", tok::ampequal},
608-
{"|=", tok::pipeequal},
609-
{"<<", tok::lessless},
610-
{">>", tok::greatergreater},
611-
{">>=", tok::greatergreaterequal},
612-
{"<<=", tok::lesslessequal},
613-
{"==", tok::equalequal},
614-
{"!=", tok::exclaimequal},
615-
{"<=", tok::lessequal},
616-
{">=", tok::greaterequal},
617-
{"<=>", tok::spaceship},
618-
{"&&", tok::ampamp},
619-
{"||", tok::pipepipe},
620-
{"++", tok::plusplus},
621-
{"--", tok::minusminus},
622-
{",", tok::comma},
623-
{"->*", tok::arrowstar},
624-
{"->", tok::arrow}};
625-
626-
for (const auto &Operator : Operators) {
627-
std::string Input("C<&operator");
628-
Input += Operator.Text;
629-
Input += " > a;";
630-
auto Tokens = annotate(std::string(Input));
631-
ASSERT_EQ(Tokens.size(), 9u) << Tokens;
632-
EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);
633-
EXPECT_TOKEN(Tokens[4], Operator.Kind, TT_OverloadedOperator);
634-
EXPECT_TOKEN(Tokens[5], tok::greater, TT_TemplateCloser);
635-
}
636-
637-
auto Tokens = annotate("C<&operator< <X>> lt;");
638-
ASSERT_EQ(Tokens.size(), 12u) << Tokens;
639-
EXPECT_TOKEN(Tokens[1], tok::less, TT_TemplateOpener);
640-
EXPECT_TOKEN(Tokens[4], tok::less, TT_OverloadedOperator);
641-
EXPECT_TOKEN(Tokens[5], tok::less, TT_TemplateOpener);
642-
EXPECT_TOKEN(Tokens[7], tok::greater, TT_TemplateCloser);
643-
EXPECT_TOKEN(Tokens[8], tok::greater, TT_TemplateCloser);
644-
}
645-
646581
TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
647582
auto Tokens = annotate("template <typename T>\n"
648583
"concept C = (Foo && Bar) && (Bar && Baz);");

0 commit comments

Comments
 (0)