class MyTestDefaultConstructor {
   static class SuperFoo<<warning descr="Type parameter 'X' is never used">X</warning>> { }

   static class Foo<X extends Number> extends SuperFoo<X> {
   }

   interface I1 {
       SuperFoo<String> m();
   }

   interface I2 {
       SuperFoo<Integer> m();
   }

   interface I3 {
       SuperFoo<Object> m();
   }

   private static void <warning descr="Private method 'foo(MyTestDefaultConstructor.I1)' is never used">foo</warning>(I1 i) {System.out.println(i);}
   private static void <warning descr="Private method 'foo(MyTestDefaultConstructor.I2)' is never used">foo</warning>(I2 i) {System.out.println(i);}
   private static void <warning descr="Private method 'foo(MyTestDefaultConstructor.I3)' is never used">foo</warning>(I3 i) {System.out.println(i);}

   static {
       foo<error descr="Ambiguous method call: both 'MyTestDefaultConstructor.foo(I1)' and 'MyTestDefaultConstructor.foo(I2)' match">(Foo::new)</error>;
   }
}

class MyTestConstructor {
   static class SuperFoo<<warning descr="Type parameter 'X' is never used">X</warning>> { }

   static class Foo<X extends Number> extends SuperFoo<X> {
     Foo(){}
   }

   interface I1 {
       SuperFoo<String> m();
   }

   interface I2 {
       SuperFoo<Integer> m();
   }

   interface I3 {
       SuperFoo<Object> m();
   }

   private static void <warning descr="Private method 'foo(MyTestConstructor.I1)' is never used">foo</warning>(I1 i) {System.out.println(i);}
   private static void <warning descr="Private method 'foo(MyTestConstructor.I2)' is never used">foo</warning>(I2 i) {System.out.println(i);}
   private static void <warning descr="Private method 'foo(MyTestConstructor.I3)' is never used">foo</warning>(I3 i) {System.out.println(i);}

   static {
       foo<error descr="Ambiguous method call: both 'MyTestConstructor.foo(I1)' and 'MyTestConstructor.foo(I2)' match">(Foo::new)</error>;
   }
}

class MyTestMethod {
    static class SuperFoo<<warning descr="Type parameter 'X' is never used">X</warning>> { }

    static class Foo<X extends Number> extends SuperFoo<X> {
    }

    interface I1 {
        SuperFoo<String> m();
    }

    interface I2 {
        SuperFoo<Integer> m();
    }

    interface I3 {
        SuperFoo<Object> m();
    }

    static <X extends Number> Foo<X> m() { return null; }

    private static void <warning descr="Private method 'foo(MyTestMethod.I1)' is never used">foo</warning>(I1 i) {System.out.println(i);}
    private static void <warning descr="Private method 'foo(MyTestMethod.I2)' is never used">foo</warning>(I2 i) {System.out.println(i);}
    private static void <warning descr="Private method 'foo(MyTestMethod.I3)' is never used">foo</warning>(I3 i) {System.out.println(i);}

    static {
       foo<error descr="Ambiguous method call: both 'MyTestMethod.foo(I1)' and 'MyTestMethod.foo(I2)' match">(MyTestMethod::m)</error>;
    }
}
