xref: /aosp_15_r20/external/skia/resources/sksl/shared/SwitchWithEarlyReturn.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1uniform half4 colorGreen, colorRed;
2
3bool return_in_one_case(int x) {
4    int val = 0;
5    switch (x) {
6        case 1:
7            ++val;
8            return false;
9            ++val;  // unreachable
10        default: ++val;
11    }
12
13    // reachable
14    return val == 1;
15}
16
17bool return_in_default(int x) {
18    int val = 0;
19    switch (x) {
20        default: return true;
21    }
22
23    // unreachable
24    ++val;
25    return val == 1;
26}
27
28bool return_in_every_case(int x) {
29    int val = 0;
30    switch (x) {
31        case 1: return false;
32        default: return true;
33    }
34
35    // unreachable
36    ++val;
37    return val == 1;
38}
39
40bool return_in_every_case_no_default(int x) {
41    int val = 0;
42    switch (x) {
43        case 1: return false;
44        case 2: return true;
45    }
46
47    // reachable
48    ++val;
49    return val == 1;
50}
51
52bool case_has_break_before_return(int x) {
53    int val = 0;
54    switch (x) {
55        case 1:
56            break;
57            return false;  // unreachable
58        case 2: return true;
59        default: return true;
60    }
61
62    // reachable
63    ++val;
64    return val == 1;
65}
66
67bool case_has_break_after_return(int x) {
68    int val = 0;
69    switch (x) {
70        case 1:
71            return false;
72            break;  // unreachable
73        case 2: return true;
74        default: return true;
75    }
76
77    // unreachable
78    ++val;
79    return val == 1;
80}
81
82bool no_return_in_default(int x) {
83    int val = 0;
84    switch (x) {
85        case 1: return false;
86        case 2: return true;
87        default: break;
88    }
89
90    // reachable
91    ++val;
92    return val == 1;
93}
94
95bool empty_default(int x) {
96    int val = 0;
97    switch (x) {
98        case 1: return false;
99        case 2: return true;
100        default:
101    }
102
103    // reachable
104    ++val;
105    return val == 1;
106}
107
108bool return_with_fallthrough(int x) {
109    int val = 0;
110    switch (x) {
111        case 1:
112        case 2: return true;
113        default: return false;
114    }
115
116    // unreachable
117    ++val;
118    return val == 1;
119}
120
121bool fallthrough_ends_in_break(int x) {
122    int val = 0;
123    switch (x) {
124        case 1:
125        case 2: break;
126        default: return false;
127    }
128
129    // reachable
130    ++val;
131    return val == 1;
132}
133
134bool fallthrough_to_default_with_break(int x) {
135    int val = 0;
136    switch (x) {
137        case 1:
138        case 2:
139        default: break;
140    }
141
142    // reachable
143    ++val;
144    return val == 1;
145}
146
147bool fallthrough_to_default_with_return(int x) {
148    int val = 0;
149    switch (x) {
150        case 1:
151        case 2:
152        default: return true;
153    }
154
155    // unreachable
156    ++val;
157    return val == 1;
158}
159
160bool fallthrough_with_loop_break(int x) {
161    int val = 0;
162    switch (x) {
163        case 1: for (int i = 0; i < 5; ++i) {
164            ++val;
165            break;  // break only applies to loop, should fallthrough
166        }
167        case 2:
168        default: return true;
169    }
170
171    // unreachable
172    ++val;
173    return val == 1;
174}
175
176bool fallthrough_with_loop_continue(int x) {
177    int val = 0;
178    switch (x) {
179        case 1: for (int i = 0; i < 5; ++i) {
180            ++val;
181            continue;  // continue only applies to loop, should fallthrough
182        }
183        case 2:
184        default: return true;
185    }
186
187    // unreachable
188    ++val;
189    return val == 1;
190}
191
192half4 main(float2 coords) {
193    int x = int(colorGreen.g);
194    return (return_in_one_case(x) &&
195            return_in_default(x) &&
196            return_in_every_case(x) &&
197            return_in_every_case_no_default(x) &&
198            case_has_break_before_return(x) &&
199            case_has_break_after_return(x) &&
200            no_return_in_default(x) &&
201            empty_default(x) &&
202            return_with_fallthrough(x) &&
203            fallthrough_ends_in_break(x) &&
204            fallthrough_to_default_with_break(x) &&
205            fallthrough_to_default_with_return(x) &&
206            fallthrough_with_loop_break(x) &&
207            fallthrough_with_loop_continue(x)) ? colorGreen : colorRed;
208}
209