/*
 * Copyright (c) 2017 - present Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */
class T {
 private:
  int* unnanotated_field;
  int* _Nullable nullable_field;
  int* _Nonnull nonnull_field;

 public:
  void assign_nullable_field_to_null_okay() { nullable_field = nullptr; }

 public:
  void assign_unnanotated_field_to_null_bad() { unnanotated_field = nullptr; }

 public:
  void assign_nonnull_field_to_null_bad() { nonnull_field = nullptr; }

 public:
  void test_nullable_field_for_null_okay() {
    if (nullable_field == nullptr) {
    }
  }

 public:
  void test_unnanotated_field_for_null_bad() {
    if (unnanotated_field == nullptr) {
    }
  }

 public:
  void test_nonnull_field_for_null_bad() {
    if (nonnull_field == nullptr) {
    }
  }

 public:
  void dereference_unnanotated_field_okay() { *unnanotated_field = 42; }

 public:
  void dereference_nonnull_field_okay() { *nonnull_field = 42; }

 public:
  void dereference_nullable_field_bad() { *nullable_field = 42; }

 public:
  void dereference_unnanotated_field_after_test_for_null_bad() {
    if (unnanotated_field == nullptr) {
      *unnanotated_field = 42;
    }
  }

 public:
  void FP_dereference_nonnull_field_after_test_for_null_okay() {
    if (nonnull_field == nullptr) {
      *nonnull_field = 42;
    }
  }
};