diff options
Diffstat (limited to 'test/FixIt/format.m')
-rw-r--r-- | test/FixIt/format.m | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/test/FixIt/format.m b/test/FixIt/format.m index c3cf2b1f3c56..40655a0e808e 100644 --- a/test/FixIt/format.m +++ b/test/FixIt/format.m @@ -242,6 +242,37 @@ void testSizeTypes() { // see the comment in PrintfSpecifier::fixType in PrintfFormatString.cpp. } +typedef __PTRDIFF_TYPE__ ptrdiff_t; +#define __UNSIGNED_PTRDIFF_TYPE__ \ + __typeof__(_Generic((__PTRDIFF_TYPE__)0, \ + long long int : (unsigned long long int)0, \ + long int : (unsigned long int)0, \ + int : (unsigned int)0, \ + short : (unsigned short)0, \ + signed char : (unsigned char)0)) + +void testPtrDiffTypes() { + __UNSIGNED_PTRDIFF_TYPE__ p1 = 0; + printf("%tu", p1); // No warning. + + printf("%tu", 0.f); // expected-warning-re{{format specifies type 'unsigned ptrdiff_t' (aka '{{.+}}') but the argument has type 'float'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%f" + + ptrdiff_t p2 = 0; + printf("%td", p2); // No warning. + + printf("%td", 0.f); // expected-warning-re{{format specifies type 'ptrdiff_t' (aka '{{.+}}') but the argument has type 'float'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%f" + + ptrdiff_t p3 = 0; + printf("%tn", &p3); // No warning. + + short x; + printf("%tn", &x); // expected-warning-re{{format specifies type 'ptrdiff_t *' (aka '{{.+}}') but the argument has type 'short *'}} + // PrintfSpecifier::fixType doesn't handle %n, so a fix-it is not emitted, + // see the comment in PrintfSpecifier::fixType in PrintfFormatString.cpp. +} + void testEnum() { typedef enum { ImplicitA = 1, |