|  | // -*- 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___CXX03___ASSERT | 
|  | #define _LIBCPP___CXX03___ASSERT | 
|  |  | 
|  | #include <__assertion_handler> // Note: this include is generated by CMake and is potentially vendor-provided. | 
|  | #include <__cxx03/__config> | 
|  |  | 
|  | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | 
|  | #  pragma GCC system_header | 
|  | #endif | 
|  |  | 
|  | #define _LIBCPP_ASSERT(expression, message)                                                                            \ | 
|  | (__builtin_expect(static_cast<bool>(expression), 1)                                                                  \ | 
|  | ? (void)0                                                                                                       \ | 
|  | : _LIBCPP_ASSERTION_HANDLER(__FILE__ ":" _LIBCPP_TOSTRING(__LINE__) ": assertion " _LIBCPP_TOSTRING(            \ | 
|  | expression) " failed: " message "\n")) | 
|  |  | 
|  | // TODO: __builtin_assume can currently inhibit optimizations. Until this has been fixed and we can add | 
|  | //       assumptions without a clear optimization intent, disable that to avoid worsening the code generation. | 
|  | //       See https://discourse.llvm.org/t/llvm-assume-blocks-optimization/71609 for a discussion. | 
|  | #if 0 && __has_builtin(__builtin_assume) | 
|  | #  define _LIBCPP_ASSUME(expression)                                                                                   \ | 
|  | (_LIBCPP_DIAGNOSTIC_PUSH _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume")                                              \ | 
|  | __builtin_assume(static_cast<bool>(expression)) _LIBCPP_DIAGNOSTIC_POP) | 
|  | #else | 
|  | #  define _LIBCPP_ASSUME(expression) ((void)0) | 
|  | #endif | 
|  |  | 
|  | // clang-format off | 
|  | // Fast hardening mode checks. | 
|  |  | 
|  | #if _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST | 
|  |  | 
|  | // Enabled checks. | 
|  | #  define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message)       _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message)    _LIBCPP_ASSERT(expression, message) | 
|  | // Disabled checks. | 
|  | // On most modern platforms, dereferencing a null pointer does not lead to an actual memory access. | 
|  | #  define _LIBCPP_ASSERT_NON_NULL(expression, message)                _LIBCPP_ASSUME(expression) | 
|  | // Overlapping ranges will make algorithms produce incorrect results but don't directly lead to a security | 
|  | // vulnerability. | 
|  | #  define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)  _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message)      _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)    _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message)  _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_PEDANTIC(expression, message)                _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message)    _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_INTERNAL(expression, message)                _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)           _LIBCPP_ASSUME(expression) | 
|  |  | 
|  | // Extensive hardening mode checks. | 
|  |  | 
|  | #elif _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_EXTENSIVE | 
|  |  | 
|  | // Enabled checks. | 
|  | #  define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message)       _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message)    _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_NON_NULL(expression, message)                _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)  _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message)      _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)    _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message)  _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_PEDANTIC(expression, message)                _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)           _LIBCPP_ASSERT(expression, message) | 
|  | // Disabled checks. | 
|  | #  define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message)    _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_INTERNAL(expression, message)                _LIBCPP_ASSUME(expression) | 
|  |  | 
|  | // Debug hardening mode checks. | 
|  |  | 
|  | #elif _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_DEBUG | 
|  |  | 
|  | // All checks enabled. | 
|  | #  define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message)       _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message)    _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_NON_NULL(expression, message)                _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)  _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message)      _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)    _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message)  _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_PEDANTIC(expression, message)                _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message)    _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_INTERNAL(expression, message)                _LIBCPP_ASSERT(expression, message) | 
|  | #  define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)           _LIBCPP_ASSERT(expression, message) | 
|  |  | 
|  | // Disable all checks if hardening is not enabled. | 
|  |  | 
|  | #else | 
|  |  | 
|  | // All checks disabled. | 
|  | #  define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message)       _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message)    _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_NON_NULL(expression, message)                _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message)  _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message)      _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message)    _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message)  _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_PEDANTIC(expression, message)                _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message)    _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_INTERNAL(expression, message)                _LIBCPP_ASSUME(expression) | 
|  | #  define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message)           _LIBCPP_ASSUME(expression) | 
|  |  | 
|  | #endif // _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST | 
|  | // clang-format on | 
|  |  | 
|  | #endif // _LIBCPP___CXX03___ASSERT |