libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / tree-ssa / builtin-snprintf-warn-2.c
blobe1e1a02b576edda04d74a011995b6caa6561ea40
1 /* { dg-do compile } */
2 /* { dg-options "-O2 -Wformat -Wformat-truncation=2 -ftrack-macro-expansion=0" } */
4 typedef struct
6 char a0[0];
7 /* Separate a0 from a1 to prevent the former from being substituted
8 for the latter and causing false positives. */
9 int: 8;
10 char a1[1];
11 char a2[2];
12 char a3[3];
13 char a4[4];
14 char ax[];
15 } Arrays;
17 char buffer[1024];
18 #define buffer(size) (buffer + sizeof buffer - size)
20 static int value_range (int min, int max)
22 extern int value (void);
23 int val = value ();
24 return val < min || max < val ? min : val;
27 #define R(min, max) value_range (min, max)
29 /* Verify that calls to snprintf whose return value is unused are
30 diagnosed if certain or possible truncation is detected. */
32 #define T(size, ...) \
33 __builtin_snprintf (buffer (size), size, __VA_ARGS__)
35 void test_int_retval_unused (void)
37 T (2, "%i", 123); /* { dg-warning "output truncated" } */
38 T (2, "%i", R (1, 99)); /* { dg-warning "output may be truncated" } */
39 T (2, "%i", R (10, 99)); /* { dg-warning "output truncated" } */
40 T (3, "%i%i", R (1, 99), R (1, 99)); /* { dg-warning "output may be truncated" } */
43 void test_string_retval_unused (const Arrays *ar)
45 /* At level 2 strings of unknown length are assumed to be 1 character
46 long, so the following is diagnosed. */
47 T (1, "%-s", ar->a0); /* { dg-warning "output may be truncated" } */
48 T (1, "%-s", ar->a1);
49 T (1, "%-s", ar->a2); /* { dg-warning "output may be truncated" } */
53 /* Verify that (at -Wformat-trunc=2) calls to snprintf whose return value
54 is used are diagnosed the same way as those whose value is unused. */
56 volatile int retval;
58 #undef T
59 #define T(size, ...) \
60 retval = __builtin_snprintf (buffer (size), size, __VA_ARGS__)
62 void test_int_retval_used (void)
64 T (2, "%i", 123); /* { dg-warning "output truncated" } */
65 T (2, "%i", R (1, 99)); /* { dg-warning "output may be truncated" } */
66 T (2, "%i", R (10, 99)); /* { dg-warning "output truncated" } */
67 T (3, "%i%i", R (1, 99), R (1, 99)); /* { dg-warning "output may be truncated" } */
70 void test_string_retval_used (const Arrays *ar)
72 T (1, "%-s", ar->a0); /* { dg-warning "output may be truncated" } */
73 T (1, "%-s", ar->a1);
74 T (1, "%-s", ar->a2); /* { dg-warning "output may be truncated" } */