Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/gcc.dg/range.h @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/gcc.dg/range.h Thu Oct 25 07:37:49 2018 +0900 @@ -0,0 +1,57 @@ +#ifndef RANGE_H + +/* Definitions of helper functions and macros to create expressions + in a specified range. Not all the symbols declared here are + defined. */ + +#define SIZE_MAX __SIZE_MAX__ +#define DIFF_MAX __PTRDIFF_MAX__ +#define DIFF_MIN (-DIFF_MAX - 1) + +typedef __INT32_TYPE__ int32_t; +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __SIZE_TYPE__ size_t; + +static inline ptrdiff_t signed_value (void) +{ + extern volatile ptrdiff_t signed_value_source; + return signed_value_source; +} + +static inline size_t unsigned_value (void) +{ + extern volatile size_t unsigned_value_source; + return unsigned_value_source; +} + +static inline ptrdiff_t signed_range (ptrdiff_t min, ptrdiff_t max) +{ + ptrdiff_t val = signed_value (); + return val < min || max < val ? min : val; +} + +static inline ptrdiff_t signed_anti_range (ptrdiff_t min, ptrdiff_t max) +{ + ptrdiff_t val = signed_value (); + return min <= val && val <= max ? min == DIFF_MIN ? max + 1 : min - 1 : val; +} + +static inline size_t unsigned_range (size_t min, size_t max) +{ + size_t val = unsigned_value (); + return val < min || max < val ? min : val; +} + +static inline size_t unsigned_anti_range (size_t min, size_t max) +{ + size_t val = unsigned_value (); + return min <= val && val <= max ? min == 0 ? max + 1 : min - 1 : val; +} + +#define SR(min, max) signed_range ((min), (max)) +#define UR(min, max) unsigned_range ((min), (max)) + +#define SAR(min, max) signed_anti_range ((min), (max)) +#define UAR(min, max) unsigned_anti_range ((min), (max)) + +#endif /* RANGE_H */