/*
 * Copyright 2000-2010 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import java.io.*;
class Test {
  interface InterfA {
    <T extends Cloneable & Iterable> void foo(T x);

    <T extends Iterable & Cloneable> void foo(T x);
  }

  class ANotSame {
    <T extends Cloneable & Iterable> void foo(T x){}

    <T extends Iterable & Cloneable> void foo(T x){}
  }

  class BNotSame extends ANotSame {
      @Override
      <T extends Cloneable & Iterable> void foo(T x){}
  }

  abstract class A<T extends Throwable> {
    abstract <T extends Comparable<?> & Serializable> void foo(T x, A<?> y);

    abstract <T extends Serializable & Comparable<?>> void foo(T x, A<? extends Cloneable> y);
  }

 /* abstract class B<T extends Throwable> {
    abstract <T extends Comparable<?> & Serializable> void foo(T x, B<?> y);

    abstract <T extends Serializable & Comparable<?>> void foo(T x, B<? extends Throwable> y);
  }


  abstract class C<T extends Throwable & Serializable> {
    abstract <T extends Comparable<?> & Serializable> void foo(T x, C<? extends Serializable> y);

    abstract <T extends Serializable & Comparable<?>> void foo(T x, C<? extends Throwable> y);
  }*/

  abstract class D<T extends Throwable & Runnable> {
    <error descr="'foo(T, D<? extends Runnable>)' clashes with 'foo(T, D<? extends Throwable>)'; both methods have same erasure">abstract <T extends Serializable & Comparable<?>> void foo(T x, D<? extends Runnable> y)</error>;

    abstract <T extends Serializable & Comparable<?>> void foo(T x, D<? extends Throwable> y);
  }


  interface IA {}
  interface IB {}
  void testExtendsOrder() {
    class E<T extends IA & IB> {
      <error descr="'foo(E<? extends IA>)' clashes with 'foo(E<? extends IB>)'; both methods have same erasure">void foo(E<? extends IA> x)</error> {}
      void foo(E<? extends IB> x) {}
    }
  }

  abstract class F<T extends Throwable> {
    <error descr="'foo(F<?>)' clashes with 'foo(F<? extends Throwable>)'; both methods have same erasure">abstract void foo(F<?> y)</error>;

    abstract void foo(F<? extends Throwable> y);
  }
}

@@ -2618,8 +2618,473 @@
 ;%0A  %7D%0A%7D%0A
+%0Aclass Ao %7B%7D%0A%0Aclass Bo extends Ao %7B%7D%0A%0Aclass SettingsEditor%3CT%3E %7B%0A%7D%0A%0Aabstract class RunConfigurationExtension%3CT extends Ao%3E %7B%0A    protected abstract %3CP extends T%3E SettingsEditor%3CP%3E createEditor(final P configuration);%0A%7D%0A%0Aclass F extends RunConfigurationExtension%3CBo%3E %7B%0A%0A    %3Cerror descr=%22Method does not override method from its superclass%22%3E@Override%3C/error%3E%0A    protected %3CP extends Bo%3E SettingsEditor%3CP%3E createEditor(P configuration) %7B%0A        return null;%0A    %7D%0A%7D%0A

test data for IDEA-74581