| // 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 comparisons of types containing nullability annotations. |
| |
| #include "nullability_test.h" |
| |
| // nonnull vs nonnull |
| TEST void nonnullEqualsNonnull(int *_Nonnull X, int *_Nonnull Y) { |
| nonnull(X); |
| nonnull(Y); |
| if (X == Y) { |
| nonnull(X); |
| nonnull(Y); |
| } else { |
| nonnull(X); |
| nonnull(Y); |
| } |
| nonnull(X); |
| nonnull(Y); |
| } |
| TEST void nonnullNotEqualsNonnull(int *_Nonnull X, int *_Nonnull Y) { |
| nonnull(X); |
| nonnull(Y); |
| if (X != Y) { |
| nonnull(X); |
| nonnull(Y); |
| } else { |
| nonnull(X); |
| nonnull(Y); |
| } |
| nonnull(X); |
| nonnull(Y); |
| } |
| |
| // nullable vs nullable |
| TEST void nullableEqualsNullable(int *_Nullable X, int *_Nullable Y) { |
| nullable(X); |
| nullable(Y); |
| if (X == Y) { |
| nullable(X); |
| nullable(Y); |
| } else { |
| nullable(X); |
| nullable(Y); |
| } |
| nullable(X); |
| nullable(Y); |
| } |
| TEST void nullableNotEqualsNullable(int *_Nullable X, int *_Nullable Y) { |
| nullable(X); |
| nullable(Y); |
| if (X != Y) { |
| nullable(X); |
| nullable(Y); |
| } else { |
| nullable(X); |
| nullable(Y); |
| } |
| nullable(X); |
| nullable(Y); |
| } |
| |
| // unknown vs unknown |
| TEST void unknownEqualsUnknown(int *X, int *Y) { |
| unknown(X); |
| unknown(Y); |
| if (X == Y) { |
| unknown(X); |
| unknown(Y); |
| } else { |
| unknown(X); |
| unknown(Y); |
| } |
| unknown(X); |
| unknown(Y); |
| } |
| TEST void unknownNotEqualsUnknown(int *X, int *Y) { |
| unknown(X); |
| unknown(Y); |
| if (X != Y) { |
| unknown(X); |
| unknown(Y); |
| } else { |
| unknown(X); |
| unknown(Y); |
| } |
| unknown(X); |
| unknown(Y); |
| } |
| |
| // nonnull vs nullptr |
| // TODO(b/233582219): Implement diagnosis of unreachable program points |
| TEST void nonnullEqualsNullptr(int *_Nonnull X) { |
| nonnull(X); |
| if (X == nullptr) { |
| nonnull(X); // unreachable |
| } else { |
| nonnull(X); |
| } |
| nonnull(X); |
| } |
| TEST void nullptrEqualsNonnull(int *_Nonnull X) { |
| nonnull(X); |
| if (nullptr == X) { |
| nonnull(X); // unreachable |
| } else { |
| nonnull(X); |
| } |
| nonnull(X); |
| } |
| TEST void nonnullNotEqualsNullptr(int *_Nonnull X) { |
| nonnull(X); |
| if (X != nullptr) { |
| nonnull(X); |
| } else { |
| nonnull(X); // unreachable |
| } |
| nonnull(X); |
| } |
| TEST void nullptrNotEqualsNonnull(int *_Nonnull X) { |
| nonnull(X); |
| if (nullptr != X) { |
| nonnull(X); |
| } else { |
| nonnull(X); // unreachable |
| } |
| nonnull(X); |
| } |
| |
| // nullable vs nullptr |
| TEST void nullableEqualsNullptr(int *_Nullable X) { |
| nullable(X); |
| if (X == nullptr) { |
| nullable(X); |
| } else { |
| nonnull(X); |
| } |
| nullable(X); |
| } |
| TEST void nullptrEqualsNullable(int *_Nullable X) { |
| nullable(X); |
| if (nullptr == X) { |
| nullable(X); |
| } else { |
| nonnull(X); |
| } |
| nullable(X); |
| } |
| TEST void nullableNotEqualsNullptr(int *_Nullable X) { |
| nullable(X); |
| if (X != nullptr) { |
| nonnull(X); |
| } else { |
| nullable(X); |
| } |
| nullable(X); |
| } |
| TEST void nullptrNotEqualsNullable(int *_Nullable X) { |
| nullable(X); |
| if (nullptr != X) { |
| nonnull(X); |
| } else { |
| nullable(X); |
| } |
| nullable(X); |
| } |
| |
| // nullable vs nonnull |
| TEST void nullableEqualsNonnull(int *_Nullable X, int *_Nonnull Y) { |
| nullable(X); |
| nonnull(Y); |
| if (X == Y) { |
| nonnull(X); |
| nonnull(Y); |
| } else { |
| nullable(X); |
| nonnull(Y); |
| } |
| nullable(X); |
| nonnull(Y); |
| } |
| TEST void nonnullEqualsNullable(int *_Nullable X, int *_Nonnull Y) { |
| nullable(X); |
| nonnull(Y); |
| if (Y == X) { |
| nonnull(X); |
| nonnull(Y); |
| } else { |
| nullable(X); |
| nonnull(Y); |
| } |
| nullable(X); |
| nonnull(Y); |
| } |
| TEST void nullableNotEqualsNonnull(int *_Nullable X, int *_Nonnull Y) { |
| nullable(X); |
| nonnull(Y); |
| if (X != Y) { |
| nullable(X); |
| nonnull(Y); |
| } else { |
| nonnull(X); |
| nonnull(Y); |
| } |
| nullable(X); |
| nonnull(Y); |
| } |
| TEST void nonnullNotEqualsNullable(int *_Nullable X, int *_Nonnull Y) { |
| nullable(X); |
| nonnull(Y); |
| if (Y != X) { |
| nullable(X); |
| nonnull(Y); |
| } else { |
| nonnull(X); |
| nonnull(Y); |
| } |
| nullable(X); |
| nonnull(Y); |
| } |
| |
| // nullable vs unknown |
| TEST void nullableEqualsUnknown(int *_Nullable X, int *Y) { |
| nullable(X); |
| unknown(Y); |
| if (X == Y) { |
| nullable(X); |
| unknown(Y); |
| } else { |
| nullable(X); |
| unknown(Y); |
| } |
| nullable(X); |
| unknown(Y); |
| } |
| TEST void unknownEqualsNullable(int *_Nullable X, int *Y) { |
| nullable(X); |
| unknown(Y); |
| if (Y == X) { |
| nullable(X); |
| unknown(Y); |
| } else { |
| nullable(X); |
| unknown(Y); |
| } |
| nullable(X); |
| unknown(Y); |
| } |
| TEST void nullableNotEqualsUnknown(int *_Nullable X, int *Y) { |
| nullable(X); |
| unknown(Y); |
| if (X != Y) { |
| nullable(X); |
| unknown(Y); |
| } else { |
| nullable(X); |
| unknown(Y); |
| } |
| nullable(X); |
| unknown(Y); |
| } |
| TEST void unknownNotEqualsNullable(int *_Nullable X, int *Y) { |
| nullable(X); |
| unknown(Y); |
| if (Y != X) { |
| nullable(X); |
| unknown(Y); |
| } else { |
| nullable(X); |
| unknown(Y); |
| } |
| nullable(X); |
| unknown(Y); |
| } |
| |
| // unknown vs nullptr |
| // TODO(b/233582219): The pointer is compared to nullptr, |
| // hence the unannotated pointer should be considered nullable. |
| TEST void unknownEqualsNullptr(int *X) { |
| unknown(X); // TODO: nullable |
| if (X == nullptr) { |
| nullable(X); |
| } else { |
| nonnull(X); |
| } |
| unknown(X); // TODO: nullable |
| } |
| TEST void nullptrEqualsUnknown(int *X) { |
| unknown(X); // TODO: nullable |
| if (nullptr == X) { |
| nullable(X); |
| } else { |
| nonnull(X); |
| } |
| unknown(X); // TODO: nullable |
| } |
| TEST void unknownNotEqualsNullptr(int *X) { |
| unknown(X); // TODO: nullable |
| if (X != nullptr) { |
| nonnull(X); |
| } else { |
| nullable(X); |
| } |
| unknown(X); // TODO: nullable |
| } |
| TEST void nullptrNotEqualsUnknown(int *X) { |
| unknown(X); // TODO: nullable |
| if (nullptr != X) { |
| nonnull(X); |
| } else { |
| nullable(X); |
| } |
| unknown(X); // TODO: nullable |
| } |
| |
| // unknown vs nonnull |
| TEST void unknownEqualsNonnull(int *X, int *_Nonnull Y) { |
| unknown(X); |
| nonnull(Y); |
| if (X == Y) { |
| nonnull(X); |
| nonnull(Y); |
| } else { |
| unknown(X); |
| nonnull(Y); |
| } |
| unknown(X); |
| nonnull(Y); |
| } |
| TEST void nonnullEqualsUnknown(int *X, int *_Nonnull Y) { |
| unknown(X); |
| nonnull(Y); |
| if (Y == X) { |
| nonnull(X); |
| nonnull(Y); |
| } else { |
| unknown(X); |
| nonnull(Y); |
| } |
| unknown(X); |
| nonnull(Y); |
| } |
| TEST void unknownNotEqualsNonnull(int *X, int *_Nonnull Y) { |
| unknown(X); |
| nonnull(Y); |
| if (X != Y) { |
| unknown(X); |
| nonnull(Y); |
| } else { |
| nonnull(X); |
| nonnull(Y); |
| } |
| unknown(X); |
| nonnull(Y); |
| } |
| TEST void nonnullNotEqualsUnknown(int *X, int *_Nonnull Y) { |
| unknown(X); |
| nonnull(Y); |
| if (Y != X) { |
| unknown(X); |
| nonnull(Y); |
| } else { |
| nonnull(X); |
| nonnull(Y); |
| } |
| unknown(X); |
| nonnull(Y); |
| } |