xref: /aosp_15_r20/art/test/530-instanceof-checkcast/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 {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker   static Object exactCheck = new ExactCheck();
20*795d594fSAndroid Build Coastguard Worker   static Object abstractCheckImpl = new AbstractCheckImpl();
21*795d594fSAndroid Build Coastguard Worker   static Object interfaceCheckImpl = new InterfaceCheckImpl();
22*795d594fSAndroid Build Coastguard Worker   static Object normalCheck = new NormalCheck();
23*795d594fSAndroid Build Coastguard Worker   static Object regularObject = new Object();
24*795d594fSAndroid Build Coastguard Worker   static Object objectArray = new Object[2];
25*795d594fSAndroid Build Coastguard Worker   static Object intArray = new int[2];
26*795d594fSAndroid Build Coastguard Worker   static Object doubleArray = new double[2];
27*795d594fSAndroid Build Coastguard Worker   static Object exactArray = new ExactCheck[2];
28*795d594fSAndroid Build Coastguard Worker   static Object normalArray = new NormalCheck[2];
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker   static Object field;
31*795d594fSAndroid Build Coastguard Worker 
main(String[] args)32*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
33*795d594fSAndroid Build Coastguard Worker     checkInstanceOfNonTryCatch();
34*795d594fSAndroid Build Coastguard Worker     // We also check for a method with try/catch because the compiler then makes a slow
35*795d594fSAndroid Build Coastguard Worker     // path unconditionally save its live registers.
36*795d594fSAndroid Build Coastguard Worker     checkInstanceOfTryCatch();
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker     checkCheckCast();
39*795d594fSAndroid Build Coastguard Worker   }
40*795d594fSAndroid Build Coastguard Worker 
checkInstanceOfNonTryCatch()41*795d594fSAndroid Build Coastguard Worker   public static void checkInstanceOfNonTryCatch() {
42*795d594fSAndroid Build Coastguard Worker     check(true, exactCheck instanceof ExactCheck);
43*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof ExactCheck);
44*795d594fSAndroid Build Coastguard Worker 
45*795d594fSAndroid Build Coastguard Worker     check(true, abstractCheckImpl instanceof AbstractCheck);
46*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof AbstractCheck);
47*795d594fSAndroid Build Coastguard Worker 
48*795d594fSAndroid Build Coastguard Worker     check(true,  interfaceCheckImpl instanceof InterfaceCheck);
49*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof InterfaceCheck);
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker     check(true, normalCheck instanceof NormalCheck);
52*795d594fSAndroid Build Coastguard Worker     check(true, exactCheck instanceof NormalCheck);
53*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof NormalCheck);
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof int[]);
56*795d594fSAndroid Build Coastguard Worker     check(false, objectArray instanceof int[]);
57*795d594fSAndroid Build Coastguard Worker     check(true, intArray instanceof int[]);
58*795d594fSAndroid Build Coastguard Worker     check(false, doubleArray instanceof int[]);
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof ExactCheck[]);
61*795d594fSAndroid Build Coastguard Worker     check(false, objectArray instanceof ExactCheck[]);
62*795d594fSAndroid Build Coastguard Worker     check(false, doubleArray instanceof ExactCheck[]);
63*795d594fSAndroid Build Coastguard Worker     check(true, exactArray instanceof ExactCheck[]);
64*795d594fSAndroid Build Coastguard Worker     check(false, normalArray instanceof ExactCheck[]);
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof NormalCheck[]);
67*795d594fSAndroid Build Coastguard Worker     check(false, objectArray instanceof NormalCheck[]);
68*795d594fSAndroid Build Coastguard Worker     check(false, doubleArray instanceof NormalCheck[]);
69*795d594fSAndroid Build Coastguard Worker     check(true, exactArray instanceof NormalCheck[]);
70*795d594fSAndroid Build Coastguard Worker     check(true, normalArray instanceof NormalCheck[]);
71*795d594fSAndroid Build Coastguard Worker 
72*795d594fSAndroid Build Coastguard Worker     check(false, regularObject instanceof Object[]);
73*795d594fSAndroid Build Coastguard Worker     check(true, objectArray instanceof Object[]);
74*795d594fSAndroid Build Coastguard Worker     check(false, doubleArray instanceof Object[]);
75*795d594fSAndroid Build Coastguard Worker     check(true, exactArray instanceof Object[]);
76*795d594fSAndroid Build Coastguard Worker     check(true, normalArray instanceof Object[]);
77*795d594fSAndroid Build Coastguard Worker   }
78*795d594fSAndroid Build Coastguard Worker 
checkInstanceOfTryCatch()79*795d594fSAndroid Build Coastguard Worker   public static void checkInstanceOfTryCatch() {
80*795d594fSAndroid Build Coastguard Worker     try {
81*795d594fSAndroid Build Coastguard Worker       check(true, exactCheck instanceof ExactCheck);
82*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof ExactCheck);
83*795d594fSAndroid Build Coastguard Worker 
84*795d594fSAndroid Build Coastguard Worker       check(true, abstractCheckImpl instanceof AbstractCheck);
85*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof AbstractCheck);
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker       check(true,  interfaceCheckImpl instanceof InterfaceCheck);
88*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof InterfaceCheck);
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker       check(true, normalCheck instanceof NormalCheck);
91*795d594fSAndroid Build Coastguard Worker       check(true, exactCheck instanceof NormalCheck);
92*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof NormalCheck);
93*795d594fSAndroid Build Coastguard Worker 
94*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof int[]);
95*795d594fSAndroid Build Coastguard Worker       check(false, objectArray instanceof int[]);
96*795d594fSAndroid Build Coastguard Worker       check(true, intArray instanceof int[]);
97*795d594fSAndroid Build Coastguard Worker       check(false, doubleArray instanceof int[]);
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof ExactCheck[]);
100*795d594fSAndroid Build Coastguard Worker       check(false, objectArray instanceof ExactCheck[]);
101*795d594fSAndroid Build Coastguard Worker       check(false, doubleArray instanceof ExactCheck[]);
102*795d594fSAndroid Build Coastguard Worker       check(true, exactArray instanceof ExactCheck[]);
103*795d594fSAndroid Build Coastguard Worker       check(false, normalArray instanceof ExactCheck[]);
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof NormalCheck[]);
106*795d594fSAndroid Build Coastguard Worker       check(false, objectArray instanceof NormalCheck[]);
107*795d594fSAndroid Build Coastguard Worker       check(false, doubleArray instanceof NormalCheck[]);
108*795d594fSAndroid Build Coastguard Worker       check(true, exactArray instanceof NormalCheck[]);
109*795d594fSAndroid Build Coastguard Worker       check(true, normalArray instanceof NormalCheck[]);
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker       check(false, regularObject instanceof Object[]);
112*795d594fSAndroid Build Coastguard Worker       check(true, objectArray instanceof Object[]);
113*795d594fSAndroid Build Coastguard Worker       check(false, doubleArray instanceof Object[]);
114*795d594fSAndroid Build Coastguard Worker       check(true, exactArray instanceof Object[]);
115*795d594fSAndroid Build Coastguard Worker       check(true, normalArray instanceof Object[]);
116*795d594fSAndroid Build Coastguard Worker     } catch (Throwable t) {
117*795d594fSAndroid Build Coastguard Worker       throw new Error("Unreachable");
118*795d594fSAndroid Build Coastguard Worker     }
119*795d594fSAndroid Build Coastguard Worker   }
120*795d594fSAndroid Build Coastguard Worker 
check(boolean expected, boolean actual)121*795d594fSAndroid Build Coastguard Worker   public static void check(boolean expected, boolean actual) {
122*795d594fSAndroid Build Coastguard Worker     if (actual != expected) {
123*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected " + expected + ", got " + actual);
124*795d594fSAndroid Build Coastguard Worker     }
125*795d594fSAndroid Build Coastguard Worker   }
126*795d594fSAndroid Build Coastguard Worker 
checkCheckCast()127*795d594fSAndroid Build Coastguard Worker   public static void checkCheckCast() {
128*795d594fSAndroid Build Coastguard Worker     // Exact check.
129*795d594fSAndroid Build Coastguard Worker     field = (ExactCheck)exactCheck;
130*795d594fSAndroid Build Coastguard Worker     try {
131*795d594fSAndroid Build Coastguard Worker       field = (ExactCheck)regularObject;
132*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
133*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker     // Abstract check.
136*795d594fSAndroid Build Coastguard Worker     field = (AbstractCheck)abstractCheckImpl;
137*795d594fSAndroid Build Coastguard Worker     try {
138*795d594fSAndroid Build Coastguard Worker       field = (AbstractCheck)regularObject;
139*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
140*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
141*795d594fSAndroid Build Coastguard Worker 
142*795d594fSAndroid Build Coastguard Worker     // Interface check.
143*795d594fSAndroid Build Coastguard Worker     field = (InterfaceCheck)interfaceCheckImpl;
144*795d594fSAndroid Build Coastguard Worker     try {
145*795d594fSAndroid Build Coastguard Worker       field = (InterfaceCheck)regularObject;
146*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
147*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
148*795d594fSAndroid Build Coastguard Worker 
149*795d594fSAndroid Build Coastguard Worker     // Normal check.
150*795d594fSAndroid Build Coastguard Worker     field = (NormalCheck)normalCheck;
151*795d594fSAndroid Build Coastguard Worker     field = (NormalCheck)exactCheck;
152*795d594fSAndroid Build Coastguard Worker     try {
153*795d594fSAndroid Build Coastguard Worker       field = (NormalCheck)regularObject;
154*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
155*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
156*795d594fSAndroid Build Coastguard Worker 
157*795d594fSAndroid Build Coastguard Worker     // Primitive array check.
158*795d594fSAndroid Build Coastguard Worker     try {
159*795d594fSAndroid Build Coastguard Worker       field = (int[])regularObject;
160*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
161*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker     try {
164*795d594fSAndroid Build Coastguard Worker       field = (int[])objectArray;
165*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
166*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker     field = (int[])intArray;
169*795d594fSAndroid Build Coastguard Worker     try {
170*795d594fSAndroid Build Coastguard Worker       field = (int[])doubleArray;
171*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
172*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
173*795d594fSAndroid Build Coastguard Worker 
174*795d594fSAndroid Build Coastguard Worker     // Array with final component type check.
175*795d594fSAndroid Build Coastguard Worker     try {
176*795d594fSAndroid Build Coastguard Worker       field = (ExactCheck[])regularObject;
177*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
178*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
179*795d594fSAndroid Build Coastguard Worker 
180*795d594fSAndroid Build Coastguard Worker     try {
181*795d594fSAndroid Build Coastguard Worker       field = (ExactCheck[])objectArray;
182*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
183*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker     try {
186*795d594fSAndroid Build Coastguard Worker       field = (ExactCheck[])doubleArray;
187*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
188*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker     field = (ExactCheck[])exactArray;
191*795d594fSAndroid Build Coastguard Worker     try {
192*795d594fSAndroid Build Coastguard Worker       field = (ExactCheck[])normalArray;
193*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
194*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker     // Array with non final component type check.
197*795d594fSAndroid Build Coastguard Worker     try {
198*795d594fSAndroid Build Coastguard Worker       field = (NormalCheck[])regularObject;
199*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
200*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker     try {
203*795d594fSAndroid Build Coastguard Worker       field = (NormalCheck[])objectArray;
204*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
205*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
206*795d594fSAndroid Build Coastguard Worker 
207*795d594fSAndroid Build Coastguard Worker     try {
208*795d594fSAndroid Build Coastguard Worker       field = (NormalCheck[])doubleArray;
209*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
210*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
211*795d594fSAndroid Build Coastguard Worker 
212*795d594fSAndroid Build Coastguard Worker     field = (NormalCheck[])exactArray;
213*795d594fSAndroid Build Coastguard Worker     field = (NormalCheck[])normalArray;
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker     // Object[] check.
216*795d594fSAndroid Build Coastguard Worker     try{
217*795d594fSAndroid Build Coastguard Worker       field = (Object[])regularObject;
218*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
219*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
220*795d594fSAndroid Build Coastguard Worker 
221*795d594fSAndroid Build Coastguard Worker     field = (Object[])objectArray;
222*795d594fSAndroid Build Coastguard Worker     try {
223*795d594fSAndroid Build Coastguard Worker       field = (Object[])doubleArray;
224*795d594fSAndroid Build Coastguard Worker       throw new Error("Can't reach here");
225*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ignore) {}
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker     field = (Object[])exactArray;
228*795d594fSAndroid Build Coastguard Worker     field = (Object[])normalArray;
229*795d594fSAndroid Build Coastguard Worker   }
230*795d594fSAndroid Build Coastguard Worker }
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker class NormalCheck {
233*795d594fSAndroid Build Coastguard Worker }
234*795d594fSAndroid Build Coastguard Worker 
235*795d594fSAndroid Build Coastguard Worker final class ExactCheck extends NormalCheck {
236*795d594fSAndroid Build Coastguard Worker }
237*795d594fSAndroid Build Coastguard Worker 
238*795d594fSAndroid Build Coastguard Worker abstract class AbstractCheck {
239*795d594fSAndroid Build Coastguard Worker }
240*795d594fSAndroid Build Coastguard Worker 
241*795d594fSAndroid Build Coastguard Worker class AbstractCheckImpl extends AbstractCheck {
242*795d594fSAndroid Build Coastguard Worker }
243*795d594fSAndroid Build Coastguard Worker 
244*795d594fSAndroid Build Coastguard Worker interface InterfaceCheck {
245*795d594fSAndroid Build Coastguard Worker }
246*795d594fSAndroid Build Coastguard Worker 
247*795d594fSAndroid Build Coastguard Worker class InterfaceCheckImpl implements InterfaceCheck {
248*795d594fSAndroid Build Coastguard Worker }
249