xref: /aosp_15_r20/art/test/529-checker-unresolved/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 extends UnresolvedSuperClass {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.callInvokeUnresolvedStatic() register (before)
20*795d594fSAndroid Build Coastguard Worker   /// CHECK:        InvokeUnresolved invoke_type:static
callInvokeUnresolvedStatic()21*795d594fSAndroid Build Coastguard Worker   static public void callInvokeUnresolvedStatic() {
22*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticMethod();
23*795d594fSAndroid Build Coastguard Worker   }
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.callInvokeUnresolvedVirtual(UnresolvedClass) register (before)
26*795d594fSAndroid Build Coastguard Worker   /// CHECK:        InvokeUnresolved invoke_type:virtual
callInvokeUnresolvedVirtual(UnresolvedClass c)27*795d594fSAndroid Build Coastguard Worker   static public void callInvokeUnresolvedVirtual(UnresolvedClass c) {
28*795d594fSAndroid Build Coastguard Worker     c.virtualMethod();
29*795d594fSAndroid Build Coastguard Worker   }
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.callInvokeUnresolvedInterface(UnresolvedInterface) register (before)
32*795d594fSAndroid Build Coastguard Worker   /// CHECK:        InvokeUnresolved invoke_type:interface
callInvokeUnresolvedInterface(UnresolvedInterface c)33*795d594fSAndroid Build Coastguard Worker   static public void callInvokeUnresolvedInterface(UnresolvedInterface c) {
34*795d594fSAndroid Build Coastguard Worker     c.interfaceMethod();
35*795d594fSAndroid Build Coastguard Worker   }
36*795d594fSAndroid Build Coastguard Worker 
callInvokeUnresolvedSuper(Main c)37*795d594fSAndroid Build Coastguard Worker   static public void callInvokeUnresolvedSuper(Main c) {
38*795d594fSAndroid Build Coastguard Worker     c.superMethod();
39*795d594fSAndroid Build Coastguard Worker   }
40*795d594fSAndroid Build Coastguard Worker 
41*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.superMethod() register (before)
42*795d594fSAndroid Build Coastguard Worker   /// CHECK:        InvokeUnresolved invoke_type:super
superMethod()43*795d594fSAndroid Build Coastguard Worker   public void superMethod() {
44*795d594fSAndroid Build Coastguard Worker     super.superMethod();
45*795d594fSAndroid Build Coastguard Worker   }
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.callUnresolvedStaticFieldAccess() register (before)
48*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Int8
49*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Uint16
50*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Int32
51*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Int64
52*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Float32
53*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Float64
54*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldSet field_type:Reference
55*795d594fSAndroid Build Coastguard Worker 
56*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Int8
57*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Uint16
58*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Int32
59*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Int64
60*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Float32
61*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Float64
62*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedStaticFieldGet field_type:Reference
callUnresolvedStaticFieldAccess()63*795d594fSAndroid Build Coastguard Worker   static public void callUnresolvedStaticFieldAccess() {
64*795d594fSAndroid Build Coastguard Worker     Object o = new Object();
65*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticByte = (byte)1;
66*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticChar = '1';
67*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticInt = 123456789;
68*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticLong = 123456789123456789l;
69*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticFloat = 123456789123456789f;
70*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticDouble = 123456789123456789d;
71*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticObject = o;
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker     expectEquals((byte)1, UnresolvedClass.staticByte);
74*795d594fSAndroid Build Coastguard Worker     expectEquals('1', UnresolvedClass.staticChar);
75*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789, UnresolvedClass.staticInt);
76*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789123456789l, UnresolvedClass.staticLong);
77*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789123456789f, UnresolvedClass.staticFloat);
78*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789123456789d, UnresolvedClass.staticDouble);
79*795d594fSAndroid Build Coastguard Worker     expectEquals(o, UnresolvedClass.staticObject);
80*795d594fSAndroid Build Coastguard Worker 
81*795d594fSAndroid Build Coastguard Worker     // Check "large" values.
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticByte = (byte)-1;
84*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticChar = (char)32768;
85*795d594fSAndroid Build Coastguard Worker     UnresolvedClass.staticInt = -1;
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker     expectEquals((byte)-1, UnresolvedClass.staticByte);
88*795d594fSAndroid Build Coastguard Worker     expectEquals((char)32768, UnresolvedClass.staticChar);
89*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, UnresolvedClass.staticInt);
90*795d594fSAndroid Build Coastguard Worker   }
91*795d594fSAndroid Build Coastguard Worker 
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.callUnresolvedInstanceFieldAccess(UnresolvedClass) register (before)
93*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Int8
94*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Uint16
95*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Int32
96*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Int64
97*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Float32
98*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Float64
99*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldSet field_type:Reference
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Int8
102*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Uint16
103*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Int32
104*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Int64
105*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Float32
106*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Float64
107*795d594fSAndroid Build Coastguard Worker   /// CHECK:        UnresolvedInstanceFieldGet field_type:Reference
callUnresolvedInstanceFieldAccess(UnresolvedClass c)108*795d594fSAndroid Build Coastguard Worker   static public void callUnresolvedInstanceFieldAccess(UnresolvedClass c) {
109*795d594fSAndroid Build Coastguard Worker     Object o = new Object();
110*795d594fSAndroid Build Coastguard Worker     c.instanceByte = (byte)1;
111*795d594fSAndroid Build Coastguard Worker     c.instanceChar = '1';
112*795d594fSAndroid Build Coastguard Worker     c.instanceInt = 123456789;
113*795d594fSAndroid Build Coastguard Worker     c.instanceLong = 123456789123456789l;
114*795d594fSAndroid Build Coastguard Worker     c.instanceFloat = 123456789123456789f;
115*795d594fSAndroid Build Coastguard Worker     c.instanceDouble = 123456789123456789d;
116*795d594fSAndroid Build Coastguard Worker     c.instanceObject = o;
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker     expectEquals((byte)1, c.instanceByte);
119*795d594fSAndroid Build Coastguard Worker     expectEquals('1', c.instanceChar);
120*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789, c.instanceInt);
121*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789123456789l, c.instanceLong);
122*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789123456789f, c.instanceFloat);
123*795d594fSAndroid Build Coastguard Worker     expectEquals(123456789123456789d, c.instanceDouble);
124*795d594fSAndroid Build Coastguard Worker     expectEquals(o, c.instanceObject);
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker     // Check "large" values.
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker     c.instanceByte = (byte)-1;
129*795d594fSAndroid Build Coastguard Worker     c.instanceChar = (char)32768;
130*795d594fSAndroid Build Coastguard Worker     c.instanceInt = -1;
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker     expectEquals((byte)-1, c.instanceByte);
133*795d594fSAndroid Build Coastguard Worker     expectEquals((char)32768, c.instanceChar);
134*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, c.instanceInt);
135*795d594fSAndroid Build Coastguard Worker   }
136*795d594fSAndroid Build Coastguard Worker 
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.callUnresolvedNull(UnresolvedClass) register (before)
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: NullCheck
callUnresolvedNull(UnresolvedClass c)139*795d594fSAndroid Build Coastguard Worker   static public void callUnresolvedNull(UnresolvedClass c) {
140*795d594fSAndroid Build Coastguard Worker     int x = 0;
141*795d594fSAndroid Build Coastguard Worker     try {
142*795d594fSAndroid Build Coastguard Worker       x = c.instanceInt;
143*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected NPE");
144*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException e) {
145*795d594fSAndroid Build Coastguard Worker       x -= 1;
146*795d594fSAndroid Build Coastguard Worker     }
147*795d594fSAndroid Build Coastguard Worker     expectEquals(-1, x);
148*795d594fSAndroid Build Coastguard Worker     try {
149*795d594fSAndroid Build Coastguard Worker       c.instanceInt = -1;
150*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected NPE");
151*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException e) {
152*795d594fSAndroid Build Coastguard Worker       x -= 1;
153*795d594fSAndroid Build Coastguard Worker     }
154*795d594fSAndroid Build Coastguard Worker     expectEquals(-2, x);
155*795d594fSAndroid Build Coastguard Worker     try {
156*795d594fSAndroid Build Coastguard Worker       c.virtualMethod();
157*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected NPE");
158*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException e) {
159*795d594fSAndroid Build Coastguard Worker       x -= 1;
160*795d594fSAndroid Build Coastguard Worker     }
161*795d594fSAndroid Build Coastguard Worker     expectEquals(-3, x);
162*795d594fSAndroid Build Coastguard Worker   }
163*795d594fSAndroid Build Coastguard Worker 
testInstanceOf(Object o)164*795d594fSAndroid Build Coastguard Worker   static public void testInstanceOf(Object o) {
165*795d594fSAndroid Build Coastguard Worker     if (o instanceof UnresolvedSuperClass) {
166*795d594fSAndroid Build Coastguard Worker       System.out.println("instanceof ok");
167*795d594fSAndroid Build Coastguard Worker     }
168*795d594fSAndroid Build Coastguard Worker   }
169*795d594fSAndroid Build Coastguard Worker 
testCheckCast(Object o)170*795d594fSAndroid Build Coastguard Worker   static public UnresolvedSuperClass testCheckCast(Object o) {
171*795d594fSAndroid Build Coastguard Worker     UnresolvedSuperClass c = (UnresolvedSuperClass) o;
172*795d594fSAndroid Build Coastguard Worker     System.out.println("checkcast ok");
173*795d594fSAndroid Build Coastguard Worker     return c;
174*795d594fSAndroid Build Coastguard Worker   }
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.main(java.lang.String[]) register (before)
176*795d594fSAndroid Build Coastguard Worker   /// CHECK:        InvokeUnresolved invoke_type:direct
main(String[] args)177*795d594fSAndroid Build Coastguard Worker   static public void main(String[] args) {
178*795d594fSAndroid Build Coastguard Worker     UnresolvedClass c = new UnresolvedClass();
179*795d594fSAndroid Build Coastguard Worker     Main m = new Main();
180*795d594fSAndroid Build Coastguard Worker     callInvokeUnresolvedStatic();
181*795d594fSAndroid Build Coastguard Worker     callInvokeUnresolvedVirtual(c);
182*795d594fSAndroid Build Coastguard Worker     callInvokeUnresolvedInterface(c);
183*795d594fSAndroid Build Coastguard Worker     callInvokeUnresolvedSuper(m);
184*795d594fSAndroid Build Coastguard Worker     callUnresolvedStaticFieldAccess();
185*795d594fSAndroid Build Coastguard Worker     callUnresolvedInstanceFieldAccess(c);
186*795d594fSAndroid Build Coastguard Worker     callUnresolvedNull(null);
187*795d594fSAndroid Build Coastguard Worker     testInstanceOf(m);
188*795d594fSAndroid Build Coastguard Worker     testCheckCast(m);
189*795d594fSAndroid Build Coastguard Worker     testLicm(2);
190*795d594fSAndroid Build Coastguard Worker   }
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testLicm(int) licm (before)
193*795d594fSAndroid Build Coastguard Worker   /// CHECK:      <<Class:l\d+>>        LoadClass                                     loop:<<LoopLabel:B\d+>>
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: <<Clinit:l\d+>>       ClinitCheck [<<Class>>]                       loop:<<LoopLabel>>
195*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: <<New:l\d+>>          NewInstance [<<Clinit>>]                      loop:<<LoopLabel>>
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:                       ConstructorFence [<<New>>]                    loop:<<LoopLabel>>
197*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:                       InvokeUnresolved [<<New>>]                    loop:<<LoopLabel>>
198*795d594fSAndroid Build Coastguard Worker 
199*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: void Main.testLicm(int) licm (after)
200*795d594fSAndroid Build Coastguard Worker   /// CHECK:      <<Class:l\d+>>        LoadClass                                     loop:none
201*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT: <<Clinit:l\d+>>       ClinitCheck [<<Class>>]                       loop:none
202*795d594fSAndroid Build Coastguard Worker   /// CHECK:      <<New:l\d+>>          NewInstance [<<Clinit>>]                      loop:<<LoopLabel:B\d+>>
203*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:                       ConstructorFence [<<New>>]                    loop:<<LoopLabel>>
204*795d594fSAndroid Build Coastguard Worker   /// CHECK-NEXT:                       InvokeUnresolved [<<New>>]                    loop:<<LoopLabel>>
testLicm(int count)205*795d594fSAndroid Build Coastguard Worker   static public void testLicm(int count) {
206*795d594fSAndroid Build Coastguard Worker     // Test to make sure we keep the initialization check after loading an unresolved class.
207*795d594fSAndroid Build Coastguard Worker     UnresolvedClass c;
208*795d594fSAndroid Build Coastguard Worker     int i = 0;
209*795d594fSAndroid Build Coastguard Worker     do {
210*795d594fSAndroid Build Coastguard Worker       c = new UnresolvedClass();
211*795d594fSAndroid Build Coastguard Worker     } while (i++ != count);
212*795d594fSAndroid Build Coastguard Worker   }
213*795d594fSAndroid Build Coastguard Worker 
expectEquals(byte expected, byte result)214*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(byte expected, byte result) {
215*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
216*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
217*795d594fSAndroid Build Coastguard Worker     }
218*795d594fSAndroid Build Coastguard Worker   }
219*795d594fSAndroid Build Coastguard Worker 
expectEquals(char expected, char result)220*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(char expected, char result) {
221*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
222*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
223*795d594fSAndroid Build Coastguard Worker     }
224*795d594fSAndroid Build Coastguard Worker   }
225*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)226*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(int expected, int result) {
227*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
228*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
229*795d594fSAndroid Build Coastguard Worker     }
230*795d594fSAndroid Build Coastguard Worker   }
231*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)232*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(long expected, long result) {
233*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
234*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
235*795d594fSAndroid Build Coastguard Worker     }
236*795d594fSAndroid Build Coastguard Worker   }
237*795d594fSAndroid Build Coastguard Worker 
expectEquals(float expected, float result)238*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(float expected, float result) {
239*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
240*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
241*795d594fSAndroid Build Coastguard Worker     }
242*795d594fSAndroid Build Coastguard Worker   }
243*795d594fSAndroid Build Coastguard Worker 
expectEquals(double expected, double result)244*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(double expected, double result) {
245*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
246*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
247*795d594fSAndroid Build Coastguard Worker     }
248*795d594fSAndroid Build Coastguard Worker   }
249*795d594fSAndroid Build Coastguard Worker 
expectEquals(Object expected, Object result)250*795d594fSAndroid Build Coastguard Worker   public static void expectEquals(Object expected, Object result) {
251*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
252*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
253*795d594fSAndroid Build Coastguard Worker     }
254*795d594fSAndroid Build Coastguard Worker   }
255*795d594fSAndroid Build Coastguard Worker }
256