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 13f87aa19bSLouis Dionne#include <__config> 14*3a55353fSLouis Dionne#include <__verbose_abort> 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. 22f3966eafSLouis Dionne// TODO: In LLVM 16, make it an error to define _LIBCPP_DEBUG 23f3966eafSLouis Dionne#if defined(_LIBCPP_DEBUG) 24f3966eafSLouis Dionne# ifndef _LIBCPP_ENABLE_ASSERTIONS 25f3966eafSLouis Dionne# define _LIBCPP_ENABLE_ASSERTIONS 1 26f3966eafSLouis Dionne# endif 27f3966eafSLouis Dionne#endif 28f3966eafSLouis Dionne 29f3966eafSLouis Dionne// Automatically enable assertions when the debug mode is enabled. 30f3966eafSLouis 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 : \ 48*3a55353fSLouis Dionne ::std::__libcpp_verbose_abort("%s:%d: assertion %s failed: %s", __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#endif // _LIBCPP___ASSERT 60