llvm / llvm/llvm-project

[clang-format] Macros option allows extraneous whitespace to persist

Open
#173,932 1 comment 0 reactions 0 assignees View on GitHub
clang-format
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Defining a function-like macro with the `Macros` option in `.clang-format` and then using it within a function declaration allows one extra space to remain, even when it shouldn't. However, it will not add a space if one doesn't already exist. (tested on 8e90208)

`.clang-format`:
```yaml
Macros:
- X(x) = x
```


Case 1 (works as expected)

`test.c`:
```c
#define X(T) T
void a(X(int) *b) {}
```

Running `clang-format` has no change, as expected.

Case 2 (fails, extra space is kept)

`test.c`:
```c
#define X(T) T
void a( X(int) *b) {}
```

Running `clang-format` has no change, but it should remove the extra space between `(` and `X`. If more spaces are added between `(` and `X`, then running `clang-format` removes all but one space.


Log with -debug (expected, case 1):

```
Args: bin/clang-format /tmp/c/test2.c -debug
Trying /tmp/c/.clang-format...
Using configuration file /tmp/c/.clang-format
File encoding: UTF8
Language: C
----
Next [0] Token: hash / #, Macro: 0
Peeking [1] Token: identifier / define, Macro: 0
Next [1] Token: identifier / define, Macro: 0
Next [2] Token: identifier / X, Macro: 0
Next [3] Token: l_paren / (, Macro: 0
Next [4] Token: identifier / T, Macro: 0
Next [5] Token: r_paren / ), Macro: 0
Next [6] Token: identifier / T, Macro: 0
Adding unwrapped line:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Peeking [7] Token: void / void, Macro: 0
Next [7] Token: void / void, Macro: 0
Adding unwrapped line:
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Next [8] Token: identifier / a, Macro: 0
Next [9] Token: l_paren / (, Macro: 0
Next [10] Token: identifier / X, Macro: 0
Getting Position: 10
Next [11] Token: l_paren / (, Macro: 0
Getting Position: 11
Next [12] Token: int / int, Macro: 0
Next [13] Token: r_paren / ), Macro: 0
Next [14] Token: star / *, Macro: 0
Macro call: X((int )
Inserting:
[20] Token: int / int, Macro: 1
[21] Token: eof / , Macro: 1
Jump from: 21 -> 14
At inserted token [20] Token: int / int, Macro: 1
Expanded: int
Next [14] Token: star / *, Macro: 0
Next [15] Token: identifier / b, Macro: 0
Next [16] Token: r_paren / ), Macro: 0
Next [17] Token: l_brace / {, Macro: 0
Peeking [18] Token: r_brace / }, Macro: 0
Getting Position: 17
Next [18] Token: r_brace / }, Macro: 0
Next [19] Token: eof / , Macro: 0
Setting Position: 17
Peeking [18] Token: r_brace / }, Macro: 0
Next [18] Token: r_brace / }, Macro: 0
Adding unwrapped line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=9, "int"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
MCR: new line...
MCR: Token: void, Parent: , First: 1
ParentMap:
MCR: New parent:
-> void
MCR: Token: a, Parent: , First: 0
ParentMap:
MCR: New parent:
-> a
MCR: Token: (, Parent: , First: 0
ParentMap:
MCR: New parent:
-> (
MCR: Token: int, Parent: , First: 0
ParentMap:
MCR: New parent:
-> X
ParentLastToken:
-> (
ParentMap:
-> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: , First: 0
ParentMap:
MCR: New parent:
-> *
MCR: Token: b, Parent: , First: 0
ParentMap:
MCR: New parent:
-> b
MCR: Token: ), Parent: , First: 0
ParentMap:
MCR: New parent:
-> )
MCR: Token: {, Parent: , First: 0
ParentMap:
MCR: New parent:
-> {
Finalizing reconstructed lines:

void a ( X (
int
) * b ) {

Adding unexpanded line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=7, "X"] l_paren[T=168, OC=8, "("] int[T=168, OC=9, "int"] r_paren[T=168, OC=12, ")"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Next [19] Token: eof / , Macro: 0
Adding unwrapped line:
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Adding unwrapped line:
Line(0, FSC=0): eof[T=168, OC=0, ""]
Expanded lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=9, "int"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Unwrapped lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=7, "X"] l_paren[T=168, OC=8, "("] int[T=168, OC=9, "int"] r_paren[T=168, OC=12, ")"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Run 0...
Replacements for run 0:
Run 1...
Replacements for run 1:
File encoding: UTF8
Language: C
----
Next [0] Token: hash / #, Macro: 0
Peeking [1] Token: identifier / define, Macro: 0
Next [1] Token: identifier / define, Macro: 0
Next [2] Token: identifier / X, Macro: 0
Next [3] Token: l_paren / (, Macro: 0
Next [4] Token: identifier / T, Macro: 0
Next [5] Token: r_paren / ), Macro: 0
Next [6] Token: identifier / T, Macro: 0
Adding unwrapped line:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Peeking [7] Token: void / void, Macro: 0
Next [7] Token: void / void, Macro: 0
Adding unwrapped line:
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Next [8] Token: identifier / a, Macro: 0
Next [9] Token: l_paren / (, Macro: 0
Next [10] Token: identifier / X, Macro: 0
Getting Position: 10
Next [11] Token: l_paren / (, Macro: 0
Getting Position: 11
Next [12] Token: int / int, Macro: 0
Next [13] Token: r_paren / ), Macro: 0
Next [14] Token: star / *, Macro: 0
Macro call: X((int )
Inserting:
[20] Token: int / int, Macro: 1
[21] Token: eof / , Macro: 1
Jump from: 21 -> 14
At inserted token [20] Token: int / int, Macro: 1
Expanded: int
Next [14] Token: star / *, Macro: 0
Next [15] Token: identifier / b, Macro: 0
Next [16] Token: r_paren / ), Macro: 0
Next [17] Token: l_brace / {, Macro: 0
Peeking [18] Token: r_brace / }, Macro: 0
Getting Position: 17
Next [18] Token: r_brace / }, Macro: 0
Next [19] Token: eof / , Macro: 0
Setting Position: 17
Peeking [18] Token: r_brace / }, Macro: 0
Next [18] Token: r_brace / }, Macro: 0
Adding unwrapped line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=9, "int"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
MCR: new line...
MCR: Token: void, Parent: , First: 1
ParentMap:
MCR: New parent:
-> void
MCR: Token: a, Parent: , First: 0
ParentMap:
MCR: New parent:
-> a
MCR: Token: (, Parent: , First: 0
ParentMap:
MCR: New parent:
-> (
MCR: Token: int, Parent: , First: 0
ParentMap:
MCR: New parent:
-> X
ParentLastToken:
-> (
ParentMap:
-> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: , First: 0
ParentMap:
MCR: New parent:
-> *
MCR: Token: b, Parent: , First: 0
ParentMap:
MCR: New parent:
-> b
MCR: Token: ), Parent: , First: 0
ParentMap:
MCR: New parent:
-> )
MCR: Token: {, Parent: , First: 0
ParentMap:
MCR: New parent:
-> {
Finalizing reconstructed lines:

void a ( X (
int
) * b ) {

Adding unexpanded line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=7, "X"] l_paren[T=168, OC=8, "("] int[T=168, OC=9, "int"] r_paren[T=168, OC=12, ")"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Next [19] Token: eof / , Macro: 0
Adding unwrapped line:
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Adding unwrapped line:
Line(0, FSC=0): eof[T=168, OC=0, ""]
Expanded lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=9, "int"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Unwrapped lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=7, "X"] l_paren[T=168, OC=8, "("] int[T=168, OC=9, "int"] r_paren[T=168, OC=12, ")"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Run 0...
Replacements for run 0:
Run 1...
Replacements for run 1:
File encoding: UTF8
Language: C
----
Next [0] Token: hash / #, Macro: 0
Peeking [1] Token: identifier / define, Macro: 0
Next [1] Token: identifier / define, Macro: 0
Next [2] Token: identifier / X, Macro: 0
Next [3] Token: l_paren / (, Macro: 0
Next [4] Token: identifier / T, Macro: 0
Next [5] Token: r_paren / ), Macro: 0
Next [6] Token: identifier / T, Macro: 0
Adding unwrapped line:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Peeking [7] Token: void / void, Macro: 0
Next [7] Token: void / void, Macro: 0
Adding unwrapped line:
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Next [8] Token: identifier / a, Macro: 0
Next [9] Token: l_paren / (, Macro: 0
Next [10] Token: identifier / X, Macro: 0
Getting Position: 10
Next [11] Token: l_paren / (, Macro: 0
Getting Position: 11
Next [12] Token: int / int, Macro: 0
Next [13] Token: r_paren / ), Macro: 0
Next [14] Token: star / *, Macro: 0
Macro call: X((int )
Inserting:
[20] Token: int / int, Macro: 1
[21] Token: eof / , Macro: 1
Jump from: 21 -> 14
At inserted token [20] Token: int / int, Macro: 1
Expanded: int
Next [14] Token: star / *, Macro: 0
Next [15] Token: identifier / b, Macro: 0
Next [16] Token: r_paren / ), Macro: 0
Next [17] Token: l_brace / {, Macro: 0
Peeking [18] Token: r_brace / }, Macro: 0
Getting Position: 17
Next [18] Token: r_brace / }, Macro: 0
Next [19] Token: eof / , Macro: 0
Setting Position: 17
Peeking [18] Token: r_brace / }, Macro: 0
Next [18] Token: r_brace / }, Macro: 0
Adding unwrapped line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=9, "int"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
MCR: new line...
MCR: Token: void, Parent: , First: 1
ParentMap:
MCR: New parent:
-> void
MCR: Token: a, Parent: , First: 0
ParentMap:
MCR: New parent:
-> a
MCR: Token: (, Parent: , First: 0
ParentMap:
MCR: New parent:
-> (
MCR: Token: int, Parent: , First: 0
ParentMap:
MCR: New parent:
-> X
ParentLastToken:
-> (
ParentMap:
-> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: , First: 0
ParentMap:
MCR: New parent:
-> *
MCR: Token: b, Parent: , First: 0
ParentMap:
MCR: New parent:
-> b
MCR: Token: ), Parent: , First: 0
ParentMap:
MCR: New parent:
-> )
MCR: Token: {, Parent: , First: 0
ParentMap:
MCR: New parent:
-> {
Finalizing reconstructed lines:

void a ( X (
int
) * b ) {

Adding unexpanded line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=7, "X"] l_paren[T=168, OC=8, "("] int[T=168, OC=9, "int"] r_paren[T=168, OC=12, ")"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Next [19] Token: eof / , Macro: 0
Adding unwrapped line:
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Adding unwrapped line:
Line(0, FSC=0): eof[T=168, OC=0, ""]
Expanded lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=9, "int"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Unwrapped lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=7, "X"] l_paren[T=168, OC=8, "("] int[T=168, OC=9, "int"] r_paren[T=168, OC=12, ")"] star[T=168, OC=14, "*"] identifier[T=168, OC=15, "b"] r_paren[T=168, OC=16, ")"] l_brace[T=52, OC=18, "{"]
Line(0, FSC=0): r_brace[T=168, OC=19, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Run 0...
AnnotatedTokens(L=0, P=0, T=7, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=hash N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='#'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=23 Name=identifier N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685d88 Text='define'
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=23 Name=identifier N=0 L=9 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337682bb8 Text='X'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=23 Name=l_paren N=0 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=59 Name=identifier N=1 L=11 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685de8 Text='T'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=r_paren N=1 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
----
AnnotatedTokens(L=1, P=0, T=6, C=0):
I=1 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=identifier N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685de8 Text='T'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=void N=0 L=4 PPK=2 FakeLParens= FakeRParens=0 II=0x55b33768fef0 Text='void'
I=0 M=0 C=1 T=FunctionDeclarationName S=1 F=0 B=0 BK=0 P=80 Name=identifier N=0 L=6 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685e18 Text='a'
I=0 M=0 C=0 T=FunctionDeclarationLParen S=0 F=0 B=0 BK=0 P=23 Name=l_paren N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=140 Name=int N=1 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x55b33768fc10 Text='int'
I=0 M=0 C=1 T=PointerOrReference S=1 F=0 B=0 BK=0 P=230 Name=star N=1 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
I=0 M=0 C=1 T=StartOfName S=0 F=0 B=0 BK=0 P=240 Name=identifier N=1 L=13 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685e48 Text='b'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=r_paren N=1 L=14 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
I=0 M=0 C=0 T=FunctionLBrace S=1 F=0 B=0 BK=1 P=23 Name=l_brace N=0 L=16 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='{'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=1 P=0 Name=r_brace N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='}'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=eof N=0 L=0 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=''
----
Replacements for run 0:
Run 1...
AnnotatedTokens(L=0, P=0, T=7, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=hash N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='#'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=23 Name=identifier N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685d88 Text='define'
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=23 Name=identifier N=0 L=9 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337682bb8 Text='X'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=23 Name=l_paren N=0 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=1 B=0 BK=0 P=59 Name=identifier N=1 L=11 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685de8 Text='T'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=43 Name=r_paren N=1 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
----
AnnotatedTokens(L=1, P=0, T=6, C=0):
I=1 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=identifier N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685de8 Text='T'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=void N=0 L=4 PPK=2 FakeLParens= FakeRParens=0 II=0x55b33768fef0 Text='void'
I=0 M=0 C=1 T=FunctionDeclarationName S=1 F=1 B=0 BK=0 P=220 Name=identifier N=0 L=6 PPK=2 FakeLParens= FakeRParens=0 II=0x55b337685e18 Text='a'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=23 Name=l_paren N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=59 Name=identifier N=1 L=8 PPK=2 FakeLParens=14/ FakeRParens=0 II=0x55b337685db8 Text='X'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=l_paren N=1 L=9 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=79 Name=int N=2 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x55b33768fc10 Text='int'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=63 Name=r_paren N=2 L=13 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
I=0 M=0 C=0 T=BinaryOperator S=1 F=1 B=0 BK=0 P=54 Name=star N=1 L=15 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
I=0 M=0 C=1 T=Unknown S=0 F=1 B=0 BK=0 P=54 Name=identifier N=1 L=16 PPK=2 FakeLParens= FakeRParens=1 II=0x55b337685e48 Text='b'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=43 Name=r_paren N=1 L=17 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
I=0 M=0 C=0 T=FunctionLBrace S=1 F=1 B=0 BK=1 P=23 Name=l_brace N=0 L=19 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='{'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=1 P=0 Name=r_brace N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='}'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=eof N=0 L=0 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=''
----

---
Penalty for line: 0
State: F|0|0|0 a
State: F|0|0|0 (
State: F|0|0|0 (|4|0|0 X
State: F|0|0|0 (|7|0|0 F|7|7|0 (
State: F|0|0|0 (|7|0|0 F|7|7|0 (|11|7|7 int
State: F|0|0|0 (|7|0|0 F|7|7|0 (|9|7|7 )
State: F|0|0|0 (|7|0|0 F|7|7|0 *
State: F|0|0|0 (|7|0|0 F|7|7|0 b
State: F|0|0|0 (|7|0|0 )
State: F|0|0|0 {
State: F|0|0|0 {|2|0|0 }
Total number of analyzed states: 14
---
Replacements for run 1:
#define X(T) T
void a(X(int) *b) {}
```

