xref: /aosp_15_r20/art/test/181-default-methods/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2022 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     private static boolean usingDalvik = "Dalvik".equals(System.getProperty("java.vm.name"));
19*795d594fSAndroid Build Coastguard Worker 
expectSameString(String expected, String actual)20*795d594fSAndroid Build Coastguard Worker     public static void expectSameString(String expected, String actual) {
21*795d594fSAndroid Build Coastguard Worker         if (expected != actual) {
22*795d594fSAndroid Build Coastguard Worker             throw new Error("Expected " + expected + ", got " + actual + " (different object)");
23*795d594fSAndroid Build Coastguard Worker         }
24*795d594fSAndroid Build Coastguard Worker     }
25*795d594fSAndroid Build Coastguard Worker 
expectDefault(Super target)26*795d594fSAndroid Build Coastguard Worker     public static void expectDefault(Super target) {
27*795d594fSAndroid Build Coastguard Worker         String output = target.testMethod();  // invoke-virtual Super.testMethod()
28*795d594fSAndroid Build Coastguard Worker         Abstract abstractTarget = target;
29*795d594fSAndroid Build Coastguard Worker         String output2 = abstractTarget.testMethod();  // invoke-interface Abstract.testMethod()
30*795d594fSAndroid Build Coastguard Worker         expectSameString(output, output2);
31*795d594fSAndroid Build Coastguard Worker         System.out.println("Output from " + target.getClass().getName() + ": " + output);
32*795d594fSAndroid Build Coastguard Worker     }
33*795d594fSAndroid Build Coastguard Worker 
expectConflict(Super target)34*795d594fSAndroid Build Coastguard Worker     public static void expectConflict(Super target) {
35*795d594fSAndroid Build Coastguard Worker         try {
36*795d594fSAndroid Build Coastguard Worker             String output = target.testMethod();  // invoke-virtual Super.testMethod()
37*795d594fSAndroid Build Coastguard Worker             throw new Error("Unexpected success for " + target.getClass().getName() +
38*795d594fSAndroid Build Coastguard Worker                             " output: " + output);
39*795d594fSAndroid Build Coastguard Worker         } catch (AbstractMethodError ame) {
40*795d594fSAndroid Build Coastguard Worker             if (usingDalvik) {
41*795d594fSAndroid Build Coastguard Worker                 throw new Error("Unexpected AbstractMethodError", ame);
42*795d594fSAndroid Build Coastguard Worker             }  // else the AME is expected on RI.
43*795d594fSAndroid Build Coastguard Worker         } catch (IncompatibleClassChangeError expected) {
44*795d594fSAndroid Build Coastguard Worker         }
45*795d594fSAndroid Build Coastguard Worker         try {
46*795d594fSAndroid Build Coastguard Worker             Abstract abstractTarget = target;
47*795d594fSAndroid Build Coastguard Worker             String output = abstractTarget.testMethod();  // invoke-interface Abstract.testMethod()
48*795d594fSAndroid Build Coastguard Worker             throw new Error("Unexpected success for " + target.getClass().getName() +
49*795d594fSAndroid Build Coastguard Worker                             " output: " + output);
50*795d594fSAndroid Build Coastguard Worker         } catch (AbstractMethodError ame) {
51*795d594fSAndroid Build Coastguard Worker             if (usingDalvik) {
52*795d594fSAndroid Build Coastguard Worker                 throw new Error("Unexpected AbstractMethodError", ame);
53*795d594fSAndroid Build Coastguard Worker             }  // else the AME is expected on RI.
54*795d594fSAndroid Build Coastguard Worker         } catch (IncompatibleClassChangeError expected) {
55*795d594fSAndroid Build Coastguard Worker         }
56*795d594fSAndroid Build Coastguard Worker         System.out.println("Conflict in class " + target.getClass().getName());
57*795d594fSAndroid Build Coastguard Worker     }
58*795d594fSAndroid Build Coastguard Worker 
expectMiranda(Super target)59*795d594fSAndroid Build Coastguard Worker     public static void expectMiranda(Super target) {
60*795d594fSAndroid Build Coastguard Worker         try {
61*795d594fSAndroid Build Coastguard Worker             String output = target.testMethod();  // invoke-virtual Super.testMethod()
62*795d594fSAndroid Build Coastguard Worker             throw new Error("Unexpected success for " + target.getClass().getName() +
63*795d594fSAndroid Build Coastguard Worker                             " output: " + output);
64*795d594fSAndroid Build Coastguard Worker         } catch (AbstractMethodError expected) {
65*795d594fSAndroid Build Coastguard Worker         }
66*795d594fSAndroid Build Coastguard Worker         try {
67*795d594fSAndroid Build Coastguard Worker             Abstract abstractTarget = target;
68*795d594fSAndroid Build Coastguard Worker             String output = abstractTarget.testMethod();  // invoke-interface Abstract.testMethod()
69*795d594fSAndroid Build Coastguard Worker             throw new Error("Unexpected success for " + target.getClass().getName() +
70*795d594fSAndroid Build Coastguard Worker                             " output: " + output);
71*795d594fSAndroid Build Coastguard Worker         } catch (AbstractMethodError expected) {
72*795d594fSAndroid Build Coastguard Worker         }
73*795d594fSAndroid Build Coastguard Worker         System.out.println("Miranda in class " + target.getClass().getName());
74*795d594fSAndroid Build Coastguard Worker     }
75*795d594fSAndroid Build Coastguard Worker 
main(String args[])76*795d594fSAndroid Build Coastguard Worker     public static void main(String args[]) {
77*795d594fSAndroid Build Coastguard Worker         // Basic tests that have the interfaces D<n> with default method and/or
78*795d594fSAndroid Build Coastguard Worker         // D<n>M interfaces that mask the default method ordered by <n>.
79*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Super());
80*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1());
81*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D2());
82*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D3());
83*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1M());
84*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D2M());
85*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D3M());
86*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2());
87*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2M());
88*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1M_D2());
89*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1M_D2M());
90*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_D3());
91*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_D3M());
92*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2M_D3());
93*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2M_D3M());
94*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1M_D2_D3());
95*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1M_D2_D3M());
96*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1M_D2M_D3());
97*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1M_D2M_D3M());
98*795d594fSAndroid Build Coastguard Worker 
99*795d594fSAndroid Build Coastguard Worker         // Cases where one interface masks the method in more than one superinterface.
100*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1D2M());
101*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1D2D());
102*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_AD1D2M());
103*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_AD1D2D());
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker         // Cases where the interface D2 is early in the interface table but masked by D2M later.
106*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D2_D1_D2M());
107*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D2_D1M_D2M());
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker         // Cases that involve a superclass with miranda method in the vtable.
110*795d594fSAndroid Build Coastguard Worker         // Note: The above cases also include a miranda method in the superclass vtable
111*795d594fSAndroid Build Coastguard Worker         // anyway because we want to test `invoke-virtual Super.testMethod()` as well
112*795d594fSAndroid Build Coastguard Worker         // as the `invoke-interface Abstract.testMethod()`. However, miranda methods in
113*795d594fSAndroid Build Coastguard Worker         // superclass vtable mean that all default methods in superclass interfaces,
114*795d594fSAndroid Build Coastguard Worker         // if any, have been masked by abstract method, so processing them is a no-op.
115*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1M_x_D2());
116*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1M_x_D2M());
117*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1M_x_D2_D3());
118*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1M_x_D2_D3M());
119*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1M_x_D2M_D3());
120*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1M_x_D2M_D3M());
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker         // Cases that involve a superclass with default method in the vtable.
123*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_x_D2());
124*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_x_D2M());
125*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_x_D1MD());
126*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_x_D1M());
127*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_x_D2_D3());
128*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_x_D2_D3M());
129*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_x_D2M_D3());
130*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_x_D2M_D3M());
131*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_x_D1MD_D2());
132*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_x_D1MD_D2M());
133*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_x_D1M_D2());
134*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_x_D1M_D2M());
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker         // Cases that involve a superclass with conflict method in the vtable.
137*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_D2M());
138*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_D1M());
139*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_D2_x_D1M_D2M());
140*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_D1MD_D2M());
141*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_x_D1M_D3());
142*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_D1M_D3M());
143*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_x_D2M_D3());
144*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_D2M_D3M());
145*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_x_D1MD_D3());
146*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_x_D1MD_D3M());
147*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_D3M_x_D1MD_D2M());
148*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_D2_D3M_x_D1M_D2M());
149*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_D1D2D());
150*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_D2_x_D1D2M());
151*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_x_AD1D2D());
152*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_D2_x_AD1D2M());
153*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_D3_x_D1D2D());
154*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_D3_x_D1D2M());
155*795d594fSAndroid Build Coastguard Worker         expectConflict(new Conflict_D1_D2_D3_x_AD1D2D());
156*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_D3_x_AD1D2M());
157*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_D3M_x_D1D2D());
158*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_D2_D3M_x_D1D2M());
159*795d594fSAndroid Build Coastguard Worker         expectDefault(new Default_D1_D2_D3M_x_AD1D2D());
160*795d594fSAndroid Build Coastguard Worker         expectMiranda(new Miranda_D1_D2_D3M_x_AD1D2M());
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker         regressionTestB215510819();
163*795d594fSAndroid Build Coastguard Worker     }
164*795d594fSAndroid Build Coastguard Worker 
regressionTestB215510819()165*795d594fSAndroid Build Coastguard Worker     static public void regressionTestB215510819() {
166*795d594fSAndroid Build Coastguard Worker         // The failure to fill IMT correctly would have resulted in calling the wrong method,
167*795d594fSAndroid Build Coastguard Worker         // or triggering a check when interpreting in debug mode.
168*795d594fSAndroid Build Coastguard Worker         Abstract abstractTarget = new B215510819Test();
169*795d594fSAndroid Build Coastguard Worker         String result = abstractTarget.testMethod();
170*795d594fSAndroid Build Coastguard Worker         System.out.println("B215510819 test result: " + result);
171*795d594fSAndroid Build Coastguard Worker     }
172*795d594fSAndroid Build Coastguard Worker }
173*795d594fSAndroid Build Coastguard Worker 
174*795d594fSAndroid Build Coastguard Worker class Default_D1 extends Super implements Abstract, D1 {}
175*795d594fSAndroid Build Coastguard Worker class Default_D2 extends Super implements Abstract, D2 {}
176*795d594fSAndroid Build Coastguard Worker class Default_D3 extends Super implements Abstract, D3 {}
177*795d594fSAndroid Build Coastguard Worker class Miranda_D1M extends Super implements Abstract, D1M {}
178*795d594fSAndroid Build Coastguard Worker class Miranda_D2M extends Super implements Abstract, D2M {}
179*795d594fSAndroid Build Coastguard Worker class Miranda_D3M extends Super implements Abstract, D3M {}
180*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2 extends Super implements Abstract, D1, D2 {}
181*795d594fSAndroid Build Coastguard Worker class Default_D1_D2M extends Super implements Abstract, D1, D2M {}
182*795d594fSAndroid Build Coastguard Worker class Default_D1M_D2 extends Super implements Abstract, D1M, D2 {}
183*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_D2M extends Super implements Abstract, D1M, D2M {}
184*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3 extends Super implements Abstract, D1, D2, D3 {}
185*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3M extends Super implements Abstract, D1, D2, D3M {}
186*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2M_D3 extends Super implements Abstract, D1, D2M, D3 {}
187*795d594fSAndroid Build Coastguard Worker class Default_D1_D2M_D3M extends Super implements Abstract, D1, D2M, D3M {}
188*795d594fSAndroid Build Coastguard Worker class Conflict_D1M_D2_D3 extends Super implements Abstract, D1M, D2, D3 {}
189*795d594fSAndroid Build Coastguard Worker class Default_D1M_D2_D3M extends Super implements Abstract, D1M, D2, D3M {}
190*795d594fSAndroid Build Coastguard Worker class Default_D1M_D2M_D3 extends Super implements Abstract, D1M, D2M, D3 {}
191*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_D2M_D3M extends Super implements Abstract, D1M, D2M, D3M {}
192*795d594fSAndroid Build Coastguard Worker 
193*795d594fSAndroid Build Coastguard Worker class Miranda_D1D2M extends Super implements D1D2M {}
194*795d594fSAndroid Build Coastguard Worker class Default_D1D2D extends Super implements D1D2D {}
195*795d594fSAndroid Build Coastguard Worker class Miranda_AD1D2M extends Super implements AD1D2M {}
196*795d594fSAndroid Build Coastguard Worker class Default_AD1D2D extends Super implements AD1D2D {}
197*795d594fSAndroid Build Coastguard Worker 
198*795d594fSAndroid Build Coastguard Worker class Default_D2_D1_D2M extends Super implements Abstract, D1, D2M {}
199*795d594fSAndroid Build Coastguard Worker class Miranda_D2_D1M_D2M extends Super implements Abstract, D1M, D2M {}
200*795d594fSAndroid Build Coastguard Worker 
201*795d594fSAndroid Build Coastguard Worker class Default_D1M_x_D2 extends Miranda_D1M implements D2 {}
202*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_x_D2M extends Miranda_D1M implements D2M {}
203*795d594fSAndroid Build Coastguard Worker class Conflict_D1M_x_D2_D3 extends Miranda_D1M implements D2, D3 {}
204*795d594fSAndroid Build Coastguard Worker class Default_D1M_x_D2_D3M extends Miranda_D1M implements D2, D3M {}
205*795d594fSAndroid Build Coastguard Worker class Default_D1M_x_D2M_D3 extends Miranda_D1M implements D2M, D3 {}
206*795d594fSAndroid Build Coastguard Worker class Miranda_D1M_x_D2M_D3M extends Miranda_D1M implements D2M, D3M {}
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2 extends Default_D1 implements D2 {}
209*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D2M extends Default_D1 implements D2M {}
210*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D1MD extends Default_D1 implements D1MD {}
211*795d594fSAndroid Build Coastguard Worker class Miranda_D1_x_D1M extends Default_D1 implements D1M {}
212*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2_D3 extends Default_D1 implements D2, D3 {}
213*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2_D3M extends Default_D1 implements D2, D3M {}
214*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D2M_D3 extends Default_D1 implements D2M, D3 {}
215*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D2M_D3M extends Default_D1 implements D2M, D3M {}
216*795d594fSAndroid Build Coastguard Worker class Conflict_D1_x_D1MD_D2 extends Default_D1 implements D1MD, D2 {}
217*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D1MD_D2M extends Default_D1 implements D1MD, D2M {}
218*795d594fSAndroid Build Coastguard Worker class Default_D1_x_D1M_D2 extends Default_D1 implements D1M, D2 {}
219*795d594fSAndroid Build Coastguard Worker class Miranda_D1_x_D1M_D2M extends Default_D1 implements D1M, D2M {}
220*795d594fSAndroid Build Coastguard Worker 
221*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D2M extends Conflict_D1_D2 implements D2M {}
222*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1M extends Conflict_D1_D2 implements D1M {}
223*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_x_D1M_D2M extends Conflict_D1_D2 implements D1M, D2M {}
224*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1MD_D2M extends Conflict_D1_D2 implements D1MD, D2M {}
225*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D1M_D3 extends Conflict_D1_D2 implements D1M, D3 {}
226*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1M_D3M extends Conflict_D1_D2 implements D1M, D3M {}
227*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D2M_D3 extends Conflict_D1_D2 implements D2M, D3 {}
228*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D2M_D3M extends Conflict_D1_D2 implements D2M, D3M {}
229*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D1MD_D3 extends Conflict_D1_D2 implements D1MD, D3 {}
230*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_x_D1MD_D3M extends Conflict_D1_D2 implements D1MD, D3M {}
231*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3M_x_D1MD_D2M extends Conflict_D1_D2_D3M implements D1MD, D2M {}
232*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_D3M_x_D1M_D2M extends Conflict_D1_D2_D3M implements D1M, D2M {}
233*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_x_D1D2M extends Conflict_D1_D2 implements D1D2M {}
234*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_D1D2D extends Conflict_D1_D2 implements D1D2D {}
235*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_x_AD1D2M extends Conflict_D1_D2 implements AD1D2M {}
236*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_x_AD1D2D extends Conflict_D1_D2 implements AD1D2D {}
237*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3_x_D1D2M extends Conflict_D1_D2_D3 implements D1D2M {}
238*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3_x_D1D2D extends Conflict_D1_D2_D3 implements D1D2D {}
239*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3_x_AD1D2M extends Conflict_D1_D2_D3 implements AD1D2M {}
240*795d594fSAndroid Build Coastguard Worker class Conflict_D1_D2_D3_x_AD1D2D extends Conflict_D1_D2_D3 implements AD1D2D {}
241*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_D3M_x_D1D2M extends Conflict_D1_D2_D3M implements D1D2M {}
242*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3M_x_D1D2D extends Conflict_D1_D2_D3M implements D1D2D {}
243*795d594fSAndroid Build Coastguard Worker class Miranda_D1_D2_D3M_x_AD1D2M extends Conflict_D1_D2_D3M implements AD1D2M {}
244*795d594fSAndroid Build Coastguard Worker class Default_D1_D2_D3M_x_AD1D2D extends Conflict_D1_D2_D3M implements AD1D2D {}
245*795d594fSAndroid Build Coastguard Worker 
246*795d594fSAndroid Build Coastguard Worker interface B215510819Iface {
247*795d594fSAndroid Build Coastguard Worker     // The IMT size is currently 43 and we want to cover all 43 indexes with non-copied
248*795d594fSAndroid Build Coastguard Worker     // implementations. The IMT index for abstract methods is calculated with a hash that
249*795d594fSAndroid Build Coastguard Worker     // includes the method name, so 43 consecutive characters in the method name would be best.
250*795d594fSAndroid Build Coastguard Worker     // (The fact that the name hash is multiplied by 16 is OK because the size of the IMT is a
251*795d594fSAndroid Build Coastguard Worker     // prime number and thus GCD(16, 43) = 1.) However, we do not have a contiguous range of 43
252*795d594fSAndroid Build Coastguard Worker     // valid characters, so we need to rely on the `hash % 43` to mask out the difference when
253*795d594fSAndroid Build Coastguard Worker     // we use `0`..`5` between `Z` and `a`. ('Z' + 1 - 43 = '0' and '5' + 1 + 43 = 'a'.)
method_A()254*795d594fSAndroid Build Coastguard Worker     String method_A();
method_B()255*795d594fSAndroid Build Coastguard Worker     String method_B();
method_C()256*795d594fSAndroid Build Coastguard Worker     String method_C();
method_D()257*795d594fSAndroid Build Coastguard Worker     String method_D();
method_E()258*795d594fSAndroid Build Coastguard Worker     String method_E();
method_F()259*795d594fSAndroid Build Coastguard Worker     String method_F();
method_G()260*795d594fSAndroid Build Coastguard Worker     String method_G();
method_H()261*795d594fSAndroid Build Coastguard Worker     String method_H();
method_I()262*795d594fSAndroid Build Coastguard Worker     String method_I();
method_J()263*795d594fSAndroid Build Coastguard Worker     String method_J();
method_K()264*795d594fSAndroid Build Coastguard Worker     String method_K();
method_L()265*795d594fSAndroid Build Coastguard Worker     String method_L();
method_M()266*795d594fSAndroid Build Coastguard Worker     String method_M();
method_N()267*795d594fSAndroid Build Coastguard Worker     String method_N();
method_O()268*795d594fSAndroid Build Coastguard Worker     String method_O();
method_P()269*795d594fSAndroid Build Coastguard Worker     String method_P();
method_Q()270*795d594fSAndroid Build Coastguard Worker     String method_Q();
method_R()271*795d594fSAndroid Build Coastguard Worker     String method_R();
method_S()272*795d594fSAndroid Build Coastguard Worker     String method_S();
method_T()273*795d594fSAndroid Build Coastguard Worker     String method_T();
method_U()274*795d594fSAndroid Build Coastguard Worker     String method_U();
method_V()275*795d594fSAndroid Build Coastguard Worker     String method_V();
method_W()276*795d594fSAndroid Build Coastguard Worker     String method_W();
method_X()277*795d594fSAndroid Build Coastguard Worker     String method_X();
method_Y()278*795d594fSAndroid Build Coastguard Worker     String method_Y();
method_Z()279*795d594fSAndroid Build Coastguard Worker     String method_Z();
method_0()280*795d594fSAndroid Build Coastguard Worker     String method_0();
method_1()281*795d594fSAndroid Build Coastguard Worker     String method_1();
method_2()282*795d594fSAndroid Build Coastguard Worker     String method_2();
method_3()283*795d594fSAndroid Build Coastguard Worker     String method_3();
method_4()284*795d594fSAndroid Build Coastguard Worker     String method_4();
method_5()285*795d594fSAndroid Build Coastguard Worker     String method_5();
method_a()286*795d594fSAndroid Build Coastguard Worker     String method_a();
method_b()287*795d594fSAndroid Build Coastguard Worker     String method_b();
method_c()288*795d594fSAndroid Build Coastguard Worker     String method_c();
method_d()289*795d594fSAndroid Build Coastguard Worker     String method_d();
method_e()290*795d594fSAndroid Build Coastguard Worker     String method_e();
method_f()291*795d594fSAndroid Build Coastguard Worker     String method_f();
method_g()292*795d594fSAndroid Build Coastguard Worker     String method_g();
method_h()293*795d594fSAndroid Build Coastguard Worker     String method_h();
method_i()294*795d594fSAndroid Build Coastguard Worker     String method_i();
method_j()295*795d594fSAndroid Build Coastguard Worker     String method_j();
method_k()296*795d594fSAndroid Build Coastguard Worker     String method_k();
297*795d594fSAndroid Build Coastguard Worker }
298*795d594fSAndroid Build Coastguard Worker // Note: Marked as abstract to avoid IMT table in this class.
299*795d594fSAndroid Build Coastguard Worker abstract class B215510819Base extends Default_D1 implements B215510819Iface {
method_A()300*795d594fSAndroid Build Coastguard Worker     public String method_A() { return "B215510819 - wrong method_A!"; }
method_B()301*795d594fSAndroid Build Coastguard Worker     public String method_B() { return "B215510819 - wrong method_B!"; }
method_C()302*795d594fSAndroid Build Coastguard Worker     public String method_C() { return "B215510819 - wrong method_C!"; }
method_D()303*795d594fSAndroid Build Coastguard Worker     public String method_D() { return "B215510819 - wrong method_D!"; }
method_E()304*795d594fSAndroid Build Coastguard Worker     public String method_E() { return "B215510819 - wrong method_E!"; }
method_F()305*795d594fSAndroid Build Coastguard Worker     public String method_F() { return "B215510819 - wrong method_F!"; }
method_G()306*795d594fSAndroid Build Coastguard Worker     public String method_G() { return "B215510819 - wrong method_G!"; }
method_H()307*795d594fSAndroid Build Coastguard Worker     public String method_H() { return "B215510819 - wrong method_H!"; }
method_I()308*795d594fSAndroid Build Coastguard Worker     public String method_I() { return "B215510819 - wrong method_I!"; }
method_J()309*795d594fSAndroid Build Coastguard Worker     public String method_J() { return "B215510819 - wrong method_J!"; }
method_K()310*795d594fSAndroid Build Coastguard Worker     public String method_K() { return "B215510819 - wrong method_K!"; }
method_L()311*795d594fSAndroid Build Coastguard Worker     public String method_L() { return "B215510819 - wrong method_L!"; }
method_M()312*795d594fSAndroid Build Coastguard Worker     public String method_M() { return "B215510819 - wrong method_M!"; }
method_N()313*795d594fSAndroid Build Coastguard Worker     public String method_N() { return "B215510819 - wrong method_N!"; }
method_O()314*795d594fSAndroid Build Coastguard Worker     public String method_O() { return "B215510819 - wrong method_O!"; }
method_P()315*795d594fSAndroid Build Coastguard Worker     public String method_P() { return "B215510819 - wrong method_P!"; }
method_Q()316*795d594fSAndroid Build Coastguard Worker     public String method_Q() { return "B215510819 - wrong method_Q!"; }
method_R()317*795d594fSAndroid Build Coastguard Worker     public String method_R() { return "B215510819 - wrong method_R!"; }
method_S()318*795d594fSAndroid Build Coastguard Worker     public String method_S() { return "B215510819 - wrong method_S!"; }
method_T()319*795d594fSAndroid Build Coastguard Worker     public String method_T() { return "B215510819 - wrong method_T!"; }
method_U()320*795d594fSAndroid Build Coastguard Worker     public String method_U() { return "B215510819 - wrong method_U!"; }
method_V()321*795d594fSAndroid Build Coastguard Worker     public String method_V() { return "B215510819 - wrong method_V!"; }
method_W()322*795d594fSAndroid Build Coastguard Worker     public String method_W() { return "B215510819 - wrong method_W!"; }
method_X()323*795d594fSAndroid Build Coastguard Worker     public String method_X() { return "B215510819 - wrong method_X!"; }
method_Y()324*795d594fSAndroid Build Coastguard Worker     public String method_Y() { return "B215510819 - wrong method_Y!"; }
method_Z()325*795d594fSAndroid Build Coastguard Worker     public String method_Z() { return "B215510819 - wrong method_Z!"; }
method_0()326*795d594fSAndroid Build Coastguard Worker     public String method_0() { return "B215510819 - wrong method_0!"; }
method_1()327*795d594fSAndroid Build Coastguard Worker     public String method_1() { return "B215510819 - wrong method_1!"; }
method_2()328*795d594fSAndroid Build Coastguard Worker     public String method_2() { return "B215510819 - wrong method_2!"; }
method_3()329*795d594fSAndroid Build Coastguard Worker     public String method_3() { return "B215510819 - wrong method_3!"; }
method_4()330*795d594fSAndroid Build Coastguard Worker     public String method_4() { return "B215510819 - wrong method_4!"; }
method_5()331*795d594fSAndroid Build Coastguard Worker     public String method_5() { return "B215510819 - wrong method_5!"; }
method_a()332*795d594fSAndroid Build Coastguard Worker     public String method_a() { return "B215510819 - wrong method_a!"; }
method_b()333*795d594fSAndroid Build Coastguard Worker     public String method_b() { return "B215510819 - wrong method_b!"; }
method_c()334*795d594fSAndroid Build Coastguard Worker     public String method_c() { return "B215510819 - wrong method_c!"; }
method_d()335*795d594fSAndroid Build Coastguard Worker     public String method_d() { return "B215510819 - wrong method_d!"; }
method_e()336*795d594fSAndroid Build Coastguard Worker     public String method_e() { return "B215510819 - wrong method_e!"; }
method_f()337*795d594fSAndroid Build Coastguard Worker     public String method_f() { return "B215510819 - wrong method_f!"; }
method_g()338*795d594fSAndroid Build Coastguard Worker     public String method_g() { return "B215510819 - wrong method_g!"; }
method_h()339*795d594fSAndroid Build Coastguard Worker     public String method_h() { return "B215510819 - wrong method_h!"; }
method_i()340*795d594fSAndroid Build Coastguard Worker     public String method_i() { return "B215510819 - wrong method_i!"; }
method_j()341*795d594fSAndroid Build Coastguard Worker     public String method_j() { return "B215510819 - wrong method_j!"; }
method_k()342*795d594fSAndroid Build Coastguard Worker     public String method_k() { return "B215510819 - wrong method_k!"; }
343*795d594fSAndroid Build Coastguard Worker }
344*795d594fSAndroid Build Coastguard Worker // Regression test for bug 215510819 where we failed to properly fill the IMT table
345*795d594fSAndroid Build Coastguard Worker // when there were no new methods or interfaces and the superclass did not have an IMT
346*795d594fSAndroid Build Coastguard Worker // table, so we filled the IMT from the superclass IfTable and erroneously ignored
347*795d594fSAndroid Build Coastguard Worker // copied implementation methods in the process. Thus calls that should go to copied
348*795d594fSAndroid Build Coastguard Worker // methods via an IMT conflict resolution trampoline would just end up in unrelated
349*795d594fSAndroid Build Coastguard Worker // concrete method when called from compiled code or from interpreter in release mode.
350*795d594fSAndroid Build Coastguard Worker // In debug mode, interpreter would fail a debug check.
351*795d594fSAndroid Build Coastguard Worker class B215510819Test extends B215510819Base {}  // No new interfaces or virtuals.
352