]> granicus.if.org Git - clang/commitdiff
Some small improvements to the builtin (-ffreestanding) stdint.h; in
authorEli Friedman <eli.friedman@gmail.com>
Sat, 30 Apr 2011 19:02:59 +0000 (19:02 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 30 Apr 2011 19:02:59 +0000 (19:02 +0000)
particular, make sure to handle WCHAR_MIN correctly.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130618 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/stdint.h
test/Preprocessor/stdint.c

index ed3240abc9a8ff5f85e8b09fab7b76ef2c92849c..6f1a8761e1c8678cac6258589ce218cb183b508f 100644 (file)
@@ -609,11 +609,15 @@ typedef __UINTMAX_TYPE__ uintmax_t;
 # define UINT_FAST8_MAX  __UINT_LEAST8_MAX
 #endif /* __INT_LEAST8_MIN */
 
+/* Some utility macros */
+#define  __INTN_MIN(n)  __stdint_join3( INT, n, _MIN)
+#define  __INTN_MAX(n)  __stdint_join3( INT, n, _MAX)
+#define __UINTN_MAX(n)  __stdint_join3(UINT, n, _MAX)
+#define  __INTN_C(n, v) __stdint_join3( INT, n, _C(v))
+#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v))
+
 /* C99 7.18.2.4 Limits of integer types capable of holding object pointers. */
 /* C99 7.18.3 Limits of other integer types. */
-#define  __INTN_MIN(n) __stdint_join3( INT, n, _MIN)
-#define  __INTN_MAX(n) __stdint_join3( INT, n, _MAX)
-#define __UINTN_MAX(n) __stdint_join3(UINT, n, _MAX)
 
 #define  INTPTR_MIN  __INTN_MIN(__INTPTR_WIDTH__)
 #define  INTPTR_MAX  __INTN_MAX(__INTPTR_WIDTH__)
@@ -631,27 +635,25 @@ typedef __UINTMAX_TYPE__ uintmax_t;
 #define SIG_ATOMIC_MIN __INTN_MIN(__SIG_ATOMIC_WIDTH__)
 #define SIG_ATOMIC_MAX __INTN_MAX(__SIG_ATOMIC_WIDTH__)
 #ifdef __WINT_UNSIGNED__
-# define WINT_MIN       0
+# define WINT_MIN       __UINTN_C(__WINT_WIDTH__, 0)
 # define WINT_MAX       __UINTN_MAX(__WINT_WIDTH__)
 #else
 # define WINT_MIN       __INTN_MIN(__WINT_WIDTH__)
 # define WINT_MAX       __INTN_MAX(__WINT_WIDTH__)
 #endif
 
-/* FIXME: if we ever support a target with unsigned wchar_t, this should be
- * 0 .. Max.
- */
 #ifndef WCHAR_MAX
-#define WCHAR_MAX __INTN_MAX(__WCHAR_WIDTH__)
+# define WCHAR_MAX __WCHAR_MAX__
 #endif
 #ifndef WCHAR_MIN
-#define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__)
+# if __WCHAR_MAX__ == __INTN_MAX(__WCHAR_WIDTH__)
+#  define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__)
+# else
+#  define WCHAR_MIN __UINTN_C(__WCHAR_WIDTH__, 0)
+# endif
 #endif
 
 /* 7.18.4.2 Macros for greatest-width integer constants. */
-#define  __INTN_C(n, v) __stdint_join3( INT, n, _C(v))
-#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v))
-
 #define INTMAX_C(v)   __INTN_C(__INTMAX_WIDTH__, v)
 #define UINTMAX_C(v) __UINTN_C(__INTMAX_WIDTH__, v)
 
index 4821cf423f4ca63412ffd3f9408a4768c662aaca..ee8e3c28c37f7a984d1431e7ac339098849d7d6a 100644 (file)
 //
 // RUN: %clang_cc1 -E -ffreestanding -triple=x86_64-pc-linux-gnu %s | FileCheck -check-prefix X86_64_LINUX %s
 //
-// X86_64_LINUX:WINT_MIN_ 0
+// X86_64_LINUX:WINT_MIN_ 0U
 // X86_64_LINUX:WINT_MAX_ 4294967295U
 //
 //
+// RUN: %clang_cc1 -E -ffreestanding -triple=i386-mingw32 %s | FileCheck -check-prefix I386_MINGW32 %s
+//
+// I386_MINGW32:WCHAR_MAX_ 65535U
+// I386_MINGW32:WCHAR_MIN_ 0U
+//
+//
 // stdint.h forms several macro definitions by pasting together identifiers
 // to form names (eg. int32_t is formed from int ## 32 ## _t). The following 
 // case tests that these joining operations are performed correctly even if