/*
* 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 {
}