On Wednesday, 16 February 2022 at 19:35:00 UTC, jmh530 wrote:
[snip]
Step 1: In the integral overloads, use allSatisfy!(isSigned, B,
E) || allSatisfy!(isUnsigned, T, U) for the current behavior
Step 2: When !(allSatisfy!(isSigned, B, E) ||
allSatisfy!(isUnsigned, T, U)), then convert to narrowest
common type as I mentioned (long in your case).
This would preserve the current size when the types are both
either signed or unsigned and then would expand it only when
there are different signed-ness. This also makes the behavior
change at compile-time instead of throwing at runtime.
T/U should be B/E