import org.checkerframework.checker.nullness.qual.*;

public class Exceptions {
  void exceptionParam(@Nullable Exception m) {
    // :: error: (dereference.of.nullable)
    m.getClass(); // should emit error
  }

  void nonnullExceptionParam(@NonNull Exception m) {
    m.getClass();
  }

  void exception(@Nullable Exception m) {
    try {

    } catch (Exception e) {
      // Note that this code is dead.
      e.getClass();
      // :: error: (dereference.of.nullable)
      m.getClass(); // should emit error
    }
  }

  void throwException() {
    int a = 0;
    if (a == 0) {
      // :: error: (throwing.nullable)
      throw null;
    } else if (a == 1) {
      RuntimeException e = null;
      // :: error: (throwing.nullable)
      throw e;
    } else {
      RuntimeException e = new RuntimeException();
      throw e;
    }
  }

  void reassignException() {
    try {
    } catch (RuntimeException e) {
      // Note that this code is dead.
      // :: error: (assignment)
      e = null;
      throw e;
    }
  }
}
