[cfe-dev] clang-format version incompatibility

Sam McCall via cfe-dev cfe-dev at lists.llvm.org
Wed Oct 14 15:21:25 PDT 2020


On Wed, Oct 14, 2020 at 10:17 PM Renato Golin via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> Hi folks,
>
> A recent issue [1] on our Github project has highlighted a problem we've
> been having with clang-format.
>
> Basically, when using different versions of clang-format, with the same
> configuration files [2], we get different results (between 9 and 10).
>
AFAIK this is in principle expected, clang-format doesn't place a high
prioriy on having stable formatting results across major versions.
This is a tradeoff, requiring formatting to stay stable implies not fixing
bugs.

In some workflows you can mitigate this by formatting/checking changed
lines, which at least reduces the surface area.
But this is certainly a pain point if you want to enforce style with CI in
a diverse environment.
At work, we enforce the same version of clang-format on all clients and CI.
In a JS-based package I work on, we use the clang-format npm package
<https://www.npmjs.com/package/clang-format> to pin the version.

BTW, someone recently added a clang-format flag to ignore unknown keys in
the config file, which will help in the distant future (when clangd-12 is
the *minimum* version it's safe to assume...)

https://github.com/microsoft/verona/blob/master/src/mlir/dialect/Typechecker.cc#L79
>
> clang-format-9:
>     Rule(F f)
>       ->Rule<
>         typename rule_traits<decltype(&F::operator())>::Left,
>         typename rule_traits<decltype(&F::operator())>::Right,
>         F>;
>
> clang-format-10:
>     Rule(F f) -> Rule<
>       typename rule_traits<decltype(&F::operator())>::Left,
>       typename rule_traits<decltype(&F::operator())>::Right,
>       F>;
>
This looks like a bugfix to me. I think deduction guides were basically
unsupported and broken in 9.
If I'm right about that, there's certainly no option to restore the old
broken behavior.


>
>
> https://github.com/microsoft/verona/blob/master/src/mlir/dialect/VeronaTypes.cc#L487
>
> clang-format-9:
>       return {MeetType::get(ctx, readElements),
>               JoinType::get(ctx, writeElements)};
>
> clang-format-10:
>       return {
>         MeetType::get(ctx, readElements), JoinType::get(ctx,
> writeElements)};
>
Less clear to me what's going on here, but I also suspect a bugfix.
The docs say "Fundamentally, C++11 braced lists are formatted exactly like
function calls would be formatted in their place.".
The clang-format-10 formatting is equivalent to how both clang-format-9 and
10 format `return x(MeetType::get(...), JoinType::get(...));`.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20201015/47142c0b/attachment.html>


More information about the cfe-dev mailing list