1 // PR tree-optimization/84468 - bogus -Wstringop-truncation despite
2 // assignment after conditional strncpy
3 // Compile with -g to verify the warning deals properly with debug
4 // statements.
5 // { dg-do compile }
6 // { dg-options "-O2 -Wstringop-truncation -g" }
7 
8 extern "C" char* strncpy (char*, const char*, __SIZE_TYPE__);
9 
10 char d[3];
11 
12 void g ();
13 
fnowarn1(const char * s)14 void fnowarn1 (const char *s)
15 {
16   // Update dummy but never actually use it so it's eliminated
17   // but causes debugging statements to be emitted for each
18   // modification.
19   int dummy = 0;
20 
21   try
22     {
23       g ();
24       strncpy (d, s, sizeof d);   // { dg-bogus "\\\[-Wstringop-truncation]" }
25       ++dummy;
26     }
27   catch (...)
28     {
29       ++dummy;
30       d[0] = 0;
31     }
32 
33   ++dummy;
34   d[sizeof d - 1] = 0;
35 }
36 
fnowarn2(const char * s)37 void fnowarn2 (const char *s)
38 {
39   int dummy = 0;
40 
41   try
42     {
43       g ();
44       strncpy (d, s, sizeof d);
45       ++dummy;
46     }
47   catch (...)
48     {
49       ++dummy;
50       return;
51     }
52 
53   ++dummy;
54   d[sizeof d - 1] = 0;
55 }
56 
fnowarn3(const char * s)57 void fnowarn3 (const char *s)
58 {
59   int dummy = 0;
60 
61   try
62     {
63       g ();
64       strncpy (d, s, sizeof d);
65       ++dummy;
66       try
67 	{
68 	  ++dummy;
69 	  d[sizeof d - 1] = 0;
70 	  g ();
71 	}
72       catch (...)
73 	{
74 	  ++dummy;
75 	}
76     }
77   catch (...)
78     {
79       ++dummy;
80       return;
81     }
82 
83   ++dummy;
84   d[sizeof d - 1] = 0;
85 }
86 
fnowarn4(const char * s)87 void fnowarn4 (const char *s)
88 {
89   int dummy = 0;
90 
91   try
92     {
93       g ();
94     }
95   catch (...)
96     {
97       strncpy (d, s, sizeof d);   // { dg-bogus "\\\[-Wstringop-truncation]" "bug 84468" { xfail *-*-*} }
98       ++dummy;
99     }
100 
101   ++dummy;
102   d[sizeof d - 1] = 0;
103 }
104 
fwarn1(const char * s)105 void fwarn1 (const char *s)
106 {
107   int dummy = 0;
108 
109   try
110     {
111       ++dummy;
112       g ();
113       ++dummy;
114       strncpy (d, s, sizeof d);   // { dg-warning "\\\[-Wstringop-truncation]" }
115       ++dummy;
116     }
117   catch (...)
118     {
119       ++dummy;
120     }
121 
122   ++dummy;
123 }
124 
fwarn2(const char * s)125 void fwarn2 (const char *s)
126 {
127   int dummy = 0;
128 
129   try
130     {
131       ++dummy;
132       strncpy (d, s, sizeof d);   // { dg-warning "\\\[-Wstringop-truncation]" }
133       ++dummy;
134       g ();
135       ++dummy;
136     }
137   catch (...)
138     {
139       ++dummy;
140     }
141 
142   ++dummy;
143 }
144 
fwarn3(const char * s)145 void fwarn3 (const char *s)
146 {
147   int dummy = 0;
148 
149   try
150     {
151       ++dummy;
152       g ();
153       ++dummy;
154       strncpy (d, s, sizeof d);   // { dg-warning "\\\[-Wstringop-truncation]" }
155       ++dummy;
156     }
157   catch (...)
158     {
159       ++dummy;
160       d[0] = 0;
161     }
162 
163   ++dummy;
164 }
165