/* PR tree-optimization/87756 - missing unterminated argument warning using address of a constant character { dg-do compile } { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */ typedef __WCHAR_TYPE__ wchar_t; int sprintf (char*, const char*, ...); extern char* dest (void); extern void sink (int, ...); #define D dest () #define T(expr) sink (0, (expr)) const wchar_t wnul = L'\0'; const wchar_t wnonul = L'a'; const wchar_t wcs3[] = L"123"; const struct { wchar_t a, b, s[3]; } w1 = { L'\0', L'b', L"123" }, w2[2] = { { L'\0', L'c', L"12" }, { L'd', L'\0', L"123" } }; void test_sprintf_ls (void) { T (sprintf (D, "%ls", &wnul)); T (sprintf (D, "%ls", &wnonul)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.1ls", &wnonul)); T (sprintf (D, "%.2ls", &wnonul)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%ls", &w1.a)); T (sprintf (D, "%ls", &w1.b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */ T (sprintf (D, "%.1ls", &w1.b)); T (sprintf (D, "%.2ls", &w1.b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */ T (sprintf (D, "%ls", w1.s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.3ls", w1.s)); T (sprintf (D, "%.4ls", w1.s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.2ls", w1.s + 1)); T (sprintf (D, "%.3ls", w1.s + 1)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%ls", &w2[0].a)); T (sprintf (D, "%ls", &w2[0].b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */ T (sprintf (D, "%.1ls", &w2[0].b)); T (sprintf (D, "%.2ls", &w2[0].b)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */ T (sprintf (D, "%ls", w2[0].s)); T (sprintf (D, "%.3ls", w2[0].s)); T (sprintf (D, "%.4ls", w2[0].s)); T (sprintf (D, "%.2ls", w2[0].s + 1)); T (sprintf (D, "%.3ls", w2[0].s + 1)); T (sprintf (D, "%ls", &w2[1].a)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */ T (sprintf (D, "%.1ls", &w2[1].a)); T (sprintf (D, "%.2ls", &w2[1].a)); /* { dg-warning "nul-terminated" "pr88211" { xfail *-*-* } } */ T (sprintf (D, "%ls", &w2[1].b)); T (sprintf (D, "%ls", w2[1].s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.3ls", w2[1].s)); T (sprintf (D, "%.4ls", w2[1].s)); /* { dg-warning "nul-terminated" } */ T (sprintf (D, "%.2ls", w2[1].s + 1)); T (sprintf (D, "%.3ls", w2[1].s + 1));/* { dg-warning "nul-terminated" } */ T (sprintf (D, "%ls", &wcs3[3])); T (sprintf (D, "%ls", &wcs3[4])); /* { dg-warning "\\\[-Warray-bounds" } */ }