1 /* 2 * Copyright (c) 2024, 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 import java.lang.runtime.CodeReflection; 25 import java.util.Collection; 26 import java.util.List; 27 28 /* 29 * @test 30 * @summary Smoke test for code reflection with cast expressions. 31 * @build CastInstanceOfTest 32 * @build CodeReflectionTester 33 * @run main CodeReflectionTester CastInstanceOfTest 34 */ 35 36 public class CastInstanceOfTest { 37 38 @CodeReflection 39 @IR(""" 40 func @"test1" (%0 : CastInstanceOfTest, %1 : java.lang.Object)void -> { 41 %2 : Var<java.lang.Object> = var %1 @"o"; 42 %3 : java.lang.Object = var.load %2; 43 %4 : java.lang.String = cast %3 @"java.lang.String"; 44 %5 : Var<java.lang.String> = var %4 @"s"; 45 %6 : java.lang.String = var.load %5; 46 %7 : Var<java.lang.String> = var %6 @"ss"; 47 return; 48 }; 49 """) 50 void test1(Object o) { 51 String s = (String) o; 52 String ss = (String) s; 53 } 54 55 @CodeReflection 56 @IR(""" 57 func @"test2" (%0 : CastInstanceOfTest, %1 : java.lang.Object)void -> { 58 %2 : Var<java.lang.Object> = var %1 @"o"; 59 %3 : java.lang.Object = var.load %2; 60 %4 : java.util.List<java.lang.String> = cast %3 @"java.util.List"; 61 %5 : Var<java.util.List<java.lang.String>> = var %4 @"l"; 62 %6 : java.util.List<java.lang.String> = var.load %5; 63 %7 : Var<java.util.Collection<java.lang.String>> = var %6 @"c1"; 64 %8 : java.util.List<java.lang.String> = var.load %5; 65 %9 : Var<java.util.Collection<java.lang.String>> = var %8 @"c2"; 66 return; 67 }; 68 """) 69 void test2(Object o) { 70 List<String> l = (List<String>) o; 71 Collection<String> c1 = (List<String>) l; 72 Collection<String> c2 = (Collection) l; 73 } 74 75 @CodeReflection 76 @IR(""" 77 func @"test3" (%0 : CastInstanceOfTest, %1 : java.util.List<java.lang.String>)void -> { 78 %2 : Var<java.util.List<java.lang.String>> = var %1 @"l"; 79 %3 : java.util.List<java.lang.String> = var.load %2; 80 %4 : Var<java.util.List> = var %3 @"raw"; 81 %5 : java.util.List = var.load %4; 82 %6 : Var<java.util.List<java.lang.Number>> = var %5 @"ln"; 83 return; 84 }; 85 """) 86 void test3(List<String> l) { 87 List raw = l; 88 List<Number> ln = raw; 89 } 90 91 @CodeReflection 92 @IR(""" 93 func @"test4" (%0 : CastInstanceOfTest, %1 : int)void -> { 94 %2 : Var<int> = var %1 @"i"; 95 %3 : int = var.load %2; 96 %4 : long = conv %3; 97 %5 : Var<long> = var %4 @"l"; 98 return; 99 }; 100 """) 101 void test4(int i) { 102 long l = (int) i; 103 } 104 105 @CodeReflection 106 @IR(""" 107 func @"test5" (%0 : CastInstanceOfTest, %1 : java.lang.Object)void -> { 108 %2 : Var<java.lang.Object> = var %1 @"o"; 109 %3 : java.lang.Object = var.load %2; 110 %4 : boolean = instanceof %3 @"java.lang.String"; 111 %5 : Var<boolean> = var %4 @"b"; 112 return; 113 }; 114 """) 115 void test5(Object o) { 116 boolean b = o instanceof String; 117 } 118 119 @CodeReflection 120 @IR(""" 121 func @"test6" (%0 : CastInstanceOfTest, %1 : java.util.List<java.lang.Object>)void -> { 122 %2 : Var<java.util.List<java.lang.Object>> = var %1 @"l"; 123 %3 : java.util.List<java.lang.Object> = var.load %2; 124 %4 : int = constant @"0"; 125 %5 : java.lang.Object = invoke %3 %4 @"java.util.List::get(int)java.lang.Object"; 126 %6 : boolean = instanceof %5 @"java.lang.String"; 127 %7 : Var<boolean> = var %6 @"b"; 128 return; 129 }; 130 """) 131 void test6(List<Object> l) { 132 boolean b = l.get(0) instanceof String; 133 } 134 }