import java.util.ArrayList;

class Reference<<warning descr="Type parameter 'T' is never used">T</warning>> {
}
class WeakReference<T> extends Reference<T> {
}
class Item<<warning descr="Type parameter 'Key' is never used">Key</warning>, T> extends WeakReference<T> {
 {
   Reference<T> ref = null;
   Item item = (Item) ref;
   equals(item);
 }
}

// assign raw to generic are allowed
class a<E> {
 void f(a<E> t){
    t.hashCode();
 }
}
class b  {
  a<b> f(a raw) {
   a<?> unbound = raw;
   raw = unbound;

   a<Integer> generic = <warning descr="Unchecked assignment: 'a' to 'a<java.lang.Integer>'">raw</warning>;
   <warning descr="Unchecked call to 'f(a<E>)' as a member of raw type 'a'">raw.f</warning>(raw);
   <warning descr="Unchecked call to 'f(a<E>)' as a member of raw type 'a'">raw.f</warning>(generic);
   generic.f(<warning descr="Unchecked assignment: 'a' to 'a<java.lang.Integer>'">raw</warning>);
   generic.f(generic);
   generic.f<error descr="'f(a<java.lang.Integer>)' in 'a' cannot be applied to '(a<java.lang.String>)'">(new a<String>())</error>;
   generic = <warning descr="Unchecked assignment: 'a' to 'a<java.lang.Integer>'">raw</warning>;


   return <warning descr="Unchecked assignment: 'a' to 'a<b>'">raw</warning>;
  }
}

class List<T> {
   <V> V[] toArray (V[] vs) { return vs; }
   void add(T t) {
     t.hashCode();
   }
}

class c {
  /*String[] f () {
    List l = new List();
    error descr="Incompatible types. Found: 'java.lang.Object[]', required: 'java.lang.String[]'">return l.toArray (new String[0]);</error
  }*/
  
  String[] g () {
    List<String> l = new List<String>();
    return l.toArray (new String[0]);
  }
}

class d {
    class Y <<warning descr="Type parameter 'T' is never used">T</warning>> {
    }

    class Z <<warning descr="Type parameter 'T' is never used">T</warning>> extends Y<Y> {
    }

    class Pair <X> {
        void foo(Y<? extends X> y) {
          y.hashCode();
        }
    }

    Pair<Z> pair;

    void bar(Y<? extends Y> y) {
        pair.foo<error descr="'foo(d.Y<? extends d.Z>)' in 'd.Pair' cannot be applied to '(d.Y<capture<? extends d.Y>>)'">(y)</error>;
    }
}

class e {
    String foo () {
        MyList myList = new MyList();
        <error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.String'">return myList.get(0);</error>
    }

    static class MyList<<warning descr="Type parameter 'T' is never used">T</warning>> extends ArrayList<String>{
    }
}

class ccc {
    static Comparable<? super ccc> f() {
        return <warning descr="Unchecked assignment: 'anonymous java.lang.Comparable' to 'java.lang.Comparable<? super ccc>'">new Comparable () {
            public int compareTo(final Object o) {
                return 0;
            }
        }</warning>;
    }
}

class ddd<COMP extends ddd> {
    COMP comp;
    ddd foo() {
        return comp; //no unchecked warning is signalled here
    }
}

class G1<T> {
  T t;
}
class G2<T> {
    T t;
    
    static ArrayList<G1> f() {
        return null;
    }
}

class Inst {
    static void f () {
        G2<G1<String>> g2 = new G2<G1<String>>();
        for (<warning descr="Unchecked assignment: 'G1' to 'G1<java.lang.String>'">G1<String> g1</warning> : g2.f()) {
          g1.toString();
        }
    }
}

class A111<T> {
  T t;
  <V> V f(V v) {
    return v;
  }

  String g(A111 a) {
    //noinspection unchecked
    <error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.String'">return a.f("");</error>
  }
}

class A1 {
  <V> V f(V v) {
    return v;
  }
}

class A11<T> extends A1 {
    T t;

    //this is OK, type parameters of base class are not raw
    String s = new A11().f("");
}

//IDEADEV-26163
class Test1<X> {
  X x;
  java.util.ArrayList<Number> foo = new java.util.ArrayList<Number>();
  public static Number foo() {
    <error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.Number'">return new Test1().foo.get(0);</error>
  }
}
//end of IDEADEV-26163


///////////////  signatures in non-parameterized class are not erased
class C3  {
    public int get(Class<?> c) {
        return 0;
    }
}

class Cp<T> extends C3 {
  public T i;
}
class C extends Cp/*<C>*/ {
    @Override
    public int get(Class<?> c) {
        return 0;
    }
}
//////////////