/*
 * @test
 * @summary Test for Issue 347: concurrent semantics has desired behavior
 *
 * @compile -processor org.checkerframework.checker.nullness.NullnessChecker -Alint Issue347.java
 * @compile/fail/ref=Issue347-con.out -XDrawDiagnostics -processor org.checkerframework.checker.nullness.NullnessChecker -Alint Issue347.java -AconcurrentSemantics
 */

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

public class Issue347 {

  @MonotonicNonNull String mono;

  @Nullable String nble;

  void testMono() {
    if (mono == null) {
      return;
    }
    // The object referenced by mono might change, but it can't become null again, even in
    // concurrent semantics.
    mono.toString();
  }

  void testNble() {
    if (nble == null) {
      return;
    }
    // error expected in concurrent semantics only
    nble.toString();
  }
}
