checker-framework icon indicating copy to clipboard operation
checker-framework copied to clipboard

False positive with captured wildcards

Open smillst opened this issue 1 year ago • 0 comments

Several checkers produce a false positive on the following code.

public class Buggy {

  <A extends FooClass<A>> void use(FooClass<A> fooClass1, FooClass<A> fooClass2) {
    fooClass1.getThenStore().merge(fooClass2.getThenStore());

  }

  interface FooInterface<V extends FooInterface<V>> {}

  interface BarInterface<S extends BarInterface<S>> {}

  static abstract class BarClass<V extends FooClass<V>, S extends BarClass<V, S>> implements
      BarInterface<S> {

    public <S> void merge(S thenStore) {
    }
  }

  static class FooClass<V extends FooClass<V>> implements FooInterface<V> {

    FooInterface<?> a;

    void addStores(FooInterface<?> a) {
      this.a = a;
    }

    @SuppressWarnings("unchecked")
    public <S extends BarClass<V, S>> S getThenStore() {
      return (S) a;
    }
  }
}

/testcases/src/Buggy.java:4: error: [argument] incompatible argument for parameter thenStore of BarClass.merge.
    fooClass1.getThenStore().merge(fooClass2.getThenStore());
                                                         ^
  found   : @UnknownInterned BarClass<A[ extends @UnknownInterned FooClass<A[ extends @UnknownInterned FooClass<A> super @InternedDistinct Void]> super @InternedDistinct Void], capture#01[ extends @UnknownInterned BarClass<A[ extends @UnknownInterned FooClass<A[ extends @UnknownInterned FooClass<A> super @InternedDistinct Void]> super @InternedDistinct Void], capture#01> super @InternedDistinct Void]>
  required: capture#02[ extends @UnknownInterned Object super @InternedDistinct Void]
1 error

smillst avatar Jun 07 '24 18:06 smillst