dexonsmith created this revision.

size_t is usually defined as unsigned long, but on 64-bit platforms,
stdint.h currently defines SIZE_MAX using "ull" (unsigned long long).
Although this is the same width, it doesn't necessarily have the same
alignment or calling convention.  It also triggers printf warnings when
using the format flag "%zu" to print SIZE_MAX.

1. Is there a better way to get the right type for SIZE_MAX?
2. Should we do this for ptrdiff_t as well?


https://reviews.llvm.org/D31856

Files:
  clang/lib/Headers/stdint.h
  clang/test/Headers/stdint-type-of-SIZE_MAX.cpp


Index: clang/test/Headers/stdint-type-of-SIZE_MAX.cpp
===================================================================
--- /dev/null
+++ clang/test/Headers/stdint-type-of-SIZE_MAX.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s
+#include <stdint.h>
+#include <stddef.h>
+
+static_assert(__is_same(__typeof__(SIZE_MAX), size_t),
+              "SIZE_MAX should be size_t");
Index: clang/lib/Headers/stdint.h
===================================================================
--- clang/lib/Headers/stdint.h
+++ clang/lib/Headers/stdint.h
@@ -664,7 +664,7 @@
 #define UINTPTR_MAX __UINTN_MAX(__INTPTR_WIDTH__)
 #define PTRDIFF_MIN  __INTN_MIN(__PTRDIFF_WIDTH__)
 #define PTRDIFF_MAX  __INTN_MAX(__PTRDIFF_WIDTH__)
-#define    SIZE_MAX __UINTN_MAX(__SIZE_WIDTH__)
+#define    SIZE_MAX ((__SIZE_TYPE__)__UINTN_MAX(__SIZE_WIDTH__))
 
 /* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__
  * is enabled. */


Index: clang/test/Headers/stdint-type-of-SIZE_MAX.cpp
===================================================================
--- /dev/null
+++ clang/test/Headers/stdint-type-of-SIZE_MAX.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s
+#include <stdint.h>
+#include <stddef.h>
+
+static_assert(__is_same(__typeof__(SIZE_MAX), size_t),
+              "SIZE_MAX should be size_t");
Index: clang/lib/Headers/stdint.h
===================================================================
--- clang/lib/Headers/stdint.h
+++ clang/lib/Headers/stdint.h
@@ -664,7 +664,7 @@
 #define UINTPTR_MAX __UINTN_MAX(__INTPTR_WIDTH__)
 #define PTRDIFF_MIN  __INTN_MIN(__PTRDIFF_WIDTH__)
 #define PTRDIFF_MAX  __INTN_MAX(__PTRDIFF_WIDTH__)
-#define    SIZE_MAX __UINTN_MAX(__SIZE_WIDTH__)
+#define    SIZE_MAX ((__SIZE_TYPE__)__UINTN_MAX(__SIZE_WIDTH__))
 
 /* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__
  * is enabled. */
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to