[clang] [clang-format] Skip PP directives when determining brace kind (PR #69473)

Owen Pan via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 19 18:09:27 PDT 2023


================
@@ -491,11 +491,19 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
   SmallVector<StackEntry, 8> LBraceStack;
   assert(Tok->is(tok::l_brace));
   do {
-    // Get next non-comment token.
-    FormatToken *NextTok;
-    do {
-      NextTok = Tokens->getNextToken();
-    } while (NextTok->is(tok::comment));
+    // Get next non-comment, non-preprocessor token.
+    FormatToken *NextTok = Tokens->getNextToken();
+    while (NextTok->is(tok::comment) ||
+           (NextTok->is(tok::hash) && isOnNewLine(*NextTok))) {
+      while (NextTok->is(tok::comment))
+        NextTok = Tokens->getNextToken();
+      while (NextTok->is(tok::hash) && isOnNewLine(*NextTok)) {
+        ScopedMacroState MacroState(*Line, Tokens, NextTok);
+        do {
+          NextTok = Tokens->getNextToken();
+        } while (NextTok->isNot(tok::eof));
+      }
+    }
----------------
owenca wrote:

Tested on the following case without `isOnNewLine()`:
```
struct Foo {
  Foo() : a(2) {
#define FOO(foo) \
  /* foo */ #foo
  }

  Foo &operator+=(const Foo &) {
    return *this;
  }
};
```
Also works if the comment is deleted.

https://github.com/llvm/llvm-project/pull/69473


More information about the cfe-commits mailing list