Issue 52929
Summary clang-format is not idempotent - rerunning clang-format produces different answers
Labels new issue
Assignees
Reporter JohnC32
    Rerunning clang-format 13 (and at least the last few prior versions) on already formatted code gives a different answer. Given

```c++
// <snip>

#define EML_CLONE_EXPRS(X)                      \
    X(ASSIGN)                                   \
    X(VIRTUAL_ASSIGN)                           \
    X(STRUCT_VALUE)                             \
    X(ADD) X(MINUS) X(MUL) X(DIV)               \
    X(LT) X(LE) X(GT) X(GE) X(EQ) X(NE)         \
    X(CAND) X(COR) X(NOT)                       \
    X(UMINUS)                                   \
    X(UPLUS)                                    \
    X(CALL)                                     \
    X(CHECK)                                    \
    X(VECTOR)                                   \
    X(MMUL) X(MDIV) X(MIDIV) X(MPOWER)          \
    X(IDIV) X(POWER)                            \
    X(AND) X(OR)                                \
    X(CTRANSPOSE) X(TRANSPOSE)                  \
    X(VCAT) X(HCAT)                             \
    X(VAR) X(CONST) X(DEREF)                    \
    X(SUB) X(SUB_REF)                           \
    X(FIELD) X(FIELD_REF) X(FIELDCOMP)          \
    X(EMPTY_MATRIX)                             \
    X(ALL) X(ANY)                               \
    X(END) X(SPAN)                              \
    X(CELL_ARRAY)                               \
    X(CELL_EMPTY)                               \
    X(CELL_HCAT)                                \
    X(CELL_VCAT)                                \
    X(CELL_VAL)                                 \
    X(CELL_REF)                                 \
    X(CELL_TO_MATRIX)                           \
    X(MATRIX)                                   \
    X(AT)

// <snip>
```

```bash
clang-format -i test.cpp > test1.cpp
clang-format -i test1.cpp > test2.cpp
clang-format -i test2.cpp > test3.cpp
.....
```
Then if you ```diff test1.cpp test2.cpp``` and ```diff test2.cpp test3.cpp``` you will see differences. 

Here's the first clang-format result, test1.cpp:

```c++
// <snip>

#define EML_CLONE_EXPRS(X)                                                    \
    X(ASSIGN)                                                                 \
    X(VIRTUAL_ASSIGN)                                                         \
    X(STRUCT_VALUE)                                                           \
    X(ADD)                                                                    \
    X(MINUS) X(MUL) X(DIV) X(LT) X(LE) X(GT) X(GE) X(EQ) X(NE) X(CAND) X(COR) \
        X(NOT) X(UMINUS) X(UPLUS) X(CALL) X(CHECK) X(VECTOR) X(MMUL) X(MDIV)  \
            X(MIDIV) X(MPOWER) X(IDIV) X(POWER) X(AND) X(OR) X(CTRANSPOSE)    \
                X(TRANSPOSE) X(VCAT) X(HCAT) X(VAR) X(CONST) X(DEREF) X(SUB)  \
                    X(SUB_REF) X(FIELD) X(FIELD_REF) X(FIELDCOMP)             \
                        X(EMPTY_MATRIX) X(ALL) X(ANY) X(END) X(SPAN)          \
                            X(CELL_ARRAY) X(CELL_EMPTY) X(CELL_HCAT)          \
                                X(CELL_VCAT) X(CELL_VAL) X(CELL_REF)          \
                                    X(CELL_TO_MATRIX) X(MATRIX) X(AT)

// <snip>
```

Here's the second clang-format result, test2.cpp:

```c++
// <snip>

#define EML_CLONE_EXPRS(X)                                                     \
    X(ASSIGN)                                                                  \
    X(VIRTUAL_ASSIGN)                                                          \
    X(STRUCT_VALUE)                                                            \
    X(ADD)                                                                     \
    X(MINUS)                                                                   \
    X(MUL) X(DIV) X(LT) X(LE) X(GT) X(GE) X(EQ) X(NE) X(CAND) X(COR) X(NOT)    \
        X(UMINUS) X(UPLUS) X(CALL) X(CHECK) X(VECTOR) X(MMUL) X(MDIV) X(MIDIV) \
            X(MPOWER) X(IDIV) X(POWER) X(AND) X(OR) X(CTRANSPOSE) X(TRANSPOSE) \
                X(VCAT) X(HCAT) X(VAR) X(CONST) X(DEREF) X(SUB) X(SUB_REF)     \
                    X(FIELD) X(FIELD_REF) X(FIELDCOMP) X(EMPTY_MATRIX) X(ALL)  \
                        X(ANY) X(END) X(SPAN) X(CELL_ARRAY) X(CELL_EMPTY)      \
                            X(CELL_HCAT) X(CELL_VCAT) X(CELL_VAL) X(CELL_REF)  \
                                X(CELL_TO_MATRIX) X(MATRIX) X(AT)

// <snip>
```

Here's the thrid clang-format result, test3.cpp:

```c++
// <snip>

#define EML_CLONE_EXPRS(X)                                                     \
    X(ASSIGN)                                                                  \
    X(VIRTUAL_ASSIGN)                                                          \
    X(STRUCT_VALUE)                                                            \
    X(ADD)                                                                     \
    X(MINUS)                                                                   \
    X(MUL)                                                                     \
    X(DIV) X(LT) X(LE) X(GT) X(GE) X(EQ) X(NE) X(CAND) X(COR) X(NOT) X(UMINUS) \
        X(UPLUS) X(CALL) X(CHECK) X(VECTOR) X(MMUL) X(MDIV) X(MIDIV) X(MPOWER) \
            X(IDIV) X(POWER) X(AND) X(OR) X(CTRANSPOSE) X(TRANSPOSE) X(VCAT)   \
                X(HCAT) X(VAR) X(CONST) X(DEREF) X(SUB) X(SUB_REF) X(FIELD)    \
                    X(FIELD_REF) X(FIELDCOMP) X(EMPTY_MATRIX) X(ALL) X(ANY)    \
                        X(END) X(SPAN) X(CELL_ARRAY) X(CELL_EMPTY)             \
                            X(CELL_HCAT) X(CELL_VCAT) X(CELL_VAL) X(CELL_REF)  \
                                X(CELL_TO_MATRIX) X(MATRIX) X(AT)

// <snip>
```

Here the _clang-format file used:

```yaml
---
BasedOnStyle: Google
IndentWidth: 4
...
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to