| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| // Tests for CHECK_NE and some of its implementation details. |
| |
| #include <memory> |
| |
| #include "check.h" |
| #include "nullability_test.h" |
| |
| TEST void getReferenceableValueModeledForAbseil(Nullable<int *> NullablePtr, |
| Nonnull<int *> NonnullPtr) { |
| auto &Nullable2 = absl::something::GetReferenceableValue(NullablePtr); |
| auto &Nonnull2 = absl::something::GetReferenceableValue(NonnullPtr); |
| // Outputs should share the nullability of inputs. |
| nullable(Nullable2); |
| nonnull(Nonnull2); |
| } |
| |
| TEST void getReferenceableValueModeledForUtil(Nullable<int *> NullablePtr, |
| Nonnull<int *> NonnullPtr) { |
| auto &Nullable2 = util::something::GetReferenceableValue(NullablePtr); |
| auto &Nonnull2 = util::something::GetReferenceableValue(NonnullPtr); |
| // Outputs should share the nullability of inputs. |
| nullable(Nullable2); |
| nonnull(Nonnull2); |
| } |
| |
| TEST void abslCheckNEImplModelEqualAndNull() { |
| int *P = nullptr; |
| // `P` is definitely equal to `nullptr`, so result is nonnull. |
| nonnull(absl::something::Check_NEImpl(P, nullptr, "foo")); |
| } |
| |
| TEST void abslCheckNEImplModelMaybeUnequal(int *P, int *Q) { |
| // Since we don't know `P`'s relation to `Q`, result may be null. |
| nullable(absl::something::Check_NEImpl(P, Q, "foo")); |
| } |
| |
| TEST void abslCheckNEImPlModelUnequal(int *P) { |
| if (P != nullptr) { |
| // `P` is definitely not equal to `nullptr`, so result is null. |
| nullable(absl::something::Check_NEImpl(P, nullptr, "foo")); |
| } |
| } |
| |
| TEST void checkNELeft(Nullable<int *> P) { |
| CHECK_NE(P, nullptr); |
| nonnull(P); |
| } |
| |
| TEST void checkNERight(Nullable<int *> P) { |
| CHECK_NE(nullptr, P); |
| nonnull(P); |
| } |
| |
| TEST void checkNELeftSmartPointer(std::unique_ptr<int> P) { |
| CHECK_NE(P, nullptr); |
| nonnull(P); |
| } |
| |
| TEST void checkNERightSmartPointer(std::unique_ptr<int> P) { |
| CHECK_NE(nullptr, P); |
| nonnull(P); |
| } |
| |
| TEST void utilCheckNEImplModelEqualAndNull() { |
| int *P = nullptr; |
| // `P` is definitely equal to `nullptr`, so result is nonnull. |
| nonnull(util::something::Check_NEImpl(P, nullptr, "foo")); |
| } |
| |
| TEST void utilCheckNEImplModelMaybeUnequal(int *P, int *Q) { |
| // Since we don't know `P`'s relation to `Q`, result may be null. |
| nullable(util::something::Check_NEImpl(P, Q, "foo")); |
| } |
| |
| TEST void utilCheckNEImPlModelUnequal(int *P) { |
| if (P != nullptr) { |
| // `P` is definitely not equal to `nullptr`, so result is null. |
| nullable(util::something::Check_NEImpl(P, nullptr, "foo")); |
| } |
| } |