So, let's use another testcase, -O2 -W -Wall -fno-tree-vrp -fno-tree-ccp
and again UB in it:
volatile bool e;
volatile int x;
int
main ()
{
x = 123;
*(char *)&e = x;
bool f = e;
x = __builtin_snprintf (0, 0, "%d", f);
}
This will store 1 into x, while without -fprintf-return-value it would store
3.
Great, that's what I was looking for. I turned it into the following
test case. Let me try to massage it into a compile-only test suitable
for the test suite and commit it later today.
volatile bool e;
volatile int x;
#define FMT "%d"
const char *fmt = FMT;
int
main ()
{
x = 123;
*(char *)&e = x;
bool f = e;
int n1 = __builtin_snprintf (0, 0, FMT, f);
int n2 = __builtin_snprintf (0, 0, fmt, f);
__builtin_printf ("%i == %i\n", n1, n2);
if (n1 != n2)
__builtin_abort ();
}
Martin