Author: Emilia Dreamer Date: 2023-01-06T05:18:28+02:00 New Revision: d9899501576e7b3b8ec4a3f0f855a6bfe68cef88
URL: https://github.com/llvm/llvm-project/commit/d9899501576e7b3b8ec4a3f0f855a6bfe68cef88 DIFF: https://github.com/llvm/llvm-project/commit/d9899501576e7b3b8ec4a3f0f855a6bfe68cef88.diff LOG: [clang-format] Disallow decltype in the middle of constraints If a function with a `requires` clause as a constraint has a decltype return type, such as `decltype(auto)`, the decltype was seen to be part of the constraint clause, rather than as part of the function declaration, causing it to be placed on the wrong line. This patch disallows decltype to be a part of these clauses Fixes https://github.com/llvm/llvm-project/issues/59578 Depends on D140339 Reviewed By: HazardyKnusperkeks, owenpan, MyDeveloperDay Differential Revision: https://reviews.llvm.org/D140312 Added: Modified: clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 81a6d8ffc0ee..c97ecc782120 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -3543,7 +3543,6 @@ void UnwrappedLineParser::parseConstraintExpression() { case tok::minus: case tok::star: case tok::slash: - case tok::kw_decltype: LambdaNextTimeAllowed = true; // Just eat them. nextToken(); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 21b497bd9568..b2a1e2c57f8c 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -24199,6 +24199,10 @@ TEST_F(FormatTest, RequiresClauses) { " }\n" "};"); + verifyFormat("template <class T>\n" + " requires(std::same_as<int, T>)\n" + "decltype(auto) fun() {}"); + auto Style = getLLVMStyle(); verifyFormat( diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 806c75d1e813..dba893dfdd50 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -580,6 +580,14 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) { EXPECT_TRUE(Tokens[9]->ClosesRequiresClause); EXPECT_TOKEN(Tokens[11], tok::identifier, TT_FunctionDeclarationName); + Tokens = annotate("template <typename T>\n" + "requires Bar<T>\n" + "decltype(auto) foo(T) { return false; }"); + ASSERT_EQ(Tokens.size(), 24u) << Tokens; + EXPECT_TOKEN(Tokens[5], tok::kw_requires, TT_RequiresClause); + EXPECT_TRUE(Tokens[9]->ClosesRequiresClause); + EXPECT_TOKEN(Tokens[14], tok::identifier, TT_FunctionDeclarationName); + Tokens = annotate("template <typename T>\n" "struct S {\n" " void foo() const requires Bar<T>;\n" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits