1f87aa19bSLouis Dionne// -*- C++ -*- 2f87aa19bSLouis Dionne//===----------------------------------------------------------------------===// 3f87aa19bSLouis Dionne// 4f87aa19bSLouis Dionne// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5f87aa19bSLouis Dionne// See https://llvm.org/LICENSE.txt for license information. 6f87aa19bSLouis Dionne// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7f87aa19bSLouis Dionne// 8f87aa19bSLouis Dionne//===----------------------------------------------------------------------===// 9f87aa19bSLouis Dionne 10f87aa19bSLouis Dionne#ifndef _LIBCPP___ASSERT 11f87aa19bSLouis Dionne#define _LIBCPP___ASSERT 12f87aa19bSLouis Dionne 13b0fd9497SLouis Dionne#include <__availability> 14f87aa19bSLouis Dionne#include <__config> 15f87aa19bSLouis Dionne 16f87aa19bSLouis Dionne#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17f87aa19bSLouis Dionne# pragma GCC system_header 18f87aa19bSLouis Dionne#endif 19f87aa19bSLouis Dionne 20b0fd9497SLouis Dionne// This is for backwards compatibility with code that might have been enabling 21b0fd9497SLouis Dionne// assertions through the Debug mode previously. 22*f3966eafSLouis Dionne// TODO: In LLVM 16, make it an error to define _LIBCPP_DEBUG 23*f3966eafSLouis Dionne#if defined(_LIBCPP_DEBUG) 24*f3966eafSLouis Dionne# ifndef _LIBCPP_ENABLE_ASSERTIONS 25*f3966eafSLouis Dionne# define _LIBCPP_ENABLE_ASSERTIONS 1 26*f3966eafSLouis Dionne# endif 27*f3966eafSLouis Dionne#endif 28*f3966eafSLouis Dionne 29*f3966eafSLouis Dionne// Automatically enable assertions when the debug mode is enabled. 30*f3966eafSLouis Dionne#if defined(_LIBCPP_ENABLE_DEBUG_MODE) 31b0fd9497SLouis Dionne# ifndef _LIBCPP_ENABLE_ASSERTIONS 32b0fd9497SLouis Dionne# define _LIBCPP_ENABLE_ASSERTIONS 1 33b0fd9497SLouis Dionne# endif 34b0fd9497SLouis Dionne#endif 35b0fd9497SLouis Dionne 36b0fd9497SLouis Dionne#ifndef _LIBCPP_ENABLE_ASSERTIONS 37b0fd9497SLouis Dionne# define _LIBCPP_ENABLE_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS_DEFAULT 38b0fd9497SLouis Dionne#endif 39b0fd9497SLouis Dionne 40b0fd9497SLouis Dionne#if _LIBCPP_ENABLE_ASSERTIONS != 0 && _LIBCPP_ENABLE_ASSERTIONS != 1 41b0fd9497SLouis Dionne# error "_LIBCPP_ENABLE_ASSERTIONS must be set to 0 or 1" 42b0fd9497SLouis Dionne#endif 43b0fd9497SLouis Dionne 44b0fd9497SLouis Dionne#if _LIBCPP_ENABLE_ASSERTIONS 45f0799465SLouis Dionne# define _LIBCPP_ASSERT(expression, message) \ 46f0799465SLouis Dionne (__builtin_expect(static_cast<bool>(expression), 1) ? \ 47f0799465SLouis Dionne (void)0 : \ 48f0799465SLouis Dionne ::std::__libcpp_assertion_handler(__FILE__, __LINE__, #expression, message)) 490a77e633SArthur Eubanks#elif !defined(_LIBCPP_ASSERTIONS_DISABLE_ASSUME) && __has_builtin(__builtin_assume) 50f0799465SLouis Dionne# define _LIBCPP_ASSERT(expression, message) \ 51f0799465SLouis Dionne (_LIBCPP_DIAGNOSTIC_PUSH \ 52f0799465SLouis Dionne _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume") \ 53f0799465SLouis Dionne __builtin_assume(static_cast<bool>(expression)) \ 54f0799465SLouis Dionne _LIBCPP_DIAGNOSTIC_POP) 55f0799465SLouis Dionne#else 56f0799465SLouis Dionne# define _LIBCPP_ASSERT(expression, message) ((void)0) 57f0799465SLouis Dionne#endif 58f87aa19bSLouis Dionne 59f87aa19bSLouis Dionne_LIBCPP_BEGIN_NAMESPACE_STD 60f87aa19bSLouis Dionne 61b0fd9497SLouis Dionne_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_ASSERTION_HANDLER 62b0fd9497SLouis Dionnevoid __libcpp_assertion_handler(char const* __file, int __line, char const* __expression, char const* __message); 63f87aa19bSLouis Dionne 64f87aa19bSLouis Dionne_LIBCPP_END_NAMESPACE_STD 65f87aa19bSLouis Dionne 66f87aa19bSLouis Dionne#endif // _LIBCPP___ASSERT 67