rymiel created this revision. rymiel added reviewers: HazardyKnusperkeks, owenpan, MyDeveloperDay. Herald added a project: All. rymiel requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Previously, the parens of a requires expression's "parameters" were not explicitly set, meaning they ended up as whatever the outer scope was. This is a problem in some cases though, since the process of determining star/amp checks if the token is inside of an expression context This patch always makes sure the context between those parens are always set to not be an expression Fixes https://github.com/llvm/llvm-project/issues/59600 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D140330 Files: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -711,19 +711,50 @@ ASSERT_EQ(Tokens.size(), 15u) << Tokens; EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference); EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace); Tokens = annotate("foo(requires(T const* volatile t) {});"); ASSERT_EQ(Tokens.size(), 15u) << Tokens; EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference); EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace); + Tokens = annotate("foo(requires(T& t) {});"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[5], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace); + + Tokens = annotate("foo(requires(T&& t) {});"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[5], tok::ampamp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace); + + Tokens = annotate("bool foo = requires(T& t) {};"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace); + + Tokens = annotate("bool foo = requires(T&& t) {};"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace); + Tokens = annotate("foo(requires(const typename Outer<T>::Inner * const t) {});"); ASSERT_EQ(Tokens.size(), 21u) << Tokens; EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference); EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace); Tokens = annotate("template <typename T>\n" Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -321,7 +321,9 @@ } else if (isLambdaParameterList(&OpeningParen)) { // This is a parameter list of a lambda expression. Contexts.back().IsExpression = false; - } else if (Line.InPPDirective && + } else if (OpeningParen.is(TT_RequiresExpressionLParen)) { + Contexts.back().IsExpression = false; + } else if (Line.InPPDirective && (!OpeningParen.Previous || !OpeningParen.Previous->is(tok::identifier))) { Contexts.back().IsExpression = true;
Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -711,19 +711,50 @@ ASSERT_EQ(Tokens.size(), 15u) << Tokens; EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference); EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace); Tokens = annotate("foo(requires(T const* volatile t) {});"); ASSERT_EQ(Tokens.size(), 15u) << Tokens; EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::star, TT_PointerOrReference); EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_RequiresExpressionLBrace); + Tokens = annotate("foo(requires(T& t) {});"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[5], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace); + + Tokens = annotate("foo(requires(T&& t) {});"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[5], tok::ampamp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_RequiresExpressionLBrace); + + Tokens = annotate("bool foo = requires(T& t) {};"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::amp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace); + + Tokens = annotate("bool foo = requires(T&& t) {};"); + ASSERT_EQ(Tokens.size(), 13u) << Tokens; + EXPECT_TOKEN(Tokens[3], tok::kw_requires, TT_RequiresExpression); + EXPECT_TOKEN(Tokens[4], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[6], tok::ampamp, TT_PointerOrReference); + EXPECT_TOKEN(Tokens[9], tok::l_brace, TT_RequiresExpressionLBrace); + Tokens = annotate("foo(requires(const typename Outer<T>::Inner * const t) {});"); ASSERT_EQ(Tokens.size(), 21u) << Tokens; EXPECT_TOKEN(Tokens[2], tok::kw_requires, TT_RequiresExpression); EXPECT_TOKEN(Tokens[3], tok::l_paren, TT_RequiresExpressionLParen); + EXPECT_TOKEN(Tokens[12], tok::star, TT_PointerOrReference); EXPECT_TOKEN(Tokens[16], tok::l_brace, TT_RequiresExpressionLBrace); Tokens = annotate("template <typename T>\n" Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -321,7 +321,9 @@ } else if (isLambdaParameterList(&OpeningParen)) { // This is a parameter list of a lambda expression. Contexts.back().IsExpression = false; - } else if (Line.InPPDirective && + } else if (OpeningParen.is(TT_RequiresExpressionLParen)) { + Contexts.back().IsExpression = false; + } else if (Line.InPPDirective && (!OpeningParen.Previous || !OpeningParen.Previous->is(tok::identifier))) { Contexts.back().IsExpression = true;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits