On Tuesday, June 7th, 2022 at 10:46 PM, Jonathan Wakely <jwakely....@gmail.com> wrote: > On Tue, 7 Jun 2022 at 20:44, Jonathan Wakely wrote: > > > On Tue, 7 Jun 2022 at 20:40, Miika via Gcc gcc@gcc.gnu.org wrote: > > > > > On Monday, June 6th, 2022 at 9:42 PM, Ben Boeckel ben.boec...@kitware.com > > > wrote: > > > > > > > > Based on Jakub's and Yair's comments I created a new attribute > > > > > "inrange". > > > > > Inrage takes three arguments, pos min and max. > > > > > Pos being the argument position in the function, and min and max > > > > > defines the > > > > > range of valid integer. Both min and max are inclusive and work with > > > > > enums. > > > > > Warnings are enabled with the new flag: "-Winrange". > > > > > > > > Is this something that could be applied to variables or types (I've not > > > > much experience with GCC attribute internal mechanisms, so maybe not)? > > > > > > I took a closer look at it and looks like it can be applied. > > > > > > So trying to compile this: > > > `typedef int __attribute__((inrange(0, 100))) percentage_t; int main() { > > > int percentage __attribute__((inrange(0, 100))) = -1; percentage_t per > > > __attribute__((inrange(0, 100))) = -1; }` > > > > > > Would print out something like this: > > > > > > foo.c: In function 'main': > > > foo.c:3:59: warning: inrange variable 'percentage' requires integer in > > > rage of 0..100 [-Winrange] > > > > N.B. "rage" should be "range". > > > > From the diagnostic it's not clear to me whether this is an inclusive > > range. Is 0 allowed? Is 100 allowed? > > > > Using [0,100] interval notation would imply both endpoints are valid, > > which I think matches the semantics of your attribute. Is interval > > notation sufficiently widely understood to use here? > > > Oh, Wikipedia tells me that 0..100 already means that, as an integer interval: > https://en.wikipedia.org/wiki/Interval_(mathematics)#Integer_intervals > > So maybe it's fine as-is (except for the "rage" typo).
Thanks for noticing the typo. I probably need more sleep. And I'm open to any suggestions about the diagnostic message since I'm not sure what's the best way to explain the error to the user.