// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize.nonnull;

public class NonNullAfterFieldAccess {

  public static int foo(FieldAccessTest arg) {
    String fld = arg.fld;
    if (arg == null) {
      throw new AssertionError("arg is not null.");
    }
    return arg.hashCode();
  }

  public static int bar(FieldAccessTest arg) {
    try {
      String fld = arg.fld;
      if (arg == null) {
        throw new AssertionError("arg is not null.");
      }
    } catch (NullPointerException npe) {
      // Intentionally left blank
    }
    // As NPE is caught above, arg could be null.
    return arg.hashCode();
  }

  private FieldAccessTest instance;

  public int foo2(FieldAccessTest arg) {
    this.instance = arg;
    arg.toString();
    if (arg == null) {
      throw new AssertionError("arg is not null.");
    }
    arg.fld = "test field access";
    if (arg == null) {
      throw new AssertionError("arg is not null.");
    }
    return arg.hashCode();
  }

  public static void main(String[] args) {
    FieldAccessTest testInstance = new FieldAccessTest();
    testInstance.fld = "non-null";
    foo(testInstance);
    bar(testInstance);
    NonNullAfterFieldAccess mainInstance = new NonNullAfterFieldAccess();
    mainInstance.foo2(testInstance);
  }
}
