1 /* PR tree-optimization/84468 - bogus -Wstringop-truncation despite
2 assignment after conditional strncpy
3 { dg-do compile }
4 { dg-options "-O2 -Wstringop-truncation -g" } */
5
6 extern char* strncpy (char*, const char*, __SIZE_TYPE__);
7
8 char a[4];
9
10 void f1 (char *s)
11 {
12 int i = 0;
13
14 if (s[0] == '0')
15 {
16 i += 1;
17 strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */
18 }
19 else
20 i += 2;
21
22 a[sizeof a - 1] = 0;
23 }
24
25 void f2 (char *s)
26 {
27 int i = 0;
28
29 if (s[0] == '0')
30 {
31 i += 1;
32 if (s[1] == '1')
33 {
34 i += 2;
35 strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */
36 }
37 else
38 i += 3;
39 }
40 else
41 i += 4;
42
43 a[sizeof a - 1] = 0;
44 }
45
46 void f3 (char *s)
47 {
48 int i = 0;
49
50 if (s[0] == '0')
51 {
52 i += 1;
53 if (s[1] == '1')
54 {
55 i += 2;
56 if (s[2] == '2')
57 strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */
58 else
59 i += 3;
60 }
61 else
62 i += 4;
63 }
64 else
65 i += 5;
66
67 a[sizeof a - 1] = 0;
68 }
69
70 void f4 (char *s)
71 {
72 int i = 0;
73
74 if (s[0] == '0')
75 {
76 i += 1;
77 if (s[1] == '1')
78 {
79 i += 2;
80 if (s[2] == '2')
81 {
82 i += 3;
83 if (s[3] == '3')
84 strncpy (a, s, sizeof a); /* { dg-bogus "\\\[-Wstringop-truncation]" } */
85 else
86 i += 4;
87 }
88 else
89 i += 5;
90 }
91 else
92 i += 6;
93 }
94 else
95 i += 7;
96
97 a[sizeof a - 1] = 0;
98 }
99
100 void f4_warn (char *s)
101 {
102 int i = 0;
103
104 if (s[0] == '0')
105 {
106 i += 1;
107 if (s[1] == '1')
108 {
109 i += 2;
110 if (s[2] == '2')
111 {
112 i += 3;
113 if (s[3] == '3')
114 strncpy (a, s, sizeof a); /* { dg-warning "\\\[-Wstringop-truncation]" } */
115 else
116 i += 4;
117 }
118 else
119 i += 5;
120 }
121 else
122 i += 6;
123 }
124 else
125 i += 7;
126 }