From: Ben Pfaff <b...@nicira.com> Until now, Clang 3.7+ and sufficiently new versions of GCC complained about TYPE_MAXIMUM(int), etc., because it shifts a negative value. This commit fixes the problem.
This commit also gives these macros sensible definitions for _Bool, and documents all of them. Reported-by: Joe Stringer <joestrin...@nicira.com> Signed-off-by: Ben Pfaff <b...@nicira.com> Acked-by: Joe Stringer <joestrin...@nicira.com> Signed-off-by: Jarno Rajahalme <ja...@ovn.org> --- lib/type-props.h | 32 ++++++++++++++++++++++++-------- tests/test-type-props.c | 6 +++++- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/type-props.h b/lib/type-props.h index 3c908a7..e5f4fdc 100644 --- a/lib/type-props.h +++ b/lib/type-props.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011 Nicira, Inc. + * Copyright (c) 2008, 2011, 2015 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,15 +19,31 @@ #include <limits.h> +/* True if TYPE is _Bool, false otherwise. */ +#define TYPE_IS_BOOL(TYPE) ((TYPE) 1 == (TYPE) 2) + +/* True if TYPE is an integer type (including _Bool), false if it is a + * floating-point type. */ #define TYPE_IS_INTEGER(TYPE) ((TYPE) 1.5 == (TYPE) 1) + +/* True if TYPE is a signed integer or floating point type, otherwise false. */ #define TYPE_IS_SIGNED(TYPE) ((TYPE) 1 > (TYPE) -1) -#define TYPE_VALUE_BITS(TYPE) (sizeof(TYPE) * CHAR_BIT - TYPE_IS_SIGNED(TYPE)) -#define TYPE_MINIMUM(TYPE) (TYPE_IS_SIGNED(TYPE) \ - ? ~(TYPE)0 << (sizeof(TYPE) * 8 - 1) \ - : 0) -#define TYPE_MAXIMUM(TYPE) (TYPE_IS_SIGNED(TYPE) \ - ? ~(~(TYPE)0 << (sizeof(TYPE) * 8 - 1)) \ - : (TYPE)-1) + +/* The number of value bits in an signed or unsigned integer TYPE: + * + * - _Bool has 1 value bit. + * + * - An N-bit unsigned integer type has N value bits. + * + * - An N-bit signed integer type has N-1 value bits. + */ +#define TYPE_VALUE_BITS(TYPE) \ + (TYPE_IS_BOOL(TYPE) ? 1 : sizeof(TYPE) * CHAR_BIT - TYPE_IS_SIGNED(TYPE)) + +/* The minimum or maximum value of a signed or unsigned integer TYPE. */ +#define TYPE_MINIMUM(TYPE) (TYPE_IS_SIGNED(TYPE) ? -TYPE_MAXIMUM(TYPE) - 1 : 0) +#define TYPE_MAXIMUM(TYPE) \ + ((((TYPE)1 << (TYPE_VALUE_BITS(TYPE) - 1)) - 1) * 2 + 1) /* Number of decimal digits required to format an integer of the given TYPE. * Includes space for a sign, if TYPE is signed, but not for a null diff --git a/tests/test-type-props.c b/tests/test-type-props.c index 3f24725..3c351eb 100644 --- a/tests/test-type-props.c +++ b/tests/test-type-props.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2011 Nicira, Inc. + * Copyright (c) 2008, 2009, 2011, 2015 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,6 +44,10 @@ main (void) char max_s[128]; char min_s[128]; +#ifndef __CHECKER__ /* sparse hates sizeof(bool). */ + TEST_TYPE(_Bool, 0, 1, 0); +#endif + TEST_TYPE(char, CHAR_MIN, CHAR_MAX, (CHAR_MIN < 0)); TEST_TYPE(signed char, SCHAR_MIN, SCHAR_MAX, 1); -- 2.1.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev