// Test case for issue #4248: https://github.com/typetools/checker-framework/issues/4248

import java.util.List;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.framework.qual.DefaultQualifier;

class DefaultForEach {
  @DefaultQualifier(Nullable.class)
  Object @NonNull [] foo() {
    return new Object[] {null};
  }

  void bar() {
    for (Object p : foo()) {
      // :: error: dereference.of.nullable
      p.toString();
    }
  }

  @DefaultQualifier(Nullable.class)
  @NonNull List<Object> foo2() {
    throw new RuntimeException();
  }

  void bar2() {
    for (Object p : foo2()) {
      // :: error: (dereference.of.nullable)
      p.toString();
    }
  }

  double[][] foo3() {
    throw new RuntimeException();
  }

  void bar3() {
    for (double[] pa : foo3()) {
      for (Double p : pa) {
        p.toString();
      }
    }
  }
}
