[clang] e4d3e88 - [clang-format] Don't allow template to be preceded by closing brace
Emilia Kond via cfe-commits
cfe-commits at lists.llvm.org
Tue May 16 15:38:49 PDT 2023
Author: Emilia Kond
Date: 2023-05-17T01:37:19+03:00
New Revision: e4d3e88802390a51ae62ade18e48c1a65a862d12
URL: https://github.com/llvm/llvm-project/commit/e4d3e88802390a51ae62ade18e48c1a65a862d12
DIFF: https://github.com/llvm/llvm-project/commit/e4d3e88802390a51ae62ade18e48c1a65a862d12.diff
LOG: [clang-format] Don't allow template to be preceded by closing brace
This check is similar to the right paren check right below it, but it
doesn't need the overloaded operator check.
This patch prevents brace-initialized objects that are being compared
from being mis-annotated as template parameters.
Fixes https://github.com/llvm/llvm-project/issues/57004
Reviewed By: owenpan, MyDeveloperDay
Differential Revision: https://reviews.llvm.org/D150629
Added:
Modified:
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTest.cpp
clang/unittests/Format/TokenAnnotatorTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index fe32fa101356..997fe92cabac 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -144,6 +144,8 @@ class AnnotatingParser {
if (Previous.Previous) {
if (Previous.Previous->Tok.isLiteral())
return false;
+ if (Previous.Previous->is(tok::r_brace))
+ return false;
if (Previous.Previous->is(tok::r_paren) && Contexts.size() > 1 &&
(!Previous.Previous->MatchingParen ||
!Previous.Previous->MatchingParen->is(
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index dc673934a3f1..dec0ea72b58a 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -10679,6 +10679,7 @@ TEST_F(FormatTest, UnderstandsTemplateParameters) {
// Not template parameters.
verifyFormat("return a < b && c > d;");
verifyFormat("a < 0 ? b : a > 0 ? c : d;");
+ verifyFormat("ratio{-1, 2} < ratio{-1, 3} == -1 / 3 > -1 / 2;");
verifyFormat("void f() {\n"
" while (a < b && c > d) {\n"
" }\n"
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 93f7f710d32c..b875b6f7144e 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -480,6 +480,23 @@ TEST_F(TokenAnnotatorTest, UnderstandsGreaterAfterTemplateCloser) {
EXPECT_TOKEN(Tokens[8], tok::greater, TT_BinaryOperator);
}
+TEST_F(TokenAnnotatorTest, UnderstandsNonTemplateAngleBrackets) {
+ auto Tokens = annotate("return a < b && c > d;");
+ ASSERT_EQ(Tokens.size(), 10u) << Tokens;
+ EXPECT_TOKEN(Tokens[2], tok::less, TT_BinaryOperator);
+ EXPECT_TOKEN(Tokens[6], tok::greater, TT_BinaryOperator);
+
+ Tokens = annotate("a < 0 ? b : a > 0 ? c : d;");
+ ASSERT_EQ(Tokens.size(), 15u) << Tokens;
+ EXPECT_TOKEN(Tokens[1], tok::less, TT_BinaryOperator);
+ EXPECT_TOKEN(Tokens[7], tok::greater, TT_BinaryOperator);
+
+ Tokens = annotate("ratio{-1, 2} < ratio{-1, 3} == -1 / 3 > -1 / 2;");
+ ASSERT_EQ(Tokens.size(), 27u) << Tokens;
+ EXPECT_TOKEN(Tokens[7], tok::less, TT_BinaryOperator);
+ EXPECT_TOKEN(Tokens[20], tok::greater, TT_BinaryOperator);
+}
+
TEST_F(TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {
FormatStyle Style = getLLVMStyle();
Style.WhitespaceSensitiveMacros.push_back("FOO");
More information about the cfe-commits
mailing list