1 // PR sanitizer/81875
2 // { dg-do compile }
3 // { dg-options "-Wreturn-type" }
4
5 struct C { C (); ~C (); };
6
7 int
f1(int a,int b,int c)8 f1 (int a, int b, int c)
9 {
10 C f;
11 switch (a)
12 {
13 case 0:
14 switch (b)
15 {
16 case 13:
17 return 7;
18 case 24:
19 if (c == 5)
20 break;
21 return 19;
22 default:
23 return 0;
24 }
25 break;
26 default:
27 return 0;
28 case 9:
29 return 17;
30 }
31 } // { dg-warning "control reaches end of non-void function" }
32
33 int
f2(int a,int b,int c,int d)34 f2 (int a, int b, int c, int d)
35 {
36 C f;
37 switch (a)
38 {
39 case 0:
40 switch (b)
41 {
42 case 13:
43 while (c >= 10)
44 {
45 if (c == d)
46 break;
47 c--;
48 }
49 return 7;
50 case 29:
51 switch (d)
52 {
53 case 35:
54 break;
55 default:
56 return 9;
57 }
58 if (c == d + 20)
59 break;
60 return 8;
61 case 24:
62 do
63 {
64 if (c == d)
65 break;
66 c--;
67 }
68 while (c >= 10);
69 return 19;
70 default:
71 for (int e = 0; e < c; ++e)
72 if (e == d)
73 break;
74 return 0;
75 }
76 break;
77 default:
78 return 0;
79 case 9:
80 return 17;
81 }
82 } // { dg-warning "control reaches end of non-void function" }
83
84 template <int N>
85 int
f3(int a,int b,int c)86 f3 (int a, int b, int c)
87 {
88 C f;
89 switch (a)
90 {
91 case 0:
92 switch (b)
93 {
94 case 13:
95 return 7;
96 case 24:
97 if (c == 5)
98 break;
99 return 19;
100 default:
101 return 0;
102 }
103 break;
104 default:
105 return 0;
106 case 9:
107 return 17;
108 }
109 } // { dg-warning "control reaches end of non-void function" }
110
111 template <int N>
112 int
f4(int a,int b,int c,int d)113 f4 (int a, int b, int c, int d)
114 {
115 C f;
116 switch (a)
117 {
118 case 0:
119 switch (b)
120 {
121 case 13:
122 while (c >= 10)
123 {
124 if (c == d)
125 break;
126 c--;
127 }
128 return 7;
129 case 29:
130 switch (d)
131 {
132 case 35:
133 break;
134 default:
135 return 9;
136 }
137 if (c == d + 20)
138 break;
139 return 8;
140 case 24:
141 do
142 {
143 if (c == d)
144 break;
145 c--;
146 }
147 while (c >= 10);
148 return 19;
149 default:
150 for (int e = 0; e < c; ++e)
151 if (e == d)
152 break;
153 return 0;
154 }
155 break;
156 default:
157 return 0;
158 case 9:
159 return 17;
160 }
161 } // { dg-warning "control reaches end of non-void function" }
162
163 int
f5(int a,int b,int c)164 f5 (int a, int b, int c)
165 {
166 return f3 <0> (a, b, c);
167 }
168
169 int
f6(int a,int b,int c,int d)170 f6 (int a, int b, int c, int d)
171 {
172 return f4 <2> (a, b, c, d);
173 }
174