llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.21k stars 11.64k forks source link

[clang-format] `(*)` is not annotated as `FunctionTypeLParen` #109146

Open prj- opened 1 week ago

prj- commented 1 week ago

Works OK with version 19.1.0, but with Debian clang-format version 20.0.0 (++20240917111146+1e23a6142a82-1~exp1~20240917111312.2342), I get:

$ clang-format foobar.c
int main() {
  if (type == NON_UNIFORM)
    return (PetscErrorCode(*)(void *, void *, PetscInt,
                              ...))&PCTFS_rvec_non_uniform;
  return 0;
}
$ clang-format-20 foobar.c 
int main() {
  if (type == NON_UNIFORM)
    return (PetscErrorCode(*)(void *, void *, PetscInt, ...)) &
           PCTFS_rvec_non_uniform;
  return 0;
}

It was OK with 20240831100704%2B8aa8c0590c09-1~exp1~20240831220720.2307.

owenca commented 1 week ago

If you tell clang-format that PetscErrorCode is a type name, the left parenthsis in (*) is annotated as FunctionTypeLParen, and the output looks correct.

$ clang-format -version
clang-format version 20.0.0git (https://github.com/llvm/llvm-project bcd586b5abfc7c22a1c0eca3a7abf18e7a09518d)
$ clang-format -style='{TypeNames: [PetscErrorCode]}' -debug foobar.c
...
AnnotatedTokens(L=2, P=0, T=6, C=0):
 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=0 Name=return L=6 PPK=2 FakeLParens= FakeRParens=0 II=0x135018a18 Text='return'
 M=0 C=0 T=Unknown S=1 F=0 B=0 BK=0 P=23 Name=l_paren L=8 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
 M=0 C=1 T=TypeName S=0 F=0 B=0 BK=0 P=59 Name=identifier L=22 PPK=2 FakeLParens= FakeRParens=0 II=0x13500eef8 Text='PetscErrorCode'
 M=0 C=0 T=FunctionTypeLParen S=1 F=0 B=0 BK=0 P=43 Name=l_paren L=24 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='('
 M=0 C=1 T=PointerOrReference S=0 F=0 B=0 BK=0 P=250 Name=star L=25 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=74 Name=r_paren L=26 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=43 Name=l_paren L=27 PPK=0 FakeLParens= FakeRParens=0 II=0x0 Text='('
 M=0 C=1 T=Unknown S=0 F=0 B=0 BK=0 P=79 Name=void L=31 PPK=2 FakeLParens=1/ FakeRParens=0 II=0x135018c38 Text='void'
 M=0 C=1 T=PointerOrReference S=1 F=0 B=0 BK=0 P=250 Name=star L=33 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=74 Name=comma L=34 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=','
 M=0 C=1 T=Unknown S=1 F=0 B=0 BK=0 P=61 Name=void L=39 PPK=2 FakeLParens= FakeRParens=0 II=0x135018c38 Text='void'
 M=0 C=1 T=PointerOrReference S=1 F=0 B=0 BK=0 P=250 Name=star L=41 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='*'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=74 Name=comma L=42 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=','
 M=0 C=1 T=Unknown S=1 F=0 B=0 BK=0 P=61 Name=identifier L=51 PPK=2 FakeLParens= FakeRParens=0 II=0x13500ef98 Text='PetscInt'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=61 Name=comma L=52 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=','
 M=0 C=1 T=Unknown S=1 F=0 B=0 BK=0 P=61 Name=ellipsis L=56 PPK=2 FakeLParens= FakeRParens=1 II=0x0 Text='...'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=63 Name=r_paren L=57 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
 M=0 C=0 T=CastRParen S=0 F=0 B=0 BK=0 P=43 Name=r_paren L=58 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=')'
 M=0 C=0 T=UnaryOperator S=0 F=0 B=0 BK=0 P=120 Name=amp L=59 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text='&'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=80 Name=identifier L=81 PPK=2 FakeLParens= FakeRParens=0 II=0x13500efd8 Text='PCTFS_rvec_non_uniform'
 M=0 C=0 T=Unknown S=0 F=0 B=0 BK=0 P=23 Name=semi L=82 PPK=2 FakeLParens= FakeRParens=0 II=0x0 Text=';'
...
$ clang-format -style='{TypeNames: [PetscErrorCode]}' foobar.c | diff foobar.c -
3,4c3,4
<     return (PetscErrorCode(*)(void *, void *, PetscInt,
<                               ...))&PCTFS_rvec_non_uniform;
---
>     return (PetscErrorCode (*)(void *, void *, PetscInt,
>                                ...))&PCTFS_rvec_non_uniform;
$ 

Note that there should be a space between PetscErrorCode and (.

prj- commented 1 week ago

Thank you.