// 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;
    }
  }


}
