File: PrimitivePatternsSwitchErrors.java

package info (click to toggle)
openjdk-25 25.0.1%2B8-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 825,408 kB
  • sloc: java: 5,585,680; cpp: 1,333,948; xml: 1,321,242; ansic: 488,034; asm: 404,003; objc: 21,088; sh: 15,106; javascript: 13,265; python: 8,319; makefile: 2,518; perl: 357; awk: 351; pascal: 103; exp: 83; sed: 72; jsp: 24
file content (268 lines) | stat: -rw-r--r-- 6,995 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/*
 * @test /nodynamiccopyright/
 * @bug 8304487 8325653 8332463
 * @summary Compiler Implementation for Primitive types in patterns, instanceof, and switch (Preview)
 * @enablePreview
 * @compile/fail/ref=PrimitivePatternsSwitchErrors.out -XDrawDiagnostics -XDshould-stop.at=FLOW PrimitivePatternsSwitchErrors.java
 */
public class PrimitivePatternsSwitchErrors {
    record R_int(int x) {}

    public static void dominationBetweenPrimitivePatterns() {
        int i = 42;
        switch (i) {
            case short s -> System.out.println("its a short");
            case byte b  -> System.out.println("its a byte"); // Error - dominated!
            default      -> System.out.println("any other integral value");
        }
    }

    public static int dominationWithRecordPatterns() {
        R_int r = new R_int(42);
        return switch (r) {
            case R_int(int x) -> 1;
            case R_int(byte x) -> 2;  // Error - dominated!
        };
    }

    public static int inconvertibleNestedComponent() {
        R_int r = new R_int(42);
        return switch (r) {
            case R_int(Long x) -> 1; // inconvertible
        };
    }

    public static int nonExhaustive1() {
        int i = 42;
        return switch (i) {  // Error - not exhaustive
            case short s -> s;
        };
    }

    public static int nonExhaustive2() {
        int i = 42;
        return switch (i) { // Error - not exhaustive
            case byte  b -> 1;
            case short s -> 2;
        };
    }

    public static int nonExhaustive3() {
        int i = 42;
        return switch (i) { // Error - not exhaustive
            case byte  b -> 1;
            case float f -> 2;
        };
    }

    public static int dominationBetweenBoxedAndPrimitive() {
        int i = 42;
        return switch (i) {
            case Integer ib  -> ib;
            case byte ip     -> ip; // OK - not dominated!
        };
    }

    public static int constantDominatedWithPrimitivePattern() {
        int i = 42;
        return switch (i) {
            case int j -> 42;
            case 43    -> -1;   // Error - dominated!
        };
    }

    public static int constantDominatedWithFloatPrimitivePattern() {
        float f = 42.0f;
        return switch (f) {
            case Float ff -> 42;
            case 43.0f    -> -1;   // Error - dominated!
        };
    }

    void switchLongOverByte(byte b) {
        switch (b) {
            case 0L: return ;
        }
    }

    void switchOverPrimitiveFloatFromInt(float f) {
        switch (f) {
            case 16777216:
                break;
            case 16777217:
                break;
            default:
                break;
        }
    }

    void switchOverNotRepresentableFloat(Float f) {
        switch (f) {
            case 1.0f:
                break;
            case 0.999999999f:
                break;
            case Float fi:
                break;
        }
    }

    int switchOverPrimitiveBooleanExhaustiveWithNonPermittedDefault(boolean b) {
        return switch (b) {
            case true -> 1;
            case false -> 2;
            default -> 3;
        };
    }

    int switchOverPrimitiveBooleanExhaustiveWithNonPermittedDefaultStatement(boolean b) {
        switch (b) {
            case true: return 1;
            case false: return 2;
            default: return 3;
        }
    }

    int switchOverPrimitiveBooleanExhaustiveWithNonPermittedUnconditionalStatement(boolean b) {
        switch (b) {
            case true: return 1;
            case false: return 2;
            case boolean bb: return 3; // error
        }
    }

    void switchCombinationsNonIntegral() {
        float f = 0f;
        long l = 0L;
        double d = 0d;
        Float fB = 0F;
        Long lB = 0L;
        Double dB = 0D;

        switch (f) {
            case 1l: return;
            case 2f: return;
            case 3d: return;
            default:
        }

        switch (l) {
            case 1l: return;
            case 2f: return;
            case 3d: return;
            default:
        }

        switch (d) {
            case 1l: return;
            case 2f: return;
            case 3d: return;
            default:
        }

        switch (fB) {
            case 1l: return;
            case 2f: return;
            case 3d: return;
            default:
        }

        switch (lB) {
            case 1l: return;
            case 2f: return;
            case 3d: return;
            default:
        }

        switch (dB) {
            case 1l: return;
            case 2f: return;
            case 3d: return;
            default:
        }
    }

    int switchOverPrimitiveBooleanExhaustiveWithNonPermittedUnconditional(boolean b) {
        return switch (b) {
            case true -> 1;
            case false -> 2;
            case boolean bb -> 3; // error
        };
    }

    int duplicateUnconditionalWithPrimitives(int i) {
        return switch (i) {
            case int ii -> 1;
            case long l -> 2; // error
        };
    }

    int booleanSingleCase1(boolean b) {
        return switch (b) {
            case true -> 1;
        };
    }

    int booleanSingleCase2(boolean b) {
        switch (b) {
            case true: return 1;
        }
    }

    void nullAndPrimitive() {
        int i = 42;
        switch (i) {
            case short s -> System.out.println("its a short");
            case null    -> System.out.println("oops");
            default      -> System.out.println("any other integral value");
        }
    }

    public static int nonExhaustive4() {
        Number n = Byte.valueOf((byte) 42);
        return switch (n) { // Error - not exhaustive
            case byte  b when b == 42 -> 1;
            case byte  b -> -1 ;
        };
    }

    public static int nonExhaustive5() {
        Object n = 42;
        return switch (n) { // Error - not exhaustive
            case int  b when b == 42 -> 1;
            case int  b -> -1 ;
        };
    }

    public static int nonExhaustive6() {
        Object n = 42;
        return switch (n) { // Error - not exhaustive
            case byte b -> -1 ;
            case int b -> -2 ;
        };
    }

    public static int disallowedUnboxingAndNarrowing1() {
        Long n = 42l;
        return switch (n) { // Error - not exhaustive and not allowed
            case char c -> -1 ;
        };
    }

    public static int disallowedUnboxingAndNarrowing2() {
        Long n = 42l;
        return switch (n) { // Error - not exhaustive and not allowed
            case int c -> -1 ;
        };
    }

    public static char disallowedUnboxingAndWidening(Short test) {
        return switch (test) {
            case char c -> c; // Error - not exhaustive and not allowed
        };
    }

    public static <T extends Integer> boolean wideningReferenceConversionUnboxingAndNarrowingPrimitive(T i) {
        return i instanceof byte b;  // not allowed as a conversion
    }
}