xref: /aosp_15_r20/art/test/495-checker-checkcast-tests/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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