| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | package classmerging; | 
 |  | 
 | public class MethodCollisionTest { | 
 |  | 
 |   public static void main(String[] args) { | 
 |     B b = new B(); | 
 |     b.m(); | 
 |  | 
 |     D d = new D(); | 
 |     d.m(); | 
 |  | 
 |     // Ensure that the instantiations are not dead code eliminated. | 
 |     escape(b); | 
 |     escape(d); | 
 |   } | 
 |  | 
 |   @NeverInline | 
 |   static void escape(Object o) { | 
 |     if (System.currentTimeMillis() < 0) { | 
 |       System.out.println(o); | 
 |     } | 
 |   } | 
 |  | 
 |   public static class A { | 
 |  | 
 |     // After class merging, this method will have the same signature as the method B.m, | 
 |     // unless we handle the collision. | 
 |     private A m() { | 
 |       System.out.println("A.m"); | 
 |       return null; | 
 |     } | 
 |  | 
 |     public void invokeM() { | 
 |       m(); | 
 |     } | 
 |   } | 
 |  | 
 |   public static class B extends A { | 
 |  | 
 |     private B m() { | 
 |       System.out.println("B.m"); | 
 |       invokeM(); | 
 |       return null; | 
 |     } | 
 |   } | 
 |  | 
 |   public static class C { | 
 |  | 
 |     // After class merging, this method will have the same signature as the method D.m, | 
 |     // unless we handle the collision. | 
 |     public C m() { | 
 |       System.out.println("C.m"); | 
 |       return null; | 
 |     } | 
 |   } | 
 |  | 
 |   public static class D extends C { | 
 |  | 
 |     public D m() { | 
 |       System.out.println("D.m"); | 
 |       super.m(); | 
 |       return null; | 
 |     } | 
 |   } | 
 |  | 
 |  | 
 | } |