Home | History | Annotate | Download | only in Sema
      1 // RUN: cp %s %t
      2 // RUN: %clang_cc1 -pedantic -Wall -fixit %t
      3 // RUN: %clang_cc1 -fsyntax-only -pedantic -Wall -Werror %t
      4 // RUN: %clang_cc1 -E -o - %t | FileCheck %s
      5 
      6 /* This is a test of the various code modification hints that are
      7    provided as part of warning or extension diagnostics. All of the
      8    warnings will be fixed by -fixit, and the resulting file should
      9    compile cleanly with -Werror -pedantic. */
     10 
     11 int printf(char const *, ...);
     12 
     13 typedef __SIZE_TYPE__ size_t;
     14 typedef __INTMAX_TYPE__ intmax_t;
     15 typedef __UINTMAX_TYPE__ uintmax_t;
     16 typedef __PTRDIFF_TYPE__ ptrdiff_t;
     17 typedef __WCHAR_TYPE__ wchar_t;
     18 
     19 void test() {
     20   // Basic types
     21   printf("%s", (int) 123);
     22   printf("abc%0f", "testing testing 123");
     23   printf("%u", (long) -12);
     24   printf("%p", 123);
     25   printf("%c\n", "x");
     26   printf("%c\n", 1.23);
     27 
     28   // Larger types
     29   printf("%+.2d", (unsigned long long) 123456);
     30   printf("%1d", (long double) 1.23);
     31 
     32   // Flag handling
     33   printf("%0+s", (unsigned) 31337); // 0 flag should stay
     34   printf("%#p", (void *) 0);
     35   printf("% +f", 1.23); // + flag should stay
     36   printf("%0-f", 1.23); // - flag should stay
     37 
     38   // Positional arguments
     39 #pragma clang diagnostic push // Don't warn about using positional arguments.
     40 #pragma clang diagnostic ignored "-Wformat-non-iso"
     41   printf("%1$f:%2$.*3$f:%4$.*3$f\n", 1, 2, 3, 4);
     42 #pragma clang diagnostic pop
     43 
     44   // Precision
     45   printf("%10.5d", 1l); // (bug 7394)
     46   printf("%.2c", 'a');
     47 
     48   // Ignored flags
     49   printf("%0-f", 1.23);
     50 
     51   // Bad length modifiers
     52   printf("%hhs", "foo");
     53 #pragma clang diagnostic push // Don't warn about using positional arguments.
     54 #pragma clang diagnostic ignored "-Wformat-non-iso"
     55   printf("%1$zp", (void *)0);
     56 #pragma clang diagnostic pop
     57 
     58   // Preserve the original formatting for unsigned integers.
     59   unsigned long val = 42;
     60   printf("%X", val);
     61 
     62   // size_t, etc.
     63   printf("%f", (size_t) 42);
     64   printf("%f", (intmax_t) 42);
     65   printf("%f", (uintmax_t) 42);
     66   printf("%f", (ptrdiff_t) 42);
     67 
     68   // Look beyond the first typedef.
     69   typedef size_t my_size_type;
     70   typedef intmax_t my_intmax_type;
     71   typedef uintmax_t my_uintmax_type;
     72   typedef ptrdiff_t my_ptrdiff_type;
     73   typedef int my_int_type;
     74   printf("%f", (my_size_type) 42);
     75   printf("%f", (my_intmax_type) 42);
     76   printf("%f", (my_uintmax_type) 42);
     77   printf("%f", (my_ptrdiff_type) 42);
     78   printf("%f", (my_int_type) 42);
     79 
     80   // string
     81   printf("%ld", "foo");
     82 
     83   // Preserve the original choice of conversion specifier.
     84   printf("%o", (long) 42);
     85   printf("%u", (long) 42);
     86   printf("%x", (long) 42);
     87   printf("%X", (long) 42);
     88   printf("%i", (unsigned long) 42);
     89   printf("%d", (unsigned long) 42);
     90   printf("%F", (long double) 42);
     91   printf("%e", (long double) 42);
     92   printf("%E", (long double) 42);
     93   printf("%g", (long double) 42);
     94   printf("%G", (long double) 42);
     95   printf("%a", (long double) 42);
     96   printf("%A", (long double) 42);
     97 }
     98 
     99 int scanf(char const *, ...);
    100 
    101 void test2(int intSAParm[static 2]) {
    102   char str[100];
    103   char *vstr = "abc";
    104   short shortVar;
    105   unsigned short uShortVar;
    106   int intVar;
    107   int intAVar[2];
    108   unsigned uIntVar;
    109   float floatVar;
    110   double doubleVar;
    111   long double longDoubleVar;
    112   long longVar;
    113   unsigned long uLongVar;
    114   long long longLongVar;
    115   unsigned long long uLongLongVar;
    116   size_t sizeVar;
    117   intmax_t intmaxVar;
    118   uintmax_t uIntmaxVar;
    119   ptrdiff_t ptrdiffVar;
    120   enum {A, B, C} enumVar;
    121 
    122   // Some string types.
    123   scanf("%lf", str);
    124   scanf("%lf", vstr);
    125   scanf("%ls", str);
    126   scanf("%ls", str);
    127 
    128   // Some integer types.
    129   scanf("%f", &shortVar);
    130   scanf("%f", &uShortVar);
    131   scanf("%p", &intVar);
    132   scanf("%f", intAVar);
    133   scanf("%f", intSAParm);
    134   scanf("%Lf", &uIntVar);
    135   scanf("%ld", &floatVar);
    136   scanf("%f", &doubleVar);
    137   scanf("%d", &longDoubleVar);
    138   scanf("%f", &longVar);
    139   scanf("%f", &uLongVar);
    140   scanf("%f", &longLongVar);
    141   scanf("%f", &uLongLongVar);
    142   scanf("%d", &enumVar); // FIXME: We ought to fix specifiers for enums.
    143 
    144   // Some named ints.
    145   scanf("%f", &sizeVar);
    146   scanf("%f", &intmaxVar);
    147   scanf("%f", &uIntmaxVar);
    148   scanf("%f", &ptrdiffVar);
    149 
    150   // Look beyond the first typedef for named integer types.
    151   typedef size_t my_size_type;
    152   typedef intmax_t my_intmax_type;
    153   typedef uintmax_t my_uintmax_type;
    154   typedef ptrdiff_t my_ptrdiff_type;
    155   typedef int my_int_type;
    156   scanf("%f", (my_size_type*)&sizeVar);
    157   scanf("%f", (my_intmax_type*)&intmaxVar);
    158   scanf("%f", (my_uintmax_type*)&uIntmaxVar);
    159   scanf("%f", (my_ptrdiff_type*)&ptrdiffVar);
    160   scanf("%f", (my_int_type*)&intVar);
    161 
    162   // Preserve the original formatting.
    163   scanf("%o", &longVar);
    164   scanf("%u", &longVar);
    165   scanf("%x", &longVar);
    166   scanf("%X", &longVar);
    167   scanf("%i", &uLongVar);
    168   scanf("%d", &uLongVar);
    169   scanf("%F", &longDoubleVar);
    170   scanf("%e", &longDoubleVar);
    171   scanf("%E", &longDoubleVar);
    172   scanf("%g", &longDoubleVar);
    173   scanf("%G", &longDoubleVar);
    174   scanf("%a", &longDoubleVar);
    175   scanf("%A", &longDoubleVar);
    176 }
    177 
    178 // Validate the fixes.
    179 // CHECK: printf("%d", (int) 123);
    180 // CHECK: printf("abc%s", "testing testing 123");
    181 // CHECK: printf("%ld", (long) -12);
    182 // CHECK: printf("%d", 123);
    183 // CHECK: printf("%s\n", "x");
    184 // CHECK: printf("%f\n", 1.23);
    185 // CHECK: printf("%+.2lld", (unsigned long long) 123456);
    186 // CHECK: printf("%1Lf", (long double) 1.23);
    187 // CHECK: printf("%0u", (unsigned) 31337);
    188 // CHECK: printf("%p", (void *) 0);
    189 // CHECK: printf("%+f", 1.23);
    190 // CHECK: printf("%-f", 1.23);
    191 // CHECK: printf("%1$d:%2$.*3$d:%4$.*3$d\n", 1, 2, 3, 4);
    192 // CHECK: printf("%10.5ld", 1l);
    193 // CHECK: printf("%c", 'a');
    194 // CHECK: printf("%-f", 1.23);
    195 // CHECK: printf("%s", "foo");
    196 // CHECK: printf("%1$p", (void *)0);
    197 // CHECK: printf("%lX", val);
    198 // CHECK: printf("%zu", (size_t) 42);
    199 // CHECK: printf("%jd", (intmax_t) 42);
    200 // CHECK: printf("%ju", (uintmax_t) 42);
    201 // CHECK: printf("%td", (ptrdiff_t) 42);
    202 // CHECK: printf("%zu", (my_size_type) 42);
    203 // CHECK: printf("%jd", (my_intmax_type) 42);
    204 // CHECK: printf("%ju", (my_uintmax_type) 42);
    205 // CHECK: printf("%td", (my_ptrdiff_type) 42);
    206 // CHECK: printf("%d", (my_int_type) 42);
    207 // CHECK: printf("%s", "foo");
    208 // CHECK: printf("%lo", (long) 42);
    209 // CHECK: printf("%ld", (long) 42);
    210 // CHECK: printf("%lx", (long) 42);
    211 // CHECK: printf("%lX", (long) 42);
    212 // CHECK: printf("%lu", (unsigned long) 42);
    213 // CHECK: printf("%lu", (unsigned long) 42);
    214 // CHECK: printf("%LF", (long double) 42);
    215 // CHECK: printf("%Le", (long double) 42);
    216 // CHECK: printf("%LE", (long double) 42);
    217 // CHECK: printf("%Lg", (long double) 42);
    218 // CHECK: printf("%LG", (long double) 42);
    219 // CHECK: printf("%La", (long double) 42);
    220 // CHECK: printf("%LA", (long double) 42);
    221 
    222 // CHECK: scanf("%99s", str);
    223 // CHECK: scanf("%s", vstr);
    224 // CHECK: scanf("%99s", str);
    225 // CHECK: scanf("%99s", str);
    226 // CHECK: scanf("%hd", &shortVar);
    227 // CHECK: scanf("%hu", &uShortVar);
    228 // CHECK: scanf("%d", &intVar);
    229 // CHECK: scanf("%d", intAVar);
    230 // CHECK: scanf("%d", intSAParm);
    231 // CHECK: scanf("%u", &uIntVar);
    232 // CHECK: scanf("%f", &floatVar);
    233 // CHECK: scanf("%lf", &doubleVar);
    234 // CHECK: scanf("%Lf", &longDoubleVar);
    235 // CHECK: scanf("%ld", &longVar);
    236 // CHECK: scanf("%lu", &uLongVar);
    237 // CHECK: scanf("%lld", &longLongVar);
    238 // CHECK: scanf("%llu", &uLongLongVar);
    239 // CHECK: scanf("%d", &enumVar);
    240 // CHECK: scanf("%zu", &sizeVar);
    241 // CHECK: scanf("%jd", &intmaxVar);
    242 // CHECK: scanf("%ju", &uIntmaxVar);
    243 // CHECK: scanf("%td", &ptrdiffVar);
    244 // CHECK: scanf("%zu", (my_size_type*)&sizeVar);
    245 // CHECK: scanf("%jd", (my_intmax_type*)&intmaxVar);
    246 // CHECK: scanf("%ju", (my_uintmax_type*)&uIntmaxVar);
    247 // CHECK: scanf("%td", (my_ptrdiff_type*)&ptrdiffVar);
    248 // CHECK: scanf("%d", (my_int_type*)&intVar);
    249 // CHECK: scanf("%lo", &longVar);
    250 // CHECK: scanf("%lu", &longVar);
    251 // CHECK: scanf("%lx", &longVar);
    252 // CHECK: scanf("%lX", &longVar);
    253 // CHECK: scanf("%li", &uLongVar);
    254 // CHECK: scanf("%ld", &uLongVar);
    255 // CHECK: scanf("%LF", &longDoubleVar);
    256 // CHECK: scanf("%Le", &longDoubleVar);
    257 // CHECK: scanf("%LE", &longDoubleVar);
    258 // CHECK: scanf("%Lg", &longDoubleVar);
    259 // CHECK: scanf("%LG", &longDoubleVar);
    260 // CHECK: scanf("%La", &longDoubleVar);
    261 // CHECK: scanf("%LA", &longDoubleVar);
    262