blob: 22a9eb86d50f4f06c459ab7cd0fae72349fed6de [file] [log] [blame]
// 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
// This file contains macro definitions that enable inference tooling to detect
// calls to these macros and collect appropriate evidence based on knowledge of
// the macros' behavior.
// Each macro to be replaced should be defined as a call to our copy, with all
// arguments passed to the appropriate argument-capture function based on the
// behavior of the macro and its number of parameters, followed on a new line by
// an empty definition of the copy, of the format
// `#define __clang_tidy_nullability_<macro name>(<params>)` with the same
// parameters as the original macro.
// The inference tools will then give __clang_tidy_nullability_<macro name> the
// definition of the original macro, ensuring code compiles properly.
// This file's name is intentionally additionally namespaced because it will be
// included in affected translation units without the containing directories.
// IWYU pragma: private, include macros from their original definition sites
#ifndef THIRD_PARTY_CRUBIT_NULLABILITY_INFERENCE_CLANG_TIDY_NULLABILITY_REPLACEMENT_MACROS_H_
#define THIRD_PARTY_CRUBIT_NULLABILITY_INFERENCE_CLANG_TIDY_NULLABILITY_REPLACEMENT_MACROS_H_
#ifdef __cplusplus
// Forwarding function to allow detection of assert-like macro arguments.
// Used for single-argument macros that abort if the argument is false.
template <typename T>
constexpr T&& clang_tidy_nullability_internal_abortIfFalse(T&& Arg) {
return static_cast<T&&>(Arg);
}
// Forwarding function to allow detection of both arguments of assert-like
// not-equal comparisons.
template <typename First, typename Second>
constexpr First&& clang_tidy_nullability_internal_abortIfEqual(First&& FirstArg,
Second&&) {
return static_cast<First&&>(FirstArg);
}
#define CHECK(x) \
__clang_tidy_nullability_CHECK( \
::clang_tidy_nullability_internal_abortIfFalse(x))
#define __clang_tidy_nullability_CHECK(x)
#define QCHECK(x) \
__clang_tidy_nullability_QCHECK( \
::clang_tidy_nullability_internal_abortIfFalse(x))
#define __clang_tidy_nullability_QCHECK(x)
#define DCHECK(x) \
__clang_tidy_nullability_DCHECK( \
::clang_tidy_nullability_internal_abortIfFalse(x))
#define __clang_tidy_nullability_DCHECK(x)
#define PCHECK(x) \
__clang_tidy_nullability_PCHECK( \
::clang_tidy_nullability_internal_abortIfFalse(x))
#define __clang_tidy_nullability_PCHECK(x)
#define ABSL_DIE_IF_NULL(x) \
__clang_tidy_nullability_ABSL_DIE_IF_NULL( \
::clang_tidy_nullability_internal_abortIfFalse(x))
#define __clang_tidy_nullability_ABSL_DIE_IF_NULL(x)
#define CHECK_NE(x, y) \
__clang_tidy_nullability_CHECK_NE( \
::clang_tidy_nullability_internal_abortIfEqual(x, y), y)
#define __clang_tidy_nullability_CHECK_NE(x, y)
#define QCHECK_NE(x, y) \
__clang_tidy_nullability_QCHECK_NE( \
::clang_tidy_nullability_internal_abortIfEqual(x, y), y)
#define __clang_tidy_nullability_QCHECK_NE(x, y)
#define DCHECK_NE(x, y) \
__clang_tidy_nullability_DCHECK_NE( \
::clang_tidy_nullability_internal_abortIfEqual(x, y), y)
#define __clang_tidy_nullability_DCHECK_NE(x, y)
// Could infer Nullable from CHECK_EQ comparisons with nullptr, but not as
// likely to provide additional coverage as CHECK_NE leading to Nonnull.
#endif // __cplusplus
#endif // THIRD_PARTY_CRUBIT_NULLABILITY_INFERENCE_CLANG_TIDY_NULLABILITY_REPLACEMENT_MACROS_H_