Log with -debug (buggy, case 2):

```
Args: bin/clang-format /tmp/c/test2.c -debug
Trying /tmp/c/.clang-format...
Using configuration file /tmp/c/.clang-format
File encoding: UTF8
Language: C
----
Next [0] Token: hash / #, Macro: 0
Peeking [1] Token: identifier / define, Macro: 0
Next [1] Token: identifier / define, Macro: 0
Next [2] Token: identifier / X, Macro: 0
Next [3] Token: l_paren / (, Macro: 0
Next [4] Token: identifier / T, Macro: 0
Next [5] Token: r_paren / ), Macro: 0
Next [6] Token: identifier / T, Macro: 0
Adding unwrapped line:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Peeking [7] Token: void / void, Macro: 0
Next [7] Token: void / void, Macro: 0
Adding unwrapped line:
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Next [8] Token: identifier / a, Macro: 0
Next [9] Token: l_paren / (, Macro: 0
Next [10] Token: identifier / X, Macro: 0
Getting Position: 10
Next [11] Token: l_paren / (, Macro: 0
Getting Position: 11
Next [12] Token: int / int, Macro: 0
Next [13] Token: r_paren / ), Macro: 0
Next [14] Token: star / *, Macro: 0
Macro call: X((int )
Inserting:
[20] Token: int / int, Macro: 1
[21] Token: eof / , Macro: 1
Jump from: 21 -> 14
At inserted token [20] Token: int / int, Macro: 1
Expanded: int
Next [14] Token: star / *, Macro: 0
Next [15] Token: identifier / b, Macro: 0
Next [16] Token: r_paren / ), Macro: 0
Next [17] Token: l_brace / {, Macro: 0
Peeking [18] Token: r_brace / }, Macro: 0
Getting Position: 17
Next [18] Token: r_brace / }, Macro: 0
Next [19] Token: eof / , Macro: 0
Setting Position: 17
Peeking [18] Token: r_brace / }, Macro: 0
Next [18] Token: r_brace / }, Macro: 0
Adding unwrapped line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=10, "int"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
MCR: new line...
MCR: Token: void, Parent: , First: 1
ParentMap:
MCR: New parent:
-> void
MCR: Token: a, Parent: , First: 0
ParentMap:
MCR: New parent:
-> a
MCR: Token: (, Parent: , First: 0
ParentMap:
MCR: New parent:
-> (
MCR: Token: int, Parent: , First: 0
ParentMap:
MCR: New parent:
-> X
ParentLastToken:
-> (
ParentMap:
-> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: , First: 0
ParentMap:
MCR: New parent:
-> *
MCR: Token: b, Parent: , First: 0
ParentMap:
MCR: New parent:
-> b
MCR: Token: ), Parent: , First: 0
ParentMap:
MCR: New parent:
-> )
MCR: Token: {, Parent: , First: 0
ParentMap:
MCR: New parent:
-> {
Finalizing reconstructed lines:

void a ( X (
int
) * b ) {

Adding unexpanded line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] int[T=168, OC=10, "int"] r_paren[T=168, OC=13, ")"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Next [19] Token: eof / , Macro: 0
Adding unwrapped line:
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Adding unwrapped line:
Line(0, FSC=0): eof[T=168, OC=0, ""]
Expanded lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=10, "int"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Unwrapped lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] int[T=168, OC=10, "int"] r_paren[T=168, OC=13, ")"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Run 0...
Replacements for run 0:
Run 1...
Replacements for run 1:
File encoding: UTF8
Language: C
----
Next [0] Token: hash / #, Macro: 0
Peeking [1] Token: identifier / define, Macro: 0
Next [1] Token: identifier / define, Macro: 0
Next [2] Token: identifier / X, Macro: 0
Next [3] Token: l_paren / (, Macro: 0
Next [4] Token: identifier / T, Macro: 0
Next [5] Token: r_paren / ), Macro: 0
Next [6] Token: identifier / T, Macro: 0
Adding unwrapped line:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Peeking [7] Token: void / void, Macro: 0
Next [7] Token: void / void, Macro: 0
Adding unwrapped line:
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Next [8] Token: identifier / a, Macro: 0
Next [9] Token: l_paren / (, Macro: 0
Next [10] Token: identifier / X, Macro: 0
Getting Position: 10
Next [11] Token: l_paren / (, Macro: 0
Getting Position: 11
Next [12] Token: int / int, Macro: 0
Next [13] Token: r_paren / ), Macro: 0
Next [14] Token: star / *, Macro: 0
Macro call: X((int )
Inserting:
[20] Token: int / int, Macro: 1
[21] Token: eof / , Macro: 1
Jump from: 21 -> 14
At inserted token [20] Token: int / int, Macro: 1
Expanded: int
Next [14] Token: star / *, Macro: 0
Next [15] Token: identifier / b, Macro: 0
Next [16] Token: r_paren / ), Macro: 0
Next [17] Token: l_brace / {, Macro: 0
Peeking [18] Token: r_brace / }, Macro: 0
Getting Position: 17
Next [18] Token: r_brace / }, Macro: 0
Next [19] Token: eof / , Macro: 0
Setting Position: 17
Peeking [18] Token: r_brace / }, Macro: 0
Next [18] Token: r_brace / }, Macro: 0
Adding unwrapped line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=10, "int"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
MCR: new line...
MCR: Token: void, Parent: , First: 1
ParentMap:
MCR: New parent:
-> void
MCR: Token: a, Parent: , First: 0
ParentMap:
MCR: New parent:
-> a
MCR: Token: (, Parent: , First: 0
ParentMap:
MCR: New parent:
-> (
MCR: Token: int, Parent: , First: 0
ParentMap:
MCR: New parent:
-> X
ParentLastToken:
-> (
ParentMap:
-> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: , First: 0
ParentMap:
MCR: New parent:
-> *
MCR: Token: b, Parent: , First: 0
ParentMap:
MCR: New parent:
-> b
MCR: Token: ), Parent: , First: 0
ParentMap:
MCR: New parent:
-> )
MCR: Token: {, Parent: , First: 0
ParentMap:
MCR: New parent:
-> {
Finalizing reconstructed lines:

void a ( X (
int
) * b ) {

Adding unexpanded line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] int[T=168, OC=10, "int"] r_paren[T=168, OC=13, ")"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Next [19] Token: eof / , Macro: 0
Adding unwrapped line:
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Adding unwrapped line:
Line(0, FSC=0): eof[T=168, OC=0, ""]
Expanded lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=10, "int"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Unwrapped lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] int[T=168, OC=10, "int"] r_paren[T=168, OC=13, ")"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Run 0...
Replacements for run 0:
Run 1...
Replacements for run 1:
File encoding: UTF8
Language: C
----
Next [0] Token: hash / #, Macro: 0
Peeking [1] Token: identifier / define, Macro: 0
Next [1] Token: identifier / define, Macro: 0
Next [2] Token: identifier / X, Macro: 0
Next [3] Token: l_paren / (, Macro: 0
Next [4] Token: identifier / T, Macro: 0
Next [5] Token: r_paren / ), Macro: 0
Next [6] Token: identifier / T, Macro: 0
Adding unwrapped line:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Peeking [7] Token: void / void, Macro: 0
Next [7] Token: void / void, Macro: 0
Adding unwrapped line:
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Next [8] Token: identifier / a, Macro: 0
Next [9] Token: l_paren / (, Macro: 0
Next [10] Token: identifier / X, Macro: 0
Getting Position: 10
Next [11] Token: l_paren / (, Macro: 0
Getting Position: 11
Next [12] Token: int / int, Macro: 0
Next [13] Token: r_paren / ), Macro: 0
Next [14] Token: star / *, Macro: 0
Macro call: X((int )
Inserting:
[20] Token: int / int, Macro: 1
[21] Token: eof / , Macro: 1
Jump from: 21 -> 14
At inserted token [20] Token: int / int, Macro: 1
Expanded: int
Next [14] Token: star / *, Macro: 0
Next [15] Token: identifier / b, Macro: 0
Next [16] Token: r_paren / ), Macro: 0
Next [17] Token: l_brace / {, Macro: 0
Peeking [18] Token: r_brace / }, Macro: 0
Getting Position: 17
Next [18] Token: r_brace / }, Macro: 0
Next [19] Token: eof / , Macro: 0
Setting Position: 17
Peeking [18] Token: r_brace / }, Macro: 0
Next [18] Token: r_brace / }, Macro: 0
Adding unwrapped line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=10, "int"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
MCR: new line...
MCR: Token: void, Parent: , First: 1
ParentMap:
MCR: New parent:
-> void
MCR: Token: a, Parent: , First: 0
ParentMap:
MCR: New parent:
-> a
MCR: Token: (, Parent: , First: 0
ParentMap:
MCR: New parent:
-> (
MCR: Token: int, Parent: , First: 0
ParentMap:
MCR: New parent:
-> X
ParentLastToken:
-> (
ParentMap:
-> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: , First: 0
ParentMap:
MCR: New parent:
-> *
MCR: Token: b, Parent: , First: 0
ParentMap:
MCR: New parent:
-> b
MCR: Token: ), Parent: , First: 0
ParentMap:
MCR: New parent:
-> )
MCR: Token: {, Parent: , First: 0
ParentMap:
MCR: New parent:
-> {
Finalizing reconstructed lines:

void a ( X (
int
) * b ) {

Adding unexpanded line:
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] int[T=168, OC=10, "int"] r_paren[T=168, OC=13, ")"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Next [19] Token: eof / , Macro: 0
Adding unwrapped line:
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Adding unwrapped line:
Line(0, FSC=0): eof[T=168, OC=0, ""]
Expanded lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] int[T=168, OC=10, "int"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Unwrapped lines:
Line(0, FSC=0) MACRO: hash[T=168, OC=0, "#"] identifier[T=168, OC=1, "define"] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] identifier[T=168, OC=10, "T"] r_paren[T=168, OC=11, ")"]
Line(1, FSC=0) MACRO: identifier[T=168, OC=13, "T"]
Line(0, FSC=0): void[T=168, OC=0, "void"] identifier[T=168, OC=5, "a"] l_paren[T=168, OC=6, "("] identifier[T=168, OC=8, "X"] l_paren[T=168, OC=9, "("] int[T=168, OC=10, "int"] r_paren[T=168, OC=13, ")"] star[T=168, OC=15, "*"] identifier[T=168, OC=16, "b"] r_paren[T=168, OC=17, ")"] l_brace[T=52, OC=19, "{"]
Line(0, FSC=0): r_brace[T=168, OC=20, "}"]
Line(0, FSC=0): eof[T=168, OC=0, ""]
Run 0...
AnnotatedTokens(L=0, P=0, T=7, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=hash N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='#'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=23 Name=identifier N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548d88 Text='define'
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=23 Name=identifier N=0 L=9 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da545bb8 Text='X'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=23 Name=l_paren N=0 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=59 Name=identifier N=1 L=11 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548de8 Text='T'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=r_paren N=1 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
----
AnnotatedTokens(L=1, P=0, T=6, C=0):
I=1 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=identifier N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548de8 Text='T'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=void N=0 L=4 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da552ef0 Text='void'
I=0 M=0 C=1 T=FunctionDeclarationName S=1 F=0 B=0 BK=0 P=80 Name=identifier N=0 L=6 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548e18 Text='a'
I=0 M=0 C=0 T=FunctionDeclarationLParen S=0 F=0 B=0 BK=0 P=23 Name=l_paren N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=140 Name=int N=1 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da552c10 Text='int'
I=0 M=0 C=1 T=PointerOrReference S=1 F=0 B=0 BK=0 P=230 Name=star N=1 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
I=0 M=0 C=1 T=StartOfName S=0 F=0 B=0 BK=0 P=240 Name=identifier N=1 L=13 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548e48 Text='b'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=r_paren N=1 L=14 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
I=0 M=0 C=0 T=FunctionLBrace S=1 F=0 B=0 BK=1 P=23 Name=l_brace N=0 L=16 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='{'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=1 P=0 Name=r_brace N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='}'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=eof N=0 L=0 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=''
----
Replacements for run 0:
Run 1...
AnnotatedTokens(L=0, P=0, T=7, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=hash N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='#'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=23 Name=identifier N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548d88 Text='define'
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=23 Name=identifier N=0 L=9 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da545bb8 Text='X'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=23 Name=l_paren N=0 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=1 B=0 BK=0 P=59 Name=identifier N=1 L=11 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548de8 Text='T'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=43 Name=r_paren N=1 L=12 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
----
AnnotatedTokens(L=1, P=0, T=6, C=0):
I=1 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=identifier N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548de8 Text='T'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=void N=0 L=4 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da552ef0 Text='void'
I=0 M=0 C=1 T=FunctionDeclarationName S=1 F=1 B=0 BK=0 P=220 Name=identifier N=0 L=6 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da548e18 Text='a'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=23 Name=l_paren N=0 L=7 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=1 F=0 B=0 BK=0 P=59 Name=identifier N=1 L=9 PPK=2 FakeLParens=14/ FakeRParens=0 II=0x5615da548db8 Text='X'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=l_paren N=1 L=10 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
I=0 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=79 Name=int N=2 L=13 PPK=2 FakeLParens= FakeRParens=0 II=0x5615da552c10 Text='int'
I=0 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=63 Name=r_paren N=2 L=14 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
I=0 M=0 C=0 T=BinaryOperator S=1 F=1 B=0 BK=0 P=54 Name=star N=1 L=16 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
I=0 M=0 C=1 T=Unknown S=0 F=1 B=0 BK=0 P=54 Name=identifier N=1 L=17 PPK=2 FakeLParens= FakeRParens=1 II=0x5615da548e48 Text='b'
I=0 M=0 C=0 T=Unknown S=0 F=1 B=0 BK=0 P=43 Name=r_paren N=1 L=18 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
I=0 M=0 C=0 T=FunctionLBrace S=1 F=1 B=0 BK=1 P=23 Name=l_brace N=0 L=20 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='{'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=1 P=0 Name=r_brace N=0 L=1 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='}'
----
AnnotatedTokens(L=0, P=0, T=6, C=0):
I=0 M=0 C=0 T=Unknown S=1 F=1 B=0 BK=0 P=0 Name=eof N=0 L=0 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=''
----

---
Penalty for line: 0
State: F|0|0|0 a
State: F|0|0|0 (
State: F|0|0|0 (|4|0|0 X
State: F|0|0|0 (|8|0|0 F|8|8|0 (
State: F|0|0|0 (|8|0|0 F|8|8|0 (|12|8|8 int
State: F|0|0|0 (|8|0|0 F|8|8|0 (|10|8|8 )
State: F|0|0|0 (|8|0|0 F|8|8|0 *
State: F|0|0|0 (|8|0|0 F|8|8|0 b
State: F|0|0|0 (|8|0|0 )
State: F|0|0|0 {
State: F|0|0|0 {|2|0|0 }
Total number of analyzed states: 14
---
Replacements for run 1:
#define X(T) T
void a( X(int) *b) {}
```


Contributor guide

Open the contributing guide

Research direction

Reproduce the issue with the provided .clang-format and test.c inputs, running clang-format on both cases and comparing the whitespace before X. Trace the macro expansion and formatting path, then verify that the extra space is removed while the already-correct case remains unchanged.

Written by the indexing model from the issue text.

Assessment

Tech stack
c
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.