The following revision follows D80115 since @MyDeveloperDay and I apparently both had the same idea at the same time, for https://bugs.llvm.org/show_bug.cgi?id=45816 and my efforts on tooling support for AMDVLK, respectively.
This option aligns adjacent bitfield separators across lines, in a manner similar to AlignConsecutiveAssignments and friends.
Example:
struct RawFloat {
uint32_t sign : 1;
uint32_t exponent : 8;
uint32_t mantissa : 23;
};would become
struct RawFloat {
uint32_t sign : 1;
uint32_t exponent : 8;
uint32_t mantissa : 23;
};This also handles c++2a style bitfield-initializers with AlignConsecutiveAssignments.
struct RawFloat {
uint32_t sign : 1 = 0;
uint32_t exponent : 8 = 127;
uint32_t mantissa : 23 = 0;
}; // defaults to 1.0fThings this change does not do:
- Align multiple comma-chained bitfield variables. None of the other AlignConsecutive* options seem to implement that either.
- Detect bitfields that have a width specified with something other than a numeric literal (ie, int a : SOME_MACRO;). That'd be fairly difficult to parse and is rare.
clang-format: please reformat the code
- AlignTokens(Style, - [&](Change const &C) { - // Do not align on ':' that is first on a line. - if (C.NewlinesBefore > 0) - return false; - - // Do not align on ':' that is last on a line. - if (&C != &Changes.back() && (&C + 1)->NewlinesBefore > 0) - return false; -17 diff lines are omitted. See full diff.