All new accounts created on Gitlab now require administrator approval. If you invite any collaborators, please let Flux staff know so they can approve the accounts.

Commit 2a9e1779 authored by Ben Pfaff's avatar Ben Pfaff

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: default avatarJoe Stringer <joestringer@nicira.com>
Signed-off-by: default avatarBen Pfaff <blp@nicira.com>
Acked-by: default avatarJoe Stringer <joestringer@nicira.com>
parent e9155f36
/*
* 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
......
/*
* 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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment