Author: mydeveloperday Date: 2020-05-19T16:47:38+01:00 New Revision: 575c59cf6a32889c5f1131af39e07bbdde27e8da
URL: https://github.com/llvm/llvm-project/commit/575c59cf6a32889c5f1131af39e07bbdde27e8da DIFF: https://github.com/llvm/llvm-project/commit/575c59cf6a32889c5f1131af39e07bbdde27e8da.diff LOG: [clang-format] [PR45614] Incorrectly indents [[nodiscard]] attribute funtions after a macro without semicolon Summary: https://bugs.llvm.org/show_bug.cgi?id=45614 `[[nodiscard]]` after a macro doesn't behave the same as an __attribute__ resulting in incorrect indentation This revision corrects that behavior See original Mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1629756 Before: ``` class FooWidget : public nsBaseWidget { public: FooWidget(); NS_DECL_ISUPPORTS_INHERITED [[nodiscard]] nsresult FunctionOne(); [[nodiscard]] nsresult FunctionTwo(); }; ``` After: ``` class FooWidget : public nsBaseWidget { public: FooWidget(); NS_DECL_ISUPPORTS_INHERITED [[nodiscard]] nsresult FunctionOne(); [[nodiscard]] nsresult FunctionTwo(); }; ``` Reviewed By: Abpostelnicu Subscribers: cfe-commits Tags: #clang, #clang-format Differential Revision: https://reviews.llvm.org/D79990 Added: Modified: clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 08c634a91162..de820ba05c56 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -903,11 +903,11 @@ void UnwrappedLineParser::parsePPUnknown() { // Here we blacklist certain tokens that are not usually the first token in an // unwrapped line. This is used in attempt to distinguish macro calls without // trailing semicolons from other constructs split to several lines. -static bool tokenCanStartNewLine(const clang::Token &Tok) { +static bool tokenCanStartNewLine(const FormatToken &Tok) { // Semicolon can be a null-statement, l_square can be a start of a macro or // a C++11 attribute, but this doesn't seem to be common. return Tok.isNot(tok::semi) && Tok.isNot(tok::l_brace) && - Tok.isNot(tok::l_square) && + Tok.isNot(TT_AttributeSquare) && // Tokens that can only be used as binary operators and a part of // overloaded operator names. Tok.isNot(tok::period) && Tok.isNot(tok::periodstar) && @@ -1441,7 +1441,7 @@ void UnwrappedLineParser::parseStructuralElement() { : CommentsBeforeNextToken.front()->NewlinesBefore > 0; if (FollowedByNewline && (Text.size() >= 5 || FunctionLike) && - tokenCanStartNewLine(FormatTok->Tok) && Text == Text.upper()) { + tokenCanStartNewLine(*FormatTok) && Text == Text.upper()) { addUnwrappedLine(); return; } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 8da99f2f7c82..35da582dcd65 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -8040,6 +8040,37 @@ TEST_F(FormatTest, AttributeClass) { Style); } +TEST_F(FormatTest, AttributesAfterMacro) { + FormatStyle Style = getLLVMStyle(); + verifyFormat("MACRO;\n" + "__attribute__((maybe_unused)) int foo() {\n" + " //...\n" + "}"); + + verifyFormat("MACRO;\n" + "[[nodiscard]] int foo() {\n" + " //...\n" + "}"); + + EXPECT_EQ("MACRO\n\n" + "__attribute__((maybe_unused)) int foo() {\n" + " //...\n" + "}", + format("MACRO\n\n" + "__attribute__((maybe_unused)) int foo() {\n" + " //...\n" + "}")); + + EXPECT_EQ("MACRO\n\n" + "[[nodiscard]] int foo() {\n" + " //...\n" + "}", + format("MACRO\n\n" + "[[nodiscard]] int foo() {\n" + " //...\n" + "}")); +} + TEST_F(FormatTest, AttributePenaltyBreaking) { FormatStyle Style = getLLVMStyle(); verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits