import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;

public class NoExplicitAnnotations {}

class NoExplicitAnnotationsSuper {
  @Nullable String method1() {
    return helper();
  }

  @Nullable String method2() {
    return helper();
  }

  @Nullable String method3() {
    return helper();
  }

  @Nullable String helper() {
    return null;
  }
}

class NoExplicitAnnotationsSub1 extends NoExplicitAnnotationsSuper {
  @Override
  String helper() {
    return "hello";
  }
}

class NoExplicitAnnotationsSub2 extends NoExplicitAnnotationsSuper {
  @Override
  String helper() {
    return "hello";
  }
}

class NoExplicitAnnotationsSub3 extends NoExplicitAnnotationsSuper {
  @Override
  String helper() {
    return "hello";
  }
}

class NoExplicitAnnotationsUse {
  @Nullable String nble = null;
  @NonNull String nn = "hello";

  void use(
      NoExplicitAnnotationsSub1 sub1,
      NoExplicitAnnotationsSub2 sub2,
      NoExplicitAnnotationsSub3 sub3) {
    nble = sub1.method1();
    nn = sub1.method1();
    nble = sub2.method2();
    nn = sub2.method2();
    nble = sub3.method3();
    // :: error: (assignment)
    nn = sub3.method3();

    // :: error: (assignment)
    nn = nble;
  }
}
