/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class Main { public static boolean $inline$classTypeTest(Object o) { return ((SubMain)o) == o; } public static boolean $inline$interfaceTypeTest(Object o) { return ((Itf)o) == o; } public static SubMain subMain; public static Main mainField; public static Unrelated unrelatedField; public static FinalUnrelated finalUnrelatedField; /// CHECK-START: boolean Main.classTypeTestNull() register (after) /// CHECK-NOT: CheckCast public static boolean classTypeTestNull() { return $inline$classTypeTest(null); } /// CHECK-START: boolean Main.classTypeTestExactMain() register (after) /// CHECK: CheckCast public static boolean classTypeTestExactMain() { return $inline$classTypeTest(new Main()); } /// CHECK-START: boolean Main.classTypeTestExactSubMain() register (after) /// CHECK-NOT: CheckCast public static boolean classTypeTestExactSubMain() { return $inline$classTypeTest(new SubMain()); } /// CHECK-START: boolean Main.classTypeTestSubMainOrNull() register (after) /// CHECK-NOT: CheckCast public static boolean classTypeTestSubMainOrNull() { return $inline$classTypeTest(subMain); } /// CHECK-START: boolean Main.classTypeTestMainOrNull() register (after) /// CHECK: CheckCast public static boolean classTypeTestMainOrNull() { return $inline$classTypeTest(mainField); } /// CHECK-START: boolean Main.classTypeTestUnrelated() register (after) /// CHECK: CheckCast public static boolean classTypeTestUnrelated() { return $inline$classTypeTest(unrelatedField); } /// CHECK-START: boolean Main.classTypeTestFinalUnrelated() register (after) /// CHECK: CheckCast public static boolean classTypeTestFinalUnrelated() { return $inline$classTypeTest(finalUnrelatedField); } /// CHECK-START: boolean Main.interfaceTypeTestNull() register (after) /// CHECK-NOT: CheckCast public static boolean interfaceTypeTestNull() { return $inline$interfaceTypeTest(null); } /// CHECK-START: boolean Main.interfaceTypeTestExactMain() register (after) /// CHECK: CheckCast public static boolean interfaceTypeTestExactMain() { return $inline$interfaceTypeTest(new Main()); } /// CHECK-START: boolean Main.interfaceTypeTestExactSubMain() register (after) /// CHECK-NOT: CheckCast public static boolean interfaceTypeTestExactSubMain() { return $inline$interfaceTypeTest(new SubMain()); } /// CHECK-START: boolean Main.interfaceTypeTestSubMainOrNull() register (after) /// CHECK-NOT: CheckCast public static boolean interfaceTypeTestSubMainOrNull() { return $inline$interfaceTypeTest(subMain); } /// CHECK-START: boolean Main.interfaceTypeTestMainOrNull() register (after) /// CHECK: CheckCast public static boolean interfaceTypeTestMainOrNull() { return $inline$interfaceTypeTest(mainField); } /// CHECK-START: boolean Main.interfaceTypeTestUnrelated() register (after) /// CHECK: CheckCast public static boolean interfaceTypeTestUnrelated() { return $inline$interfaceTypeTest(unrelatedField); } /// CHECK-START: boolean Main.interfaceTypeTestFinalUnrelated() register (after) /// CHECK: CheckCast public static boolean interfaceTypeTestFinalUnrelated() { return $inline$interfaceTypeTest(finalUnrelatedField); } /// CHECK-START: java.lang.String Main.knownTestWithLoadedClass() register (after) /// CHECK-NOT: CheckCast public static String knownTestWithLoadedClass() { return (String)$inline$getString(); } /// CHECK-START: Itf Main.knownTestWithUnloadedClass() register (after) /// CHECK: CheckCast public static Itf knownTestWithUnloadedClass() { return (Itf)$inline$getString(); } public static Object $inline$getString() { return new String(); } public static Object $inline$getMain() { return new Main(); } /// CHECK-START: void Main.nonNullBoundType() register (after) /// CHECK-NOT: NullCheck public static void nonNullBoundType() { Main main = (Main)$inline$getMain(); main.getClass(); } public static void main(String[] args) { classTypeTestNull(); try { classTypeTestExactMain(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} classTypeTestExactSubMain(); subMain = null; classTypeTestSubMainOrNull(); subMain = new SubMain(); classTypeTestSubMainOrNull(); mainField = null; classTypeTestMainOrNull(); mainField = new Main(); try { classTypeTestMainOrNull(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} mainField = new SubMain(); classTypeTestMainOrNull(); unrelatedField = null; classTypeTestUnrelated(); unrelatedField = new Unrelated(); try { classTypeTestUnrelated(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} finalUnrelatedField = null; classTypeTestFinalUnrelated(); finalUnrelatedField = new FinalUnrelated(); try { classTypeTestFinalUnrelated(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} interfaceTypeTestNull(); try { interfaceTypeTestExactMain(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} interfaceTypeTestExactSubMain(); subMain = null; interfaceTypeTestSubMainOrNull(); subMain = new SubMain(); interfaceTypeTestSubMainOrNull(); mainField = null; interfaceTypeTestMainOrNull(); mainField = new Main(); try { interfaceTypeTestMainOrNull(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} mainField = new SubMain(); interfaceTypeTestMainOrNull(); unrelatedField = null; interfaceTypeTestUnrelated(); unrelatedField = new Unrelated(); try { interfaceTypeTestUnrelated(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} finalUnrelatedField = null; interfaceTypeTestFinalUnrelated(); finalUnrelatedField = new FinalUnrelated(); try { interfaceTypeTestFinalUnrelated(); throw new Error("ClassCastException expected"); } catch (ClassCastException e) {} } } interface Itf { } class SubMain extends Main implements Itf { } class Unrelated { } final class FinalUnrelated { }