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 }