c90-printf-2.c, [...]: Determine the type for intmax_t in the compiler using __typeof...
authorJoseph Myers <jsm28@cam.ac.uk>
Sun, 15 Oct 2000 20:30:17 +0000 (21:30 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Sun, 15 Oct 2000 20:30:17 +0000 (21:30 +0100)
* gcc.dg/c90-printf-2.c, gcc.dg/c90-scanf-2.c: Determine the type
for intmax_t in the compiler using __typeof__ and the type rules
for conditional expressions.

From-SVN: r36873

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c90-printf-2.c
gcc/testsuite/gcc.dg/c90-scanf-2.c

index 0000b080d334879745de005ce9e94786cc58a7dc..2e6782f9f81a11f91a3ac81f72baf5038a87edc9 100644 (file)
@@ -1,3 +1,9 @@
+2000-10-15  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * gcc.dg/c90-printf-2.c, gcc.dg/c90-scanf-2.c: Determine the type
+       for intmax_t in the compiler using __typeof__ and the type rules
+       for conditional expressions.
+
 2000-10-13  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.dg/20001012-1.c: New test.
index 4f2b9bfb02c750fcab39084faf332d6e24033864..1f8c544b34ba53359612cf90471386ab81ac24b5 100644 (file)
@@ -13,14 +13,23 @@ __extension__ typedef long long int llong;
 /* This next definition is a kludge.  When GCC has a <stdint.h> it
    should be used.
 */
-#include <limits.h>
-#if INT_MAX == __LONG_LONG_MAX__
-typedef int intmax_t;
-#elif LONG_MAX == __LONG_LONG_MAX__
-typedef long intmax_t;
-#else
-__extension__ typedef long long intmax_t;
-#endif
+/* (T *) if E is zero, (void *) otherwise.  */
+#define type_if_not(T, E) __typeof__(0 ? (T *)0 : (void *)(E))
+
+/* (T *) if E is nonzero, (void *) otherwise.  */
+#define type_if(T, E) type_if_not(T, !(E))
+
+/* Combine pointer types, all but one (void *).  */
+#define type_comb2(T1, T2) __typeof__(0 ? (T1)0 : (T2)0)
+#define type_comb3(T1, T2, T3) type_comb2(T1, type_comb2(T2, T3))
+
+#define maybe_int_ptr type_if(int, sizeof(int) == sizeof(llong))
+#define maybe_long_ptr type_if(long, sizeof(long) == sizeof(llong) && sizeof(long) > sizeof(int))
+#define maybe_long_long_ptr type_if(llong, sizeof(llong) > sizeof(long))
+
+#define intmax_type_ptr type_comb3(maybe_int_ptr, maybe_long_ptr, maybe_long_long_ptr)
+
+typedef __typeof__(*((intmax_type_ptr)0)) intmax_t;
 
 extern int printf (const char *, ...);
 
index a7d2ab32a99d92fa77703bb6ad40bed0025fb0e2..786acdde3790c2a762c5c839dde4a455d62078b9 100644 (file)
@@ -13,14 +13,23 @@ __extension__ typedef long long int llong;
 /* This next definition is a kludge.  When GCC has a <stdint.h> it
    should be used.
 */
-#include <limits.h>
-#if INT_MAX == __LONG_LONG_MAX__
-typedef int intmax_t;
-#elif LONG_MAX == __LONG_LONG_MAX__
-typedef long intmax_t;
-#else
-__extension__ typedef long long intmax_t;
-#endif
+/* (T *) if E is zero, (void *) otherwise.  */
+#define type_if_not(T, E) __typeof__(0 ? (T *)0 : (void *)(E))
+
+/* (T *) if E is nonzero, (void *) otherwise.  */
+#define type_if(T, E) type_if_not(T, !(E))
+
+/* Combine pointer types, all but one (void *).  */
+#define type_comb2(T1, T2) __typeof__(0 ? (T1)0 : (T2)0)
+#define type_comb3(T1, T2, T3) type_comb2(T1, type_comb2(T2, T3))
+
+#define maybe_int_ptr type_if(int, sizeof(int) == sizeof(llong))
+#define maybe_long_ptr type_if(long, sizeof(long) == sizeof(llong) && sizeof(long) > sizeof(int))
+#define maybe_long_long_ptr type_if(llong, sizeof(llong) > sizeof(long))
+
+#define intmax_type_ptr type_comb3(maybe_int_ptr, maybe_long_ptr, maybe_long_long_ptr)
+
+typedef __typeof__(*((intmax_type_ptr)0)) intmax_t;
 
 extern int scanf (const char *, ...);