curdeius created this revision. curdeius added reviewers: MyDeveloperDay, HazardyKnusperkeks, owenpan. curdeius requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Fixes https://github.com/llvm/llvm-project/issues/53576. There was an inconsistency in formatting of delete expressions. Before: delete (void*)a; delete[](void*) a; After this patch: delete (void*)a; delete[] (void*)a; Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D119117 Files: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp clang/unittests/Format/TokenAnnotatorTest.cpp
Index: clang/unittests/Format/TokenAnnotatorTest.cpp =================================================================== --- clang/unittests/Format/TokenAnnotatorTest.cpp +++ clang/unittests/Format/TokenAnnotatorTest.cpp @@ -91,6 +91,28 @@ EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_RecordLBrace); } +TEST_F(TokenAnnotatorTest, UnderstandsNewAndDelete) { + auto Tokens = annotate("delete (void *)p;"); + EXPECT_EQ(Tokens.size(), 8u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::r_paren, TT_CastRParen); + + Tokens = annotate("delete[] (void *)p;"); + EXPECT_EQ(Tokens.size(), 10u) << Tokens; + EXPECT_TOKEN(Tokens[6], tok::r_paren, TT_CastRParen); + + Tokens = annotate("delete[] /*comment*/ (void *)p;"); + EXPECT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen); + + Tokens = annotate("delete[/*comment*/] (void *)p;"); + EXPECT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen); + + Tokens = annotate("delete/*comment*/[] (void *)p;"); + EXPECT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_TOKEN(Tokens[7], tok::r_paren, TT_CastRParen); +} + } // namespace } // namespace format } // namespace clang Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -9725,6 +9725,7 @@ " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); verifyFormat("delete[] h->p;"); + verifyFormat("delete[] (void *)p;"); verifyFormat("void operator delete(void *foo) ATTRIB;"); verifyFormat("void operator new(void *foo) ATTRIB;"); @@ -20009,15 +20010,13 @@ TEST_F(FormatTest, CountsUTF8CharactersProperly) { verifyFormat("\"ÐÐ´Ð½Ð°Ð¶Ð´Ñ Ð² ÑÑÑдÑнÑÑ Ð·Ð¸Ð¼Ð½ÑÑ Ð¿Ð¾ÑÑ...\"", getLLVMStyleWithColumns(35)); - verifyFormat("\"ä¸ äº ä¸ å äº å ä¸ å « ä¹ å\"", - getLLVMStyleWithColumns(31)); + verifyFormat("\"ä¸ äº ä¸ å äº å ä¸ å « ä¹ å\"", getLLVMStyleWithColumns(31)); verifyFormat("// ÐÐ´Ð½Ð°Ð¶Ð´Ñ Ð² ÑÑÑдÑнÑÑ Ð·Ð¸Ð¼Ð½ÑÑ Ð¿Ð¾ÑÑ...", getLLVMStyleWithColumns(36)); verifyFormat("// ä¸ äº ä¸ å äº å ä¸ å « ä¹ å", getLLVMStyleWithColumns(32)); verifyFormat("/* ÐÐ´Ð½Ð°Ð¶Ð´Ñ Ð² ÑÑÑдÑнÑÑ Ð·Ð¸Ð¼Ð½ÑÑ Ð¿Ð¾ÑÑ... */", getLLVMStyleWithColumns(39)); - verifyFormat("/* ä¸ äº ä¸ å äº å ä¸ å « ä¹ å */", - getLLVMStyleWithColumns(35)); + verifyFormat("/* ä¸ äº ä¸ å äº å ä¸ å « ä¹ å */", getLLVMStyleWithColumns(35)); } TEST_F(FormatTest, SplitsUTF8Strings) { @@ -20037,21 +20036,20 @@ "\"поÑÑ,\"", format("\"ÐднаждÑ, в ÑÑÑдÑнÑÑ Ð·Ð¸Ð¼Ð½ÑÑ Ð¿Ð¾ÑÑ,\"", getLLVMStyleWithColumns(13))); + EXPECT_EQ("\"ä¸ äº ä¸ \"\n" + "\"å äºå \"\n" + "\"ä¸ å « ä¹ \"\n" + "\"å\"", + format("\"ä¸ äº ä¸ å äºå ä¸ å « ä¹ å\"", getLLVMStyleWithColumns(11))); EXPECT_EQ( - "\"ä¸ äº ä¸ \"\n" - "\"å äºå \"\n" - "\"ä¸ å « ä¹ \"\n" - "\"å\"", - format("\"ä¸ äº ä¸ å äºå ä¸ å « ä¹ å\"", getLLVMStyleWithColumns(11))); - EXPECT_EQ("\"ä¸\t\"\n" - "\"äº \t\"\n" - "\"ä¸ å \"\n" - "\"äº\t\"\n" - "\"å \t\"\n" - "\"ä¸ \"\n" - "\"å «ä¹å\tqq\"", - format("\"ä¸\täº \tä¸ å äº\tå \tä¸ å «ä¹å\tqq\"", - getLLVMStyleWithColumns(11))); + "\"ä¸\t\"\n" + "\"äº \t\"\n" + "\"ä¸ å \"\n" + "\"äº\t\"\n" + "\"å \t\"\n" + "\"ä¸ \"\n" + "\"å «ä¹å\tqq\"", + format("\"ä¸\täº \tä¸ å äº\tå \tä¸ å «ä¹å\tqq\"", getLLVMStyleWithColumns(11))); // UTF8 character in an escape sequence. EXPECT_EQ("\"aaaaaa\"\n" @@ -20096,16 +20094,16 @@ format("/* ÐлÑжÑ, поднимаеÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ в гоÑÑ\n" " * ÐоÑадка, везÑÑÐ°Ñ Ñ Ð²Ð¾ÑоÑÑÑ Ð²Ð¾Ð·. */", getLLVMStyleWithColumns(13))); - EXPECT_EQ( - "/* ä¸äºä¸\n" - " * åäºå ä¸\n" - " * å « ä¹\n" - " * å */", - format("/* ä¸äºä¸ åäºå ä¸ å « ä¹ å */", getLLVMStyleWithColumns(9))); + EXPECT_EQ("/* ä¸äºä¸\n" + " * åäºå ä¸\n" + " * å « ä¹\n" + " * å */", + format("/* ä¸äºä¸ åäºå ä¸ å « ä¹ å */", getLLVMStyleWithColumns(9))); EXPECT_EQ("/* ð£ð®ð¼ð½ ð£ð¬ð²ð¯\n" " * ððªð¥ð\n" " * ðð¿ð±-ð */", - format("/* ð£ð®ð¼ð½ ð£ð¬ð²ð¯ ððªð¥ð ðð¿ð±-ð */", getLLVMStyleWithColumns(12))); + format("/* ð£ð®ð¼ð½ ð£ð¬ð²ð¯ ððªð¥ð ðð¿ð±-ð */", + getLLVMStyleWithColumns(12))); } #endif // _MSC_VER Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -1883,6 +1883,25 @@ LeftOfParens = LeftOfParens->MatchingParen->Previous; } + if (LeftOfParens->is(tok::r_square)) { + // delete[] (void *)ptr; + auto MayBeArrayDelete = [](FormatToken *Tok) -> FormatToken * { + if (Tok->isNot(tok::r_square)) + return nullptr; + + Tok = Tok->getPreviousNonComment(); + if (!Tok || Tok->isNot(tok::l_square)) + return nullptr; + + Tok = Tok->getPreviousNonComment(); + if (!Tok || Tok->isNot(tok::kw_delete)) + return nullptr; + return Tok; + }; + if (FormatToken *MaybeDelete = MayBeArrayDelete(LeftOfParens)) + LeftOfParens = MaybeDelete; + } + // The Condition directly below this one will see the operator arguments // as a (void *foo) cast. // void operator delete(void *foo) ATTRIB; @@ -3227,7 +3246,10 @@ if (Left.isOneOf(tok::kw_try, Keywords.kw___except, tok::kw_catch)) return Style.SpaceBeforeParensOptions.AfterControlStatements || spaceRequiredBeforeParens(Right); - if (Left.isOneOf(tok::kw_new, tok::kw_delete)) + if (Left.isOneOf(tok::kw_new, tok::kw_delete) || + (Left.is(tok::r_square) && Left.MatchingParen && + Left.MatchingParen->Previous && + Left.MatchingParen->Previous->is(tok::kw_delete))) return Style.SpaceBeforeParens != FormatStyle::SBPO_Never || spaceRequiredBeforeParens(Right); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits