c-common.c (c_stddef_cpp_builtins): Define __INTMAX_TYPE__ and __UINTMAX_TYPE__.
authorJoseph Myers <jsm@polyomino.org.uk>
Thu, 5 Aug 2004 00:38:31 +0000 (01:38 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Thu, 5 Aug 2004 00:38:31 +0000 (01:38 +0100)
* c-common.c (c_stddef_cpp_builtins): Define __INTMAX_TYPE__ and
__UINTMAX_TYPE__.
* c-cppbuiltin.c (builtin_define_stdint_macros): New.  Define
__INTMAX_MAX__.
(c_cpp_builtins): Call it.
* doc/cpp.texi: Update.

testsuite:
* gcc.c-torture/execute/builtins/abs-2.c,
gcc.c-torture/execute/builtins/abs-3.c,
gcc.c-torture/execute/builtins/lib/abs.c, gcc.dg/format/format.h,
gcc.dg/torture/builtin-attr-1.c: Use predefined macros for
intmax_t, uintmax_t and their limits.
* gcc.dg/intmax_t-1.c: New test.

From-SVN: r85588

gcc/ChangeLog
gcc/c-common.c
gcc/c-cppbuiltin.c
gcc/doc/cpp.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/builtins/abs-2.c
gcc/testsuite/gcc.c-torture/execute/builtins/abs-3.c
gcc/testsuite/gcc.c-torture/execute/builtins/lib/abs.c
gcc/testsuite/gcc.dg/format/format.h
gcc/testsuite/gcc.dg/intmax_t-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/builtin-attr-1.c

index e480dd1e095fb6c246bab9307545adba15970cd2..761abf8218bffe0f432de9de731877255062d0d5 100644 (file)
@@ -1,3 +1,12 @@
+2004-08-05  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * c-common.c (c_stddef_cpp_builtins): Define __INTMAX_TYPE__ and
+       __UINTMAX_TYPE__.
+       * c-cppbuiltin.c (builtin_define_stdint_macros): New.  Define
+       __INTMAX_MAX__.
+       (c_cpp_builtins): Call it.
+       * doc/cpp.texi: Update.
+
 2004-08-04  David Edelsohn  <edelsohn@gnu.org>
 
        * config/rs6000/rs6000.c (rs6000_rtx_costs): LABEL_REFs are zero
index 30d96e6223ba2f5f155eca08a68e4af6e6f05d24..b0f23a2c1a3f4679e531e58d9bd7715695758580 100644 (file)
@@ -3883,6 +3883,8 @@ c_stddef_cpp_builtins(void)
   builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
   builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
   builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
+  builtin_define_with_value ("__INTMAX_TYPE__", INTMAX_TYPE, 0);
+  builtin_define_with_value ("__UINTMAX_TYPE__", UINTMAX_TYPE, 0);
 }
 
 static void
index 441a38e3b8c1f58d656eb4b4d96e91f749e83db4..f6a1805f0b8425f3f0b80e5292bc863495b205b6 100644 (file)
@@ -54,6 +54,7 @@ static void builtin_define_with_int_value (const char *, HOST_WIDE_INT);
 static void builtin_define_with_hex_fp_value (const char *, tree,
                                              int, const char *,
                                              const char *);
+static void builtin_define_stdint_macros (void);
 static void builtin_define_type_max (const char *, tree, int);
 static void builtin_define_type_precision (const char *, tree);
 static void builtin_define_float_constants (const char *, const char *,
@@ -293,6 +294,23 @@ define__GNUC__ (void)
     abort ();
 }
 
+/* Define macros used by <stdint.h>.  Currently only defines limits
+   for intmax_t, used by the testsuite.  */
+static void
+builtin_define_stdint_macros (void)
+{
+  int intmax_long;
+  if (intmax_type_node == long_long_integer_type_node)
+    intmax_long = 2;
+  else if (intmax_type_node == long_integer_type_node)
+    intmax_long = 1;
+  else if (intmax_type_node == integer_type_node)
+    intmax_long = 0;
+  else
+    abort ();
+  builtin_define_type_max ("__INTMAX_MAX__", intmax_type_node, intmax_long);
+}
+
 /* Hook that registers front end and target-specific built-ins.  */
 void
 c_cpp_builtins (cpp_reader *pfile)
@@ -354,6 +372,9 @@ c_cpp_builtins (cpp_reader *pfile)
 
   builtin_define_type_precision ("__CHAR_BIT__", char_type_node);
 
+  /* stdint.h (eventually) and the testsuite need to know these.  */
+  builtin_define_stdint_macros ();
+
   /* float.h needs to know these.  */
 
   builtin_define_with_int_value ("__FLT_EVAL_METHOD__",
index 631992d517309e9fd80ff3578b4b2e090c44baaa..c047c570f71b09da38e7fb78ab6f2fc153c04f35 100644 (file)
@@ -2053,8 +2053,11 @@ OSF/rose @option{-mno-underscores} option).
 @itemx __PTRDIFF_TYPE__
 @itemx __WCHAR_TYPE__
 @itemx __WINT_TYPE__
+@itemx __INTMAX_TYPE__
+@itemx __UINTMAX_TYPE__
 These macros are defined to the correct underlying types for the
-@code{size_t}, @code{ptrdiff_t}, @code{wchar_t}, and @code{wint_t}
+@code{size_t}, @code{ptrdiff_t}, @code{wchar_t}, @code{wint_t},
+@code{intmax_t}, and @code{uintmax_t}
 typedefs, respectively.  They exist to make the standard header files
 @file{stddef.h} and @file{wchar.h} work correctly.  You should not use
 these macros directly; instead, include the appropriate headers and use
@@ -2072,9 +2075,11 @@ this macro directly; instead, include the appropriate headers.
 @itemx __INT_MAX__
 @itemx __LONG_MAX__
 @itemx __LONG_LONG_MAX__
+@itemx __INTMAX_MAX__
 Defined to the maximum value of the @code{signed char}, @code{wchar_t},
 @code{signed short},
-@code{signed int}, @code{signed long}, and @code{signed long long} types
+@code{signed int}, @code{signed long}, @code{signed long long}, and
+@code{intmax_t} types
 respectively.  They exist to make the standard header given numerical limits
 work correctly.  You should not use these macros directly; instead, include
 the appropriate headers.
index 788e6955d6e04a38ac1b844a1c18ba60be6348bf..c42117a238a4f3da210f156cbd8a38933a28a04a 100644 (file)
@@ -1,3 +1,12 @@
+2004-08-05  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * gcc.c-torture/execute/builtins/abs-2.c,
+       gcc.c-torture/execute/builtins/abs-3.c,
+       gcc.c-torture/execute/builtins/lib/abs.c, gcc.dg/format/format.h,
+       gcc.dg/torture/builtin-attr-1.c: Use predefined macros for
+       intmax_t, uintmax_t and their limits.
+       * gcc.dg/intmax_t-1.c: New test.
+
 2004-08-04  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
 
        * g++.dg/tc1/dr147.C: Add reference to PR.
index 025488d7dd875a4280ab03005a60744ba77e2294..c13c4556eca8e35fb2e38ed76c70836801f72cd8 100644 (file)
@@ -1,20 +1,9 @@
 /* Test for builtin abs, labs, llabs, imaxabs.  */
 /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
 
-/* These next definitions are kludges.  When GCC has a <stdint.h> it
-   should be used.
-*/
 #include <limits.h>
-#if INT_MAX == __LONG_LONG_MAX__
-typedef int intmax_t;
-#define INTMAX_MAX INT_MAX
-#elif LONG_MAX == __LONG_LONG_MAX__
-typedef long intmax_t;
-#define INTMAX_MAX LONG_MAX
-#else
-typedef long long intmax_t;
-#define INTMAX_MAX __LONG_LONG_MAX__
-#endif
+typedef __INTMAX_TYPE__ intmax_t;
+#define INTMAX_MAX __INTMAX_MAX__
 
 extern int abs (int);
 extern long labs (long);
index 8300a48a64a9f1d43fb1d48dff66f75e820abae6..cb0d89eb0eff86937501b3ee592e4d34d522bfc6 100644 (file)
@@ -1,20 +1,9 @@
 /* Test for builtin abs, labs, llabs, imaxabs.  Test for __builtin versions. */
 /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
 
-/* These next definitions are kludges.  When GCC has a <stdint.h> it
-   should be used.
-*/
 #include <limits.h>
-#if INT_MAX == __LONG_LONG_MAX__
-typedef int intmax_t;
-#define INTMAX_MAX INT_MAX
-#elif LONG_MAX == __LONG_LONG_MAX__
-typedef long intmax_t;
-#define INTMAX_MAX LONG_MAX
-#else
-typedef long long intmax_t;
-#define INTMAX_MAX __LONG_LONG_MAX__
-#endif
+typedef __INTMAX_TYPE__ intmax_t;
+#define INTMAX_MAX __INTMAX_MAX__
 
 extern void abort (void);
 extern void link_error (void);
index 99ca10df3939d0bb172aabc675c8af10e50479f6..590ded7892b10c71186176e12744be85d0820760 100644 (file)
@@ -6,20 +6,7 @@ extern void abort (void);
 #define ABORT_INSIDE_MAIN do { } while (0)
 #endif
 
-/* These next definitions are kludges.  When GCC has a <stdint.h> it
-   should be used.
-*/
-#include <limits.h>
-#if INT_MAX == __LONG_LONG_MAX__
-typedef int intmax_t;
-#define INTMAX_MAX INT_MAX
-#elif LONG_MAX == __LONG_LONG_MAX__
-typedef long intmax_t;
-#define INTMAX_MAX LONG_MAX
-#else
-typedef long long intmax_t;
-#define INTMAX_MAX __LONG_LONG_MAX__
-#endif
+typedef __INTMAX_TYPE__ intmax_t;
 
 int
 abs (int x)
index 230d1410136935650a8f53bc082b6ca664c46ce2..0ded1e0382a3d721ecc989c5a634f3b707e9df13 100644 (file)
@@ -28,31 +28,8 @@ __extension__ typedef unsigned long long int ullong;
 typedef llong quad_t;
 typedef ullong u_quad_t;
 
-/* This next definition is a kludge.  When GCC has a <stdint.h> it
-   should be used.
-*/
-/* (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_uint_ptr type_if(unsigned int, sizeof(unsigned int) == sizeof(ullong))
-#define maybe_long_ptr type_if(long, sizeof(long) == sizeof(llong) && sizeof(long) > sizeof(int))
-#define maybe_ulong_ptr type_if(unsigned long, sizeof(unsigned long) == sizeof(ullong) && sizeof(unsigned long) > sizeof(unsigned int))
-#define maybe_long_long_ptr type_if(llong, sizeof(llong) > sizeof(long))
-#define maybe_ulong_long_ptr type_if(ullong, sizeof(ullong) > sizeof(unsigned long))
-
-#define intmax_type_ptr type_comb3(maybe_int_ptr, maybe_long_ptr, maybe_long_long_ptr)
-#define uintmax_type_ptr type_comb3(maybe_uint_ptr, maybe_ulong_ptr, maybe_ulong_long_ptr)
-
-typedef __typeof__(*((intmax_type_ptr)0)) intmax_t;
-typedef __typeof__(*((uintmax_type_ptr)0)) uintmax_t;
+__extension__ typedef __INTMAX_TYPE__ intmax_t;
+__extension__ typedef __UINTMAX_TYPE__ uintmax_t;
 
 #if __STDC_VERSION__ < 199901L
 #define restrict /* "restrict" not in old C standard.  */
diff --git a/gcc/testsuite/gcc.dg/intmax_t-1.c b/gcc/testsuite/gcc.dg/intmax_t-1.c
new file mode 100644 (file)
index 0000000..799d00c
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Compile with -Wall to get a warning if built-in and system intmax_t don't
+   match.  */
+
+#include <inttypes.h>
+
+__INTMAX_TYPE__ __im_t__;
+__UINTMAX_TYPE__ __uim_t__;
+intmax_t *im_t_p;
+uintmax_t *uim_t_p;
+
+void
+imt (void)
+{
+  im_t_p = &__im_t__;
+}
+
+void
+uimt (void)
+{
+  uim_t_p = &__uim_t__;
+}
index 62070c4e71cefd3b453996a1a599087bd0afc5b3..21830214edb07e621f92160e8f4fadaa7801ccf3 100644 (file)
@@ -404,16 +404,7 @@ CPTEST1 (csqrt)
 CPTEST1 (ctan)
 CPTEST1 (ctanh)
 
-/* These next definitions are kludges.  When GCC has a <stdint.h> it
-   should be used.
-*/
-#if __INT_MAX__ == __LONG_LONG_MAX__
-typedef int intmax_t;
-#elif __LONG_MAX__ == __LONG_LONG_MAX__
-typedef long intmax_t;
-#else
-typedef long long intmax_t;
-#endif
+typedef __INTMAX_TYPE__ intmax_t;
 
 /* Various other const builtins.  */
 TEST1         (abs, int, int)