diff options
author | Ken Dyck <ken.dyck@onsemi.com> | 2009-11-20 16:37:35 +0000 |
---|---|---|
committer | Ken Dyck <ken.dyck@onsemi.com> | 2009-11-20 16:37:35 +0000 |
commit | aface1b7e0013b3054991c9d54c82d6c890ee554 (patch) | |
tree | 75bb613928ee26ff9f918ca346bcefd28522e448 | |
parent | ff80fabfa42d4aadbbaab4d61fa518d80b5a981a (diff) |
Avoid unwanted macro expansion in macros that paste together int<n>_t and
uint<n>_t definitions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89459 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Headers/stdint.h | 11 | ||||
-rw-r--r-- | test/Preprocessor/stdint.c | 29 |
2 files changed, 36 insertions, 4 deletions
diff --git a/lib/Headers/stdint.h b/lib/Headers/stdint.h index e49b25c287..61afe0d45d 100644 --- a/lib/Headers/stdint.h +++ b/lib/Headers/stdint.h @@ -216,16 +216,19 @@ typedef __uint_least8_t uint_fast8_t; #define __stdint_join3(a,b,c) a ## b ## c #define __stdint_exjoin3(a,b,c) __stdint_join3(a,b,c) +#define __intn_t(n) __stdint_join3( int, n, _t) +#define __uintn_t(n) __stdint_join3(uint, n, _t) + #ifndef __intptr_t_defined -typedef __stdint_exjoin3( int, __INTPTR_WIDTH__, _t) intptr_t; +typedef __intn_t(__INTPTR_WIDTH__) intptr_t; #define __intptr_t_defined #endif -typedef __stdint_exjoin3(uint, __INTPTR_WIDTH__, _t) uintptr_t; +typedef __uintn_t(__INTPTR_WIDTH__) uintptr_t; /* C99 7.18.1.5 Greatest-width integer types. */ -typedef __stdint_exjoin3( int, __INTMAX_WIDTH__, _t) intmax_t; -typedef __stdint_exjoin3(uint, __INTMAX_WIDTH__, _t) uintmax_t; +typedef __intn_t(__INTMAX_WIDTH__) intmax_t; +typedef __uintn_t(__INTMAX_WIDTH__) uintmax_t; /* C99 7.18.4 Macros for minimum-width integer constants. * diff --git a/test/Preprocessor/stdint.c b/test/Preprocessor/stdint.c index ed8e9a0624..3c5fc76c20 100644 --- a/test/Preprocessor/stdint.c +++ b/test/Preprocessor/stdint.c @@ -1158,6 +1158,35 @@ // X86_64:INTMAX_C_(0) 0L // X86_64:UINTMAX_C_(0) 0UL // +// +// 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 +// the identifiers used in the operations (int, uint, _t, INT, UINT, _MIN, +// _MAX, and _C(v)) are themselves macros. +// +// RUN: clang-cc -E -ffreestanding -Dint=a -Duint=b -D_t=c -DINT=d -DUINT=e -D_MIN=f -D_MAX=g '-D_C(v)=h' -triple=i386-none-none %s | FileCheck -check-prefix JOIN %s +// JOIN:typedef int32_t intptr_t; +// JOIN:typedef uint32_t uintptr_t; +// JOIN:typedef int64_t intmax_t; +// JOIN:typedef uint64_t uintmax_t; +// TODO:INTPTR_MIN_ (-2147483647 -1) +// TODO:INTPTR_MAX_ 2147483647 +// TODO:UINTPTR_MAX_ 4294967295U +// TODO:PTRDIFF_MIN_ (-2147483647 -1) +// TODO:PTRDIFF_MAX_ 2147483647 +// TODO:SIZE_MAX_ 4294967295U +// TODO:INTMAX_MIN_ (-9223372036854775807LL -1) +// TODO:INTMAX_MAX_ 9223372036854775807LL +// TODO:UINTMAX_MAX_ 18446744073709551615ULL +// TODO:SIG_ATOMIC_MIN_ (-2147483647 -1) +// TODO:SIG_ATOMIC_MAX_ 2147483647 +// TODO:WINT_MIN_ (-2147483647 -1) +// TODO:WINT_MAX_ 2147483647 +// TODO:WCHAR_MAX_ 2147483647 +// TODO:WCHAR_MIN_ (-2147483647 -1) +// TODO:INTMAX_C_(0) 0LL +// TODO:UINTMAX_C_(0) 0ULL #include <stdint.h> |