intmax_t is long long on Darwin, not long.
authorJordan Rose <jordan_rose@apple.com>
Wed, 20 Feb 2013 01:56:21 +0000 (01:56 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 20 Feb 2013 01:56:21 +0000 (01:56 +0000)
<rdar://problem/11540697>

llvm-svn: 175588

clang/lib/Basic/Targets.cpp
clang/test/FixIt/format-darwin.m
clang/test/Sema/format-strings-size_t.c

index eaf2e7d..4e66fe5 100644 (file)
@@ -3119,6 +3119,8 @@ class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
 public:
   DarwinX86_64TargetInfo(const std::string& triple)
       : DarwinTargetInfo<X86_64TargetInfo>(triple) {
+    IntMaxType = SignedLongLong;
+    UIntMaxType = UnsignedLongLong;
     Int64Type = SignedLongLong;
     MaxVectorAlign = 256;
   }
index cfaac29..0724e57 100644 (file)
@@ -21,6 +21,7 @@ typedef int NSInteger;
 typedef unsigned int NSUInteger;
 typedef long SInt32;
 typedef unsigned long UInt32;
+
 #endif
 
 NSInteger getNSInteger();
@@ -210,3 +211,25 @@ void testCapitals() {
   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:13-[[@LINE-3]]:14}:"d"
   // CHECK: fix-it:"{{.*}}":{[[@LINE-4]]:11-[[@LINE-4]]:14}:"%D"
 }
+
+
+// The OS X headers do not always use __INTMAX_TYPE__ and friends.
+typedef long long intmax_t;
+typedef unsigned long long uintmax_t;
+#define INTMAX_C(X) (X ## LL)
+#define UINTMAX_C(X) (X ## ULL)
+
+void testIntMax(intmax_t i, uintmax_t u) {
+  printf("%d", i); // expected-warning{{format specifies type 'int' but the argument has type 'intmax_t' (aka 'long long')}}
+  printf("%d", u); // expected-warning{{format specifies type 'int' but the argument has type 'uintmax_t' (aka 'unsigned long long')}}
+
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:11-[[@LINE-3]]:13}:"%jd"
+  // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:11-[[@LINE-3]]:13}:"%ju"
+
+  printf("%jd", i); // no-warning
+  printf("%ju", u); // no-warning
+
+  printf("%jd", INTMAX_C(5)); // no-warning
+  printf("%ju", INTMAX_C(5)); // no-warning
+}
+
index 5058a76..5751f88 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s
 
 int printf(char const *, ...);