steveire added a comment. In D69764#2056104 <https://reviews.llvm.org/D69764#2056104>, @rsmith wrote:
> I'm uncomfortable about `clang-format` performing this transformation at all. > Generally, clang-format only makes changes that are guaranteed to preserve > the meaning of the source program, and does not make changes that are only > heuristically likely to be semantics-preserving. But this transformation is > not behavior-preserving in a variety of cases, such as: > > #define INTPTR int * > const INTPTR a; > // INTPTR const a; means something else > At least in my case, our codebase doesn't have code like that. I wonder how common it is. > I also don't think this is something that a user would *want* in > `clang-format`: changing the location of `const`s is something that would > likely be done rarely (probably only once) when migrating to a different > coding style, rather than being done on the fly after each edit to a source > file. I don't think this is true. All of the arguments in favor of `clang-format` existing apply here. - Developers get it wrong. They put the `{` or the `*` in the "wrong" place according to the style guide, and they put the `const` in the "wrong" place according to the style guide. - `clang-format` is much faster than `clang-tidy` and it is reasonable to have text editors run it on every "Save" and on all files in a repo on every git commit etc. - The above means that the cost of developers getting it wrong is minimized or eliminated - The above means that developers don't have to pay attention to `*` placement or `const` placement while writing code, but can (in theory at least) focus on what they're trying to convey. - It seems that more tools understand `clang-format` than `clang-tidy` (eg text editors with support for it) > Fundamentally, I don't think this transformation is simply reformatting, and > I don't think it can be done sufficiently-correctly with only a > largely-context-free, heuristic-driven C++ parser. I agree that this is a less simple transformation than existing `clang-format` functionality. I can't evaluate whether your macro example (or other examples you could come up with) mean that it can't be done sufficiently-correctly, but I doubt I would come to the same conclusion. I would probably base that on whether I could find real-world code which it breaks, and how common the breaking-patterns (the macro in your example) actually are in other code. > As such, I think this belongs in `clang-tidy`, not in `clang-format`. Given the speed difference and the developer convenience, I think this would be very unfortunate. I've already tried to write this conversion as a `clang-tidy` check. However, my implementation has far more bugs than this `clang-format` implementation, and it does not handle as many cases. You can see that many `clang-tidy` checks exclude types of code such as "all templates" from transformation to dampen the complexity of the check implementation. Besides, a clang-tidy implementation would run into the same problem with your macro example, wouldn't it? Often the solution to that kind of problem in `clang-tidy` checks is to simply not transform code in macros. Would an option in clang-format to not transform around macro code be an more acceptable solution? CHANGES SINCE LAST ACTION https://reviews.llvm.org/D69764/new/ https://reviews.llvm.org/D69764 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits