1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { $inline$classTypeTest(Object o)18*795d594fSAndroid Build Coastguard Worker public static boolean $inline$classTypeTest(Object o) { 19*795d594fSAndroid Build Coastguard Worker return ((SubMain) o) == o; 20*795d594fSAndroid Build Coastguard Worker } 21*795d594fSAndroid Build Coastguard Worker $inline$interfaceTypeTest(Object o)22*795d594fSAndroid Build Coastguard Worker public static boolean $inline$interfaceTypeTest(Object o) { 23*795d594fSAndroid Build Coastguard Worker return ((Itf) o) == o; 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker public static SubMain subMain; 27*795d594fSAndroid Build Coastguard Worker public static Main mainField; 28*795d594fSAndroid Build Coastguard Worker public static Unrelated unrelatedField; 29*795d594fSAndroid Build Coastguard Worker public static FinalUnrelated finalUnrelatedField; 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestNull() register (after) 32*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast classTypeTestNull()33*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestNull() { 34*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(null); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestExactMain() register (after) 38*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast classTypeTestExactMain()39*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestExactMain() { 40*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(new Main()); 41*795d594fSAndroid Build Coastguard Worker } 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestExactSubMain() register (after) 44*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast classTypeTestExactSubMain()45*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestExactSubMain() { 46*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(new SubMain()); 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestSubMainOrNull() register (after) 50*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast classTypeTestSubMainOrNull()51*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestSubMainOrNull() { 52*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(subMain); 53*795d594fSAndroid Build Coastguard Worker } 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestMainOrNull() register (after) 56*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast classTypeTestMainOrNull()57*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestMainOrNull() { 58*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(mainField); 59*795d594fSAndroid Build Coastguard Worker } 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestUnrelated() register (after) 62*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast classTypeTestUnrelated()63*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestUnrelated() { 64*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(unrelatedField); 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.classTypeTestFinalUnrelated() register (after) 68*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast classTypeTestFinalUnrelated()69*795d594fSAndroid Build Coastguard Worker public static boolean classTypeTestFinalUnrelated() { 70*795d594fSAndroid Build Coastguard Worker return $inline$classTypeTest(finalUnrelatedField); 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestNull() register (after) 74*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast interfaceTypeTestNull()75*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestNull() { 76*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(null); 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestExactMain() register (after) 80*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast interfaceTypeTestExactMain()81*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestExactMain() { 82*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(new Main()); 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestExactSubMain() register (after) 86*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast interfaceTypeTestExactSubMain()87*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestExactSubMain() { 88*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(new SubMain()); 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestSubMainOrNull() register (after) 92*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast interfaceTypeTestSubMainOrNull()93*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestSubMainOrNull() { 94*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(subMain); 95*795d594fSAndroid Build Coastguard Worker } 96*795d594fSAndroid Build Coastguard Worker 97*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestMainOrNull() register (after) 98*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast interfaceTypeTestMainOrNull()99*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestMainOrNull() { 100*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(mainField); 101*795d594fSAndroid Build Coastguard Worker } 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestUnrelated() register (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast interfaceTypeTestUnrelated()105*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestUnrelated() { 106*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(unrelatedField); 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker /// CHECK-START: boolean Main.interfaceTypeTestFinalUnrelated() register (after) 110*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast interfaceTypeTestFinalUnrelated()111*795d594fSAndroid Build Coastguard Worker public static boolean interfaceTypeTestFinalUnrelated() { 112*795d594fSAndroid Build Coastguard Worker return $inline$interfaceTypeTest(finalUnrelatedField); 113*795d594fSAndroid Build Coastguard Worker } 114*795d594fSAndroid Build Coastguard Worker 115*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.knownTestWithLoadedClass() register (after) 116*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: CheckCast knownTestWithLoadedClass()117*795d594fSAndroid Build Coastguard Worker public static String knownTestWithLoadedClass() { 118*795d594fSAndroid Build Coastguard Worker return (String)$inline$getString(); 119*795d594fSAndroid Build Coastguard Worker } 120*795d594fSAndroid Build Coastguard Worker 121*795d594fSAndroid Build Coastguard Worker /// CHECK-START: Itf Main.knownTestWithUnloadedClass() register (after) 122*795d594fSAndroid Build Coastguard Worker /// CHECK: CheckCast knownTestWithUnloadedClass()123*795d594fSAndroid Build Coastguard Worker public static Itf knownTestWithUnloadedClass() { 124*795d594fSAndroid Build Coastguard Worker return (Itf)$inline$getString(); 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker $inline$getString()127*795d594fSAndroid Build Coastguard Worker public static Object $inline$getString() { 128*795d594fSAndroid Build Coastguard Worker return new String(); 129*795d594fSAndroid Build Coastguard Worker } 130*795d594fSAndroid Build Coastguard Worker $inline$getMain()131*795d594fSAndroid Build Coastguard Worker public static Object $inline$getMain() { 132*795d594fSAndroid Build Coastguard Worker return new Main(); 133*795d594fSAndroid Build Coastguard Worker } 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.nonNullBoundType() register (after) 136*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: NullCheck nonNullBoundType()137*795d594fSAndroid Build Coastguard Worker public static void nonNullBoundType() { 138*795d594fSAndroid Build Coastguard Worker Main main = (Main)$inline$getMain(); 139*795d594fSAndroid Build Coastguard Worker main.getClass(); 140*795d594fSAndroid Build Coastguard Worker } 141*795d594fSAndroid Build Coastguard Worker main(String[] args)142*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 143*795d594fSAndroid Build Coastguard Worker classTypeTestNull(); 144*795d594fSAndroid Build Coastguard Worker try { 145*795d594fSAndroid Build Coastguard Worker classTypeTestExactMain(); 146*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 147*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 148*795d594fSAndroid Build Coastguard Worker classTypeTestExactSubMain(); 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker subMain = null; 151*795d594fSAndroid Build Coastguard Worker classTypeTestSubMainOrNull(); 152*795d594fSAndroid Build Coastguard Worker subMain = new SubMain(); 153*795d594fSAndroid Build Coastguard Worker classTypeTestSubMainOrNull(); 154*795d594fSAndroid Build Coastguard Worker 155*795d594fSAndroid Build Coastguard Worker mainField = null; 156*795d594fSAndroid Build Coastguard Worker classTypeTestMainOrNull(); 157*795d594fSAndroid Build Coastguard Worker mainField = new Main(); 158*795d594fSAndroid Build Coastguard Worker try { 159*795d594fSAndroid Build Coastguard Worker classTypeTestMainOrNull(); 160*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 161*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 162*795d594fSAndroid Build Coastguard Worker mainField = new SubMain(); 163*795d594fSAndroid Build Coastguard Worker classTypeTestMainOrNull(); 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker unrelatedField = null; 166*795d594fSAndroid Build Coastguard Worker classTypeTestUnrelated(); 167*795d594fSAndroid Build Coastguard Worker unrelatedField = new Unrelated(); 168*795d594fSAndroid Build Coastguard Worker try { 169*795d594fSAndroid Build Coastguard Worker classTypeTestUnrelated(); 170*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 171*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker finalUnrelatedField = null; 174*795d594fSAndroid Build Coastguard Worker classTypeTestFinalUnrelated(); 175*795d594fSAndroid Build Coastguard Worker finalUnrelatedField = new FinalUnrelated(); 176*795d594fSAndroid Build Coastguard Worker try { 177*795d594fSAndroid Build Coastguard Worker classTypeTestFinalUnrelated(); 178*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 179*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker interfaceTypeTestNull(); 182*795d594fSAndroid Build Coastguard Worker try { 183*795d594fSAndroid Build Coastguard Worker interfaceTypeTestExactMain(); 184*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 185*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 186*795d594fSAndroid Build Coastguard Worker interfaceTypeTestExactSubMain(); 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker subMain = null; 189*795d594fSAndroid Build Coastguard Worker interfaceTypeTestSubMainOrNull(); 190*795d594fSAndroid Build Coastguard Worker subMain = new SubMain(); 191*795d594fSAndroid Build Coastguard Worker interfaceTypeTestSubMainOrNull(); 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker mainField = null; 194*795d594fSAndroid Build Coastguard Worker interfaceTypeTestMainOrNull(); 195*795d594fSAndroid Build Coastguard Worker mainField = new Main(); 196*795d594fSAndroid Build Coastguard Worker try { 197*795d594fSAndroid Build Coastguard Worker interfaceTypeTestMainOrNull(); 198*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 199*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 200*795d594fSAndroid Build Coastguard Worker mainField = new SubMain(); 201*795d594fSAndroid Build Coastguard Worker interfaceTypeTestMainOrNull(); 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker unrelatedField = null; 204*795d594fSAndroid Build Coastguard Worker interfaceTypeTestUnrelated(); 205*795d594fSAndroid Build Coastguard Worker unrelatedField = new Unrelated(); 206*795d594fSAndroid Build Coastguard Worker try { 207*795d594fSAndroid Build Coastguard Worker interfaceTypeTestUnrelated(); 208*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 209*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 210*795d594fSAndroid Build Coastguard Worker 211*795d594fSAndroid Build Coastguard Worker finalUnrelatedField = null; 212*795d594fSAndroid Build Coastguard Worker interfaceTypeTestFinalUnrelated(); 213*795d594fSAndroid Build Coastguard Worker finalUnrelatedField = new FinalUnrelated(); 214*795d594fSAndroid Build Coastguard Worker try { 215*795d594fSAndroid Build Coastguard Worker interfaceTypeTestFinalUnrelated(); 216*795d594fSAndroid Build Coastguard Worker throw new Error("ClassCastException expected"); 217*795d594fSAndroid Build Coastguard Worker } catch (ClassCastException e) {} 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker } 220*795d594fSAndroid Build Coastguard Worker 221*795d594fSAndroid Build Coastguard Worker interface Itf { 222*795d594fSAndroid Build Coastguard Worker } 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker class SubMain extends Main implements Itf { 225*795d594fSAndroid Build Coastguard Worker } 226*795d594fSAndroid Build Coastguard Worker 227*795d594fSAndroid Build Coastguard Worker class Unrelated { 228*795d594fSAndroid Build Coastguard Worker } 229*795d594fSAndroid Build Coastguard Worker 230*795d594fSAndroid Build Coastguard Worker final class FinalUnrelated { 231*795d594fSAndroid Build Coastguard Worker } 232