Issue 173932
Summary [clang-format] Macros option allows extraneous whitespace to persist
Labels clang-format
Assignees
Reporter tesselslate
    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
```

<hr/>
<details>
<summary>Case 1 (works as expected)</summary>

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

Running `clang-format` has no change, as expected.
</details>

<details>
<summary>Case 2 (fails, extra space is kept)</summary>

`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.
</details>

<hr/>
<details>
<summary>Log with -debug (expected, case 1):</summary>

```
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: <null>, First: 1
ParentMap:
MCR: New parent: <null>
-> void
MCR: Token: a, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> a
MCR: Token: (, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> (
MCR: Token: int, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> X
ParentLastToken: <null>
-> (
ParentMap:
<null> -> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> *
MCR: Token: b, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> b
MCR: Token: ), Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> )
MCR: Token: {, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> {
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: <null>, First: 1
ParentMap:
MCR: New parent: <null>
-> void
MCR: Token: a, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> a
MCR: Token: (, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> (
MCR: Token: int, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> X
ParentLastToken: <null>
-> (
ParentMap:
<null> -> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> *
MCR: Token: b, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> b
MCR: Token: ), Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> )
MCR: Token: {, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> {
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: <null>, First: 1
ParentMap:
MCR: New parent: <null>
-> void
MCR: Token: a, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> a
MCR: Token: (, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> (
MCR: Token: int, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> X
ParentLastToken: <null>
-> (
ParentMap:
<null> -> (
MCR: New parent: (
MacroCallLParen: (, OpenMacroParent: (
-> int
-> )
MCR: Token: *, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> *
MCR: Token: b, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> b
MCR: Token: ), Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> )
MCR: Token: {, Parent: <null>, First: 0
ParentMap:
MCR: New parent: <null>
-> {
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<truncated>Please see the issue for the entire body.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to