1 /*
2 * Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /*
25 * @test
26 * @modules jdk.incubator.code
27 * @summary test lowering of assert statements
28 * @build TestAssert
29 * @build CodeReflectionTester
30 * @run main CodeReflectionTester TestAssert
31 */
32
33 import jdk.incubator.code.Reflect;
34
35 public class TestAssert {
36
37 @Reflect
38 @LoweredModel(value = """
39 func @"testNoDetail" (%0 : java.type:"int")java.type:"int" -> {
40 %1 : Var<java.type:"int"> = var %0 @"i";
41 %2 : java.type:"int" = var.load %1;
42 %3 : java.type:"int" = constant @0;
43 %4 : java.type:"boolean" = ge %2 %3;
44 cbranch %4 ^block_1 ^block_2;
45
46 ^block_1:
47 %5 : java.type:"int" = var.load %1;
48 return %5;
49
50 ^block_2:
51 %6 : java.type:"java.lang.AssertionError" = new @java.ref:"java.lang.AssertionError::()";
52 throw %6;
53 };
54 """, ssa = false)
55 static int testNoDetail(int i) {
56 assert i >= 0;
57 return i;
58 }
59
60 @Reflect
61 @LoweredModel(value = """
62 func @"testStringDetail" (%0 : java.type:"int")java.type:"int" -> {
63 %1 : Var<java.type:"int"> = var %0 @"i";
64 %2 : java.type:"int" = var.load %1;
65 %3 : java.type:"int" = constant @0;
66 %4 : java.type:"boolean" = ge %2 %3;
67 cbranch %4 ^block_1 ^block_2;
68
69 ^block_1:
70 %5 : java.type:"int" = var.load %1;
71 return %5;
72
73 ^block_2:
74 %6 : java.type:"java.lang.String" = constant @"Failed";
75 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(java.lang.Object)";
76 throw %7;
77 };
78 """, ssa = false)
79 static int testStringDetail(int i) {
80 assert i >= 0 : "Failed";
81 return i;
82 }
83
84 @Reflect
85 @LoweredModel(value = """
86 func @"testBooleanDetail" (%0 : java.type:"int")java.type:"int" -> {
87 %1 : Var<java.type:"int"> = var %0 @"i";
88 %2 : java.type:"int" = var.load %1;
89 %3 : java.type:"int" = constant @0;
90 %4 : java.type:"boolean" = ge %2 %3;
91 cbranch %4 ^block_1 ^block_2;
92
93 ^block_1:
94 %5 : java.type:"int" = var.load %1;
95 return %5;
96
97 ^block_2:
98 %6 : java.type:"boolean" = constant @false;
99 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(boolean)";
100 throw %7;
101 };
102 """, ssa = false)
103 static int testBooleanDetail(int i) {
104 assert i >= 0 : false;
105 return i;
106 }
107
108 @Reflect
109 @LoweredModel(value = """
110 func @"testCharDetail" (%0 : java.type:"int")java.type:"int" -> {
111 %1 : Var<java.type:"int"> = var %0 @"i";
112 %2 : java.type:"int" = var.load %1;
113 %3 : java.type:"int" = constant @0;
114 %4 : java.type:"boolean" = ge %2 %3;
115 cbranch %4 ^block_1 ^block_2;
116
117 ^block_1:
118 %5 : java.type:"int" = var.load %1;
119 return %5;
120
121 ^block_2:
122 %6 : java.type:"char" = constant @'a';
123 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(char)";
124 throw %7;
125 };
126 """, ssa = false)
127 static int testCharDetail(int i) {
128 assert i >= 0 : 'a';
129 return i;
130 }
131
132 @Reflect
133 @LoweredModel(value = """
134 func @"testByteDetail" (%0 : java.type:"int")java.type:"int" -> {
135 %1 : Var<java.type:"int"> = var %0 @"i";
136 %2 : java.type:"int" = var.load %1;
137 %3 : java.type:"int" = constant @0;
138 %4 : java.type:"boolean" = ge %2 %3;
139 cbranch %4 ^block_1 ^block_2;
140
141 ^block_1:
142 %5 : java.type:"int" = var.load %1;
143 return %5;
144
145 ^block_2:
146 %6 : java.type:"int" = constant @10;
147 %7 : java.type:"byte" = conv %6;
148 %8 : java.type:"int" = conv %7;
149 %9 : java.type:"java.lang.AssertionError" = new %8 @java.ref:"java.lang.AssertionError::(int)";
150 throw %9;
151 };
152 """, ssa = false)
153 static int testByteDetail(int i) {
154 assert i >= 0 : (byte) 10;
155 return i;
156 }
157
158 @Reflect
159 @LoweredModel(value = """
160 func @"testShortDetail" (%0 : java.type:"int")java.type:"int" -> {
161 %1 : Var<java.type:"int"> = var %0 @"i";
162 %2 : java.type:"int" = var.load %1;
163 %3 : java.type:"int" = constant @0;
164 %4 : java.type:"boolean" = ge %2 %3;
165 cbranch %4 ^block_1 ^block_2;
166
167 ^block_1:
168 %5 : java.type:"int" = var.load %1;
169 return %5;
170
171 ^block_2:
172 %6 : java.type:"int" = constant @10;
173 %7 : java.type:"short" = conv %6;
174 %8 : java.type:"int" = conv %7;
175 %9 : java.type:"java.lang.AssertionError" = new %8 @java.ref:"java.lang.AssertionError::(int)";
176 throw %9;
177 };
178 """, ssa = false)
179 static int testShortDetail(int i) {
180 assert i >= 0 : (short) 10;
181 return i;
182 }
183
184 @Reflect
185 @LoweredModel(value = """
186 func @"testIntDetail" (%0 : java.type:"int")java.type:"int" -> {
187 %1 : Var<java.type:"int"> = var %0 @"i";
188 %2 : java.type:"int" = var.load %1;
189 %3 : java.type:"int" = constant @0;
190 %4 : java.type:"boolean" = ge %2 %3;
191 cbranch %4 ^block_1 ^block_2;
192
193 ^block_1:
194 %5 : java.type:"int" = var.load %1;
195 return %5;
196
197 ^block_2:
198 %6 : java.type:"int" = constant @10;
199 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(int)";
200 throw %7;
201 };
202 """, ssa = false)
203 static int testIntDetail(int i) {
204 assert i >= 0 : 10;
205 return i;
206 }
207
208 @Reflect
209 @LoweredModel(value = """
210 func @"testLongDetail" (%0 : java.type:"int")java.type:"int" -> {
211 %1 : Var<java.type:"int"> = var %0 @"i";
212 %2 : java.type:"int" = var.load %1;
213 %3 : java.type:"int" = constant @0;
214 %4 : java.type:"boolean" = ge %2 %3;
215 cbranch %4 ^block_1 ^block_2;
216
217 ^block_1:
218 %5 : java.type:"int" = var.load %1;
219 return %5;
220
221 ^block_2:
222 %6 : java.type:"long" = constant @10;
223 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(long)";
224 throw %7;
225 };
226 """, ssa = false)
227 static int testLongDetail(int i) {
228 assert i >= 0 : 10l;
229 return i;
230 }
231
232 @Reflect
233 @LoweredModel(value = """
234 func @"testFloatDetail" (%0 : java.type:"int")java.type:"int" -> {
235 %1 : Var<java.type:"int"> = var %0 @"i";
236 %2 : java.type:"int" = var.load %1;
237 %3 : java.type:"int" = constant @0;
238 %4 : java.type:"boolean" = ge %2 %3;
239 cbranch %4 ^block_1 ^block_2;
240
241 ^block_1:
242 %5 : java.type:"int" = var.load %1;
243 return %5;
244
245 ^block_2:
246 %6 : java.type:"float" = constant @1.0f;
247 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(float)";
248 throw %7;
249 };
250 """, ssa = false)
251 static int testFloatDetail(int i) {
252 assert i >= 0 : 1.0f;
253 return i;
254 }
255
256 @Reflect
257 @LoweredModel(value = """
258 func @"testDoubleDetail" (%0 : java.type:"int")java.type:"int" -> {
259 %1 : Var<java.type:"int"> = var %0 @"i";
260 %2 : java.type:"int" = var.load %1;
261 %3 : java.type:"int" = constant @0;
262 %4 : java.type:"boolean" = ge %2 %3;
263 cbranch %4 ^block_1 ^block_2;
264
265 ^block_1:
266 %5 : java.type:"int" = var.load %1;
267 return %5;
268
269 ^block_2:
270 %6 : java.type:"double" = constant @1.0;
271 %7 : java.type:"java.lang.AssertionError" = new %6 @java.ref:"java.lang.AssertionError::(double)";
272 throw %7;
273 };
274 """, ssa = false)
275 static int testDoubleDetail(int i) {
276 assert i >= 0 : 1.0;
277 return i;
278 }
279 }