1 /* PR tree-optimization/87756 - missing unterminated argument warning
2 using address of a constant character
3 { dg-do compile }
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
5
6 typedef __WCHAR_TYPE__ wchar_t;
7
8 int sprintf (char*, const char*, ...);
9
10 extern char* dest (void);
11 extern void sink (int, ...);
12
13 #define D dest ()
14 #define T(expr) sink (0, (expr))
15
16 const wchar_t wnul = L'\0';
17 const wchar_t wnonul = L'a';
18 const wchar_t wcs3[] = L"123";
19
20 const struct
21 {
22 wchar_t a, b, s[3];
23 } w1 = { L'\0', L'b', L"123" },
24 w2[2] = {
25 { L'\0', L'c', L"12" },
26 { L'd', L'\0', L"123" }
27 };
28
29 void test_sprintf_ls (void)
30 {
31 T (sprintf (D, "%ls", &wnul));
32 T (sprintf (D, "%ls", &wnonul)); /* { dg-warning "nul-terminated" } */
33 T (sprintf (D, "%.1ls", &wnonul));
34 T (sprintf (D, "%.2ls", &wnonul)); /* { dg-warning "nul-terminated" } */
35
36 T (sprintf (D, "%ls", &w1.a));
37 T (sprintf (D, "%ls", &w1.b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
38 T (sprintf (D, "%.1ls", &w1.b));
39 T (sprintf (D, "%.2ls", &w1.b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
40 T (sprintf (D, "%ls", w1.s)); /* { dg-warning "nul-terminated" } */
41 T (sprintf (D, "%.3ls", w1.s));
42 T (sprintf (D, "%.4ls", w1.s)); /* { dg-warning "nul-terminated" } */
43
44 T (sprintf (D, "%.2ls", w1.s + 1));
45 T (sprintf (D, "%.3ls", w1.s + 1)); /* { dg-warning "nul-terminated" } */
46
47 T (sprintf (D, "%ls", &w2[0].a));
48 T (sprintf (D, "%ls", &w2[0].b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
49 T (sprintf (D, "%.1ls", &w2[0].b));
50 T (sprintf (D, "%.2ls", &w2[0].b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
51 T (sprintf (D, "%ls", w2[0].s));
52 T (sprintf (D, "%.3ls", w2[0].s));
53 T (sprintf (D, "%.4ls", w2[0].s));
54
55 T (sprintf (D, "%.2ls", w2[0].s + 1));
56 T (sprintf (D, "%.3ls", w2[0].s + 1));
57
58 T (sprintf (D, "%ls", &w2[1].a)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
59 T (sprintf (D, "%.1ls", &w2[1].a));
60 T (sprintf (D, "%.2ls", &w2[1].a)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */
61 T (sprintf (D, "%ls", &w2[1].b));
62 T (sprintf (D, "%ls", w2[1].s)); /* { dg-warning "nul-terminated" } */
63 T (sprintf (D, "%.3ls", w2[1].s));
64 T (sprintf (D, "%.4ls", w2[1].s)); /* { dg-warning "nul-terminated" } */
65
66 T (sprintf (D, "%.2ls", w2[1].s + 1));
67 T (sprintf (D, "%.3ls", w2[1].s + 1));/* { dg-warning "nul-terminated" } */
68
69 T (sprintf (D, "%ls", &wcs3[3]));
70 T (sprintf (D, "%ls", &wcs3[4])); /* { dg-warning "\\\[-Warray-bounds" } */
71 }