/* PR tree-optimization/84468 - bogus -Wstringop-truncation despite assignment after conditional strncpy { dg-do compile } { dg-options "-O2 -Wstringop-truncation -g" } */ extern char* strncpy (char*, const char*, __SIZE_TYPE__); char a[4]; void f1 (char *s) { int i = 0; if (s[0] == '0') { i += 1; strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */ } else i += 2; a[sizeof a - 1] = 0; } void f2 (char *s) { int i = 0; if (s[0] == '0') { i += 1; if (s[1] == '1') { i += 2; strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */ } else i += 3; } else i += 4; a[sizeof a - 1] = 0; } void f3 (char *s) { int i = 0; if (s[0] == '0') { i += 1; if (s[1] == '1') { i += 2; if (s[2] == '2') strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */ else i += 3; } else i += 4; } else i += 5; a[sizeof a - 1] = 0; } void f4 (char *s) { int i = 0; if (s[0] == '0') { i += 1; if (s[1] == '1') { i += 2; if (s[2] == '2') { i += 3; if (s[3] == '3') strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */ else i += 4; } else i += 5; } else i += 6; } else i += 7; a[sizeof a - 1] = 0; } void f4_warn (char *s) { int i = 0; if (s[0] == '0') { i += 1; if (s[1] == '1') { i += 2; if (s[2] == '2') { i += 3; if (s[3] == '3') strncpy (a, s, sizeof a); /* { dg-warning "\\\[-Wstringop-truncation]" } */ else i += 4; } else i += 5; } else i += 6; } else i += 7; }