Author: Emilia Kond Date: 2023-11-30T21:26:39+02:00 New Revision: a112921d88c28b9d3ac30cad7dbc961a33f22926
URL: https://github.com/llvm/llvm-project/commit/a112921d88c28b9d3ac30cad7dbc961a33f22926 DIFF: https://github.com/llvm/llvm-project/commit/a112921d88c28b9d3ac30cad7dbc961a33f22926.diff LOG: [clang-format] Don't skip stringizing when determining brace kind (#73886) PR #69473 introduced skipping PP directives when determining the brace kind of an lbrace. However, it did so by skipping to the end of the line when encountering a hash character. This means it also skipped to the end of line when encountering a macro stringizing operator, which, unlike PP directives, don't have effect until the end of line. This led to cases where the rbrace could be completely skipped if it was on the same line as a stringizing operator. This patch skips hash characters if we're already in a PP directive, as you can't define a macro inside of a macro Fixes https://github.com/llvm/llvm-project/issues/72662 Added: Modified: clang/lib/Format/UnwrappedLineParser.cpp clang/unittests/Format/TokenAnnotatorTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index a5a4419b98239e6..9a9a16a3caaca8b 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -496,7 +496,7 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) { do { NextTok = Tokens->getNextToken(); } while (NextTok->is(tok::comment)); - while (NextTok->is(tok::hash)) { + while (NextTok->is(tok::hash) && !Line->InMacroBody) { NextTok = Tokens->getNextToken(); do { NextTok = Tokens->getNextToken(); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index bc734573ce0cb4d..65b1f0f4b576598 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -1851,6 +1851,22 @@ TEST_F(TokenAnnotatorTest, UnderstandsTrailingReturnArrow) { EXPECT_TOKEN(Tokens[13], tok::arrow, TT_Unknown); } +TEST_F(TokenAnnotatorTest, UnderstandHashInMacro) { + auto Tokens = annotate("#define Foo(Bar) \\\n" + " { \\\n" + " #Bar \\\n" + " }"); + ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_BRACE_KIND(Tokens[6], BK_Block); + EXPECT_BRACE_KIND(Tokens[9], BK_Block); + + Tokens = annotate("#define Foo(Bar) \\\n" + " { #Bar }"); + ASSERT_EQ(Tokens.size(), 11u) << Tokens; + EXPECT_BRACE_KIND(Tokens[6], BK_Block); + EXPECT_BRACE_KIND(Tokens[9], BK_Block); +} + TEST_F(TokenAnnotatorTest, UnderstandsAttributeMacros) { // '__attribute__' has special handling. auto Tokens = annotate("__attribute__(X) void Foo(void);"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits