From: Ben Pfaff Date: Fri, 31 Jul 2015 00:44:26 +0000 (-0700) Subject: type-props: Suppress warnings in newer Clang and GCC. X-Git-Tag: v2.4.0~11 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=2a9e1779535bc8f3e915a50bfba0c2dec8b11b3b type-props: Suppress warnings in newer Clang and GCC. 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 Signed-off-by: Ben Pfaff Acked-by: Joe Stringer --- diff --git a/lib/type-props.h b/lib/type-props.h index 3c908a736..e5f4fdcb7 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 +/* 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 3f2472545..3c351ebae 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);