diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -2356,7 +2356,8 @@ return TT_BinaryOperator; if (!NextToken || - NextToken->isOneOf(tok::arrow, tok::equal, tok::kw_noexcept) || + NextToken->isOneOf(tok::arrow, tok::equal, tok::kw_noexcept, tok::comma, + tok::r_paren) || NextToken->canBePointerOrReferenceQualifier() || (NextToken->is(tok::l_brace) && !NextToken->getNextNonComment())) { return TT_PointerOrReference; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -2132,6 +2132,10 @@ verifyFormat("int *a = f1();", Style); verifyFormat("int &b = f2();", Style); verifyFormat("int &&c = f3();", Style); + verifyFormat("int f3() { return sizeof(Foo &); }", Style); + verifyFormat("int f4() { return sizeof(Foo &&); }", Style); + verifyFormat("void f5() { int f6(Foo &, Bar &); }", Style); + verifyFormat("void f5() { int f6(Foo &&, Bar &&); }", Style); verifyFormat("for (auto a = 0, b = 0; const auto &c : {1, 2, 3})", Style); verifyFormat("for (auto a = 0, b = 0; const int &c : {1, 2, 3})", Style); verifyFormat("for (auto a = 0, b = 0; const Foo &c : {1, 2, 3})", Style); @@ -2171,6 +2175,10 @@ verifyFormat("int* a = f1();", Style); verifyFormat("int& b = f2();", Style); verifyFormat("int&& c = f3();", Style); + verifyFormat("int f3() { return sizeof(Foo&); }", Style); + verifyFormat("int f4() { return sizeof(Foo&&); }", Style); + verifyFormat("void f5() { int f6(Foo&, Bar&); }", Style); + verifyFormat("void f5() { int f6(Foo&&, Bar&&); }", Style); verifyFormat("for (auto a = 0, b = 0; const auto& c : {1, 2, 3})", Style); verifyFormat("for (auto a = 0, b = 0; const int& c : {1, 2, 3})", Style); verifyFormat("for (auto a = 0, b = 0; const Foo& c : {1, 2, 3})", Style); @@ -2211,6 +2219,10 @@ verifyFormat("int *a = f1();", Style); verifyFormat("int& b = f2();", Style); verifyFormat("int&& c = f3();", Style); + verifyFormat("int f3() { return sizeof(Foo&); }", Style); + verifyFormat("int f4() { return sizeof(Foo&&); }", Style); + verifyFormat("void f5() { int f6(Foo&, Bar&); }", Style); + verifyFormat("void f5() { int f6(Foo&&, Bar&&); }", Style); verifyFormat("for (auto a = 0, b = 0; const Foo *c : {1, 2, 3})", Style); verifyFormat("for (int a = 0, b = 0; const Foo *c : {1, 2, 3})", Style); verifyFormat("for (int a = 0, b++; const Foo *c : {1, 2, 3})", Style); @@ -2232,6 +2244,10 @@ verifyFormat("int* a = f1();", Style); verifyFormat("int & b = f2();", Style); verifyFormat("int && c = f3();", Style); + verifyFormat("int f3() { return sizeof(Foo &); }", Style); + verifyFormat("int f4() { return sizeof(Foo &&); }", Style); + verifyFormat("void f5() { int f6(Foo &, Bar &); }", Style); + verifyFormat("void f5() { int f6(Foo &&, Bar &&); }", Style); verifyFormat("for (auto a = 0, b = 0; const auto & c : {1, 2, 3})", Style); verifyFormat("for (auto a = 0, b = 0; const int & c : {1, 2, 3})", Style); verifyFormat("for (auto a = 0, b = 0; const Foo & c : {1, 2, 3})", Style); @@ -2268,6 +2284,10 @@ verifyFormat("int * a = f1();", Style); verifyFormat("int &b = f2();", Style); verifyFormat("int &&c = f3();", Style); + verifyFormat("int f3() { return sizeof(Foo &); }", Style); + verifyFormat("int f4() { return sizeof(Foo &&); }", Style); + verifyFormat("void f5() { int f6(Foo &, Bar &); }", Style); + verifyFormat("void f5() { int f6(Foo &&, Bar &&); }", Style); verifyFormat("for (auto a = 0, b = 0; const Foo * c : {1, 2, 3})", Style); verifyFormat("for (int a = 0, b = 0; const Foo * c : {1, 2, 3})", Style); verifyFormat("for (int a = 0, b++; const Foo * c : {1, 2, 3})", Style); @@ -9034,7 +9054,7 @@ " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); verifyFormat("someFunction(\"Always break between multi-line\"\n" " \" string literals\",\n" - " and, other, parameters);"); + " also, other, parameters);"); EXPECT_EQ("fun + \"1243\" /* comment */\n" " \"5678\";", format("fun + \"1243\" /* comment */\n" diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -157,6 +157,24 @@ Tokens = annotate("if (Foo* Bar = getObj())"); ASSERT_EQ(Tokens.size(), 11u) << Tokens; EXPECT_TOKEN(Tokens[3], tok::star, TT_PointerOrReference); + + Tokens = annotate("int f3() { return sizeof(Foo&); }"); + ASSERT_EQ(Tokens.size(), 14u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference); + + Tokens = annotate("int f4() { return sizeof(Foo&&); }"); + ASSERT_EQ(Tokens.size(), 14u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference); + + Tokens = annotate("void f5() { int f6(Foo&, Bar&); }"); + ASSERT_EQ(Tokens.size(), 17u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[12], tok::amp, TT_PointerOrReference); + + Tokens = annotate("void f7() { int f8(Foo&&, Bar&&); }"); + ASSERT_EQ(Tokens.size(), 17u) << Tokens; + EXPECT_TOKEN(Tokens[9], tok::ampamp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[12], tok::ampamp, TT_PointerOrReference); } TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {