16adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// RUN: cp %s %t
26adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// RUN: %clang_cc1 -fsyntax-only -fixit %t
36adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// RUN: %clang_cc1 -E -o - %t | FileCheck %s
46adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
56adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu/* This is a test of the various code modification hints that are
66adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu   provided as part of warning or extension diagnostics. Only
76adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu   warnings for format strings within the function call will be
86adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu   fixed by -fixit.  Other format strings will be left alone. */
96adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
106adb12dd40178ce513b02d44f8048a76801d6331Richard Trieuint printf(char const *, ...);
116adb12dd40178ce513b02d44f8048a76801d6331Richard Trieuint scanf(char const *, ...);
126adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
136adb12dd40178ce513b02d44f8048a76801d6331Richard Trieuvoid pr9751() {
146adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  const char kFormat1[] = "%s";
156adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf(kFormat1, 5);
166adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf("%s", 5);
176adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
186adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  const char kFormat2[] = "%.3p";
196adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  void *p;
206adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf(kFormat2, p);
216adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf("%.3p", p);
226adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
236adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  const char kFormat3[] = "%0s";
246adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf(kFormat3, "a");
256adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf("%0s", "a");
266adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
276adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  const char kFormat4[] = "%hhs";
286adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf(kFormat4, "a");
296adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf("%hhs", "a");
306adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
316adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  const char kFormat5[] = "%-0d";
326adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf(kFormat5, 5);
336adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  printf("%-0d", 5);
346adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
356adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  const char kFormat6[] = "%00d";
366adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  int *i;
376adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  scanf(kFormat6, i);
386adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu  scanf("%00d", i);
396adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu}
406adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
416adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  const char kFormat1[] = "%s";
426adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf(kFormat1, 5);
436adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf("%d", 5);
446adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
456adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  const char kFormat2[] = "%.3p";
466adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  void *p;
476adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf(kFormat2, p);
486adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf("%p", p);
496adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
506adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  const char kFormat3[] = "%0s";
516adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf(kFormat3, "a");
526adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf("%s", "a");
536adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
546adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  const char kFormat4[] = "%hhs";
556adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf(kFormat4, "a");
566adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf("%s", "a");
576adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
586adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  const char kFormat5[] = "%-0d";
596adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf(kFormat5, 5);
606adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  printf("%-d", 5);
616adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu
626adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  const char kFormat6[] = "%00d";
636adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  int *i;
646adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  scanf(kFormat6, i);
656adb12dd40178ce513b02d44f8048a76801d6331Richard Trieu// CHECK:  scanf("%d", i);
66