1*4bdff4beSrobert// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 3*4bdff4beSrobert// 4*4bdff4beSrobert// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4bdff4beSrobert// See https://llvm.org/LICENSE.txt for license information. 6*4bdff4beSrobert// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4bdff4beSrobert// 8*4bdff4beSrobert//===----------------------------------------------------------------------===// 9*4bdff4beSrobert 10*4bdff4beSrobert#ifndef _LIBCPP___ASSERT 11*4bdff4beSrobert#define _LIBCPP___ASSERT 12*4bdff4beSrobert 13*4bdff4beSrobert#include <__config> 14*4bdff4beSrobert#include <__verbose_abort> 15*4bdff4beSrobert 16*4bdff4beSrobert#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*4bdff4beSrobert# pragma GCC system_header 18*4bdff4beSrobert#endif 19*4bdff4beSrobert 20*4bdff4beSrobert// TODO: Remove in LLVM 17. 21*4bdff4beSrobert#if defined(_LIBCPP_DEBUG) 22*4bdff4beSrobert# error "Defining _LIBCPP_DEBUG is not supported anymore. Please use _LIBCPP_ENABLE_DEBUG_MODE instead." 23*4bdff4beSrobert#endif 24*4bdff4beSrobert 25*4bdff4beSrobert// Automatically enable assertions when the debug mode is enabled. 26*4bdff4beSrobert#if defined(_LIBCPP_ENABLE_DEBUG_MODE) 27*4bdff4beSrobert# ifndef _LIBCPP_ENABLE_ASSERTIONS 28*4bdff4beSrobert# define _LIBCPP_ENABLE_ASSERTIONS 1 29*4bdff4beSrobert# endif 30*4bdff4beSrobert#endif 31*4bdff4beSrobert 32*4bdff4beSrobert#ifndef _LIBCPP_ENABLE_ASSERTIONS 33*4bdff4beSrobert# define _LIBCPP_ENABLE_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS_DEFAULT 34*4bdff4beSrobert#endif 35*4bdff4beSrobert 36*4bdff4beSrobert#if _LIBCPP_ENABLE_ASSERTIONS != 0 && _LIBCPP_ENABLE_ASSERTIONS != 1 37*4bdff4beSrobert# error "_LIBCPP_ENABLE_ASSERTIONS must be set to 0 or 1" 38*4bdff4beSrobert#endif 39*4bdff4beSrobert 40*4bdff4beSrobert#if _LIBCPP_ENABLE_ASSERTIONS 41*4bdff4beSrobert# define _LIBCPP_ASSERT(expression, message) \ 42*4bdff4beSrobert (__builtin_expect(static_cast<bool>(expression), 1) ? \ 43*4bdff4beSrobert (void)0 : \ 44*4bdff4beSrobert _LIBCPP_VERBOSE_ABORT("%s:%d: assertion %s failed: %s", __FILE__, __LINE__, #expression, message)) 45*4bdff4beSrobert#elif !defined(_LIBCPP_ASSERTIONS_DISABLE_ASSUME) && __has_builtin(__builtin_assume) 46*4bdff4beSrobert# define _LIBCPP_ASSERT(expression, message) \ 47*4bdff4beSrobert (_LIBCPP_DIAGNOSTIC_PUSH \ 48*4bdff4beSrobert _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume") \ 49*4bdff4beSrobert __builtin_assume(static_cast<bool>(expression)) \ 50*4bdff4beSrobert _LIBCPP_DIAGNOSTIC_POP) 51*4bdff4beSrobert#else 52*4bdff4beSrobert# define _LIBCPP_ASSERT(expression, message) ((void)0) 53*4bdff4beSrobert#endif 54*4bdff4beSrobert 55*4bdff4beSrobert#endif // _LIBCPP___ASSERT 56