https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72857
Bug ID: 72857 Summary: incorrect caret location in -Wformat for width and precision given by asterisk Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- In -Wformat diagnostics, GCC 6.1 (and 7.0, likely prior to r239260) would, for the most part, point the caret to the component of a format directive that it complained about. For example, in the program below, it would point at the asterisk corresponding to the problem width or precision: $ cat xyz.c && gcc -S -Wformat xyz.c int f (char *d, long i) { __builtin_sprintf (d, "%*ld", i, i); __builtin_sprintf (d, "%.*ld", i, i); } xyz.c: In function ‘f’: xyz.c:3:27: warning: field width specifier ‘*’ expects argument of type ‘int’, but argument 3 has type ‘long int’ [-Wformat=] __builtin_sprintf (d, "%*ld", i, i); ^ xyz.c:4:28: warning: field precision specifier ‘.*’ expects argument of type ‘int’, but argument 3 has type ‘long int’ [-Wformat=] __builtin_sprintf (d, "%.*ld", i, i); ^ The current trunk of GCC 7.0 has lost that feature and the caret instead points to the end of the format directive: xyz.c: In function ‘f’: xyz.c:3:29: warning: field width specifier ‘*’ expects argument of type ‘int’, but argument 3 has type ‘long int’ [-Wformat=] __builtin_sprintf (d, "%*ld", i, i); ~~~^ xyz.c:4:30: warning: field precision specifier ‘.*’ expects argument of type ‘int’, but argument 3 has type ‘long int’ [-Wformat=] __builtin_sprintf (d, "%.*ld", i, i); ~~~~^ This is a minor problem (distinguishing width from precision by including the period in the latter helps), but it is a regression nonetheless. Below is what Clang outputs for comparison. (Underlining the argument corresponding to the asterisk for the width or precision seems like an especially nice touch.) xyz.c:3:18: warning: field width should have type 'int', but argument has type 'long' [-Wformat] sprintf (d, "%*ld", i, i); ~~^~ ~ xyz.c:4:18: warning: field precision should have type 'int', but argument has type 'long' [-Wformat] sprintf (d, "%.*ld", i, i); ~~^~~ ~