Since we expect the condition to be true most of the time, we might as well tell the compiler. And when assertions are disabled, we might as well tell the compiler that it's allowed to assume that the condition holds. Differential Revision: https://reviews.llvm.org/D122397
61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP___ASSERT
|
|
#define _LIBCPP___ASSERT
|
|
|
|
#include <__availability>
|
|
#include <__config>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
// This is for backwards compatibility with code that might have been enabling
|
|
// assertions through the Debug mode previously.
|
|
#if _LIBCPP_DEBUG_LEVEL >= 1
|
|
# ifndef _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ENABLE_ASSERTIONS 1
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ENABLE_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS_DEFAULT
|
|
#endif
|
|
|
|
#if _LIBCPP_ENABLE_ASSERTIONS != 0 && _LIBCPP_ENABLE_ASSERTIONS != 1
|
|
# error "_LIBCPP_ENABLE_ASSERTIONS must be set to 0 or 1"
|
|
#endif
|
|
|
|
#if _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ASSERT(expression, message) \
|
|
(__builtin_expect(static_cast<bool>(expression), 1) ? \
|
|
(void)0 : \
|
|
::std::__libcpp_assertion_handler(__FILE__, __LINE__, #expression, message))
|
|
#else
|
|
# if __has_builtin(__builtin_assume)
|
|
# define _LIBCPP_ASSERT(expression, message) \
|
|
(_LIBCPP_DIAGNOSTIC_PUSH \
|
|
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume") \
|
|
__builtin_assume(static_cast<bool>(expression)) \
|
|
_LIBCPP_DIAGNOSTIC_POP)
|
|
# else
|
|
# define _LIBCPP_ASSERT(expression, message) ((void)0)
|
|
# endif
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_ASSERTION_HANDLER
|
|
void __libcpp_assertion_handler(char const* __file, int __line, char const* __expression, char const* __message);
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP___ASSERT
|