From 8b48d24373204fc2fe6aac1f1f850fa3b6c18445 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Tue, 15 Dec 2020 20:50:38 +0800 Subject: [PATCH] [clang-format] Recognize c++ coroutine keywords as unary operator to avoid misleading pointer alignment Summary: The clang-format may go wrong when handle c++ coroutine keywords and pointer. The default value for PointerAlignment is PAS_Right. So the following format is good: ``` co_return *a; ``` But within some code style, the value for PointerAlignment is PAS_Left, the behavior goes wrong: ``` co_return* a; ``` test-plan: check-clang reviewers: MyDeveloperDay Differential Revision: https://reviews.llvm.org/D91245 --- clang/lib/Format/TokenAnnotator.cpp | 1 + clang/unittests/Format/FormatTest.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index b1c9c37..821b46b 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -1964,6 +1964,7 @@ private: if (PrevToken->isOneOf(tok::l_paren, tok::l_square, tok::l_brace, tok::comma, tok::semi, tok::kw_return, tok::colon, + tok::kw_co_return, tok::kw_co_await, tok::kw_co_yield, tok::equal, tok::kw_delete, tok::kw_sizeof, tok::kw_throw) || PrevToken->isOneOf(TT_BinaryOperator, TT_ConditionalExpr, diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 1c78b6e..a3dbec9a 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -7755,6 +7755,15 @@ TEST_F(FormatTest, UnderstandsUnaryOperators) { verifyFormat("co_yield -1;"); verifyFormat("co_return -1;"); + + // Check that * is not treated as a binary operator when we set PointerAlignment + // as PAS_Left after a keyword and not a declaration. + FormatStyle PASLeftStyle = getLLVMStyle(); + PASLeftStyle.PointerAlignment = FormatStyle::PAS_Left; + verifyFormat("co_return *a;", PASLeftStyle); + verifyFormat("co_await *a;", PASLeftStyle); + verifyFormat("co_yield *a", PASLeftStyle); + verifyFormat("return *a;", PASLeftStyle); } TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) { -- 2.7.4