diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -3549,7 +3549,9 @@ void UnwrappedLineParser::readToken(int LevelDifference) { SmallVector Comments; + bool FirstNonCommentOnLine = true; do { + FormatToken *Previous = FormatTok; FormatTok = Tokens->getNextToken(); assert(FormatTok); while (FormatTok->getType() == TT_ConflictStart || @@ -3565,8 +3567,17 @@ FormatTok->MustBreakBefore = true; } + bool FirstOnLine = FormatTok->HasUnescapedNewline || FormatTok->IsFirst; + if (Previous && Previous->Tok.is(tok::comment)) { + // Consider preprocessor directives preceded by block comments as first on + // line. + FirstNonCommentOnLine |= FirstOnLine; + } else { + FirstNonCommentOnLine = FirstOnLine; + } + while (!Line->InPPDirective && FormatTok->Tok.is(tok::hash) && - (FormatTok->HasUnescapedNewline || FormatTok->IsFirst)) { + FirstNonCommentOnLine) { distributeComments(Comments, FormatTok); Comments.clear(); // If there is an unfinished unwrapped line, we flush the preprocessor diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1797,6 +1797,7 @@ TEST_F(FormatTest, UnderstandsMacros) { verifyFormat("#define A (parentheses)"); + verifyFormat("/* comment */ #define A (parentheses)"); verifyFormat("#define true ((int)1)"); verifyFormat("#define and(x)"); verifyFormat("#define if(x) x");