1*f87aa19bSLouis Dionne// -*- C++ -*- 2*f87aa19bSLouis Dionne//===----------------------------------------------------------------------===// 3*f87aa19bSLouis Dionne// 4*f87aa19bSLouis Dionne// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*f87aa19bSLouis Dionne// See https://llvm.org/LICENSE.txt for license information. 6*f87aa19bSLouis Dionne// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*f87aa19bSLouis Dionne// 8*f87aa19bSLouis Dionne//===----------------------------------------------------------------------===// 9*f87aa19bSLouis Dionne 10*f87aa19bSLouis Dionne#ifndef _LIBCPP___ASSERT 11*f87aa19bSLouis Dionne#define _LIBCPP___ASSERT 12*f87aa19bSLouis Dionne 13*f87aa19bSLouis Dionne#include <__config> 14*f87aa19bSLouis Dionne#include <iosfwd> // for std::string 15*f87aa19bSLouis Dionne 16*f87aa19bSLouis Dionne#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 17*f87aa19bSLouis Dionne# pragma GCC system_header 18*f87aa19bSLouis Dionne#endif 19*f87aa19bSLouis Dionne 20*f87aa19bSLouis Dionne#if _LIBCPP_DEBUG_LEVEL >= 1 21*f87aa19bSLouis Dionne# define _LIBCPP_ASSERT_IMPL(x, m) ((x) ? (void)0 : ::std::__libcpp_debug_function(::std::__libcpp_debug_info(__FILE__, __LINE__, #x, m))) 22*f87aa19bSLouis Dionne#else 23*f87aa19bSLouis Dionne# define _LIBCPP_ASSERT_IMPL(x, m) ((void)0) 24*f87aa19bSLouis Dionne#endif 25*f87aa19bSLouis Dionne 26*f87aa19bSLouis Dionne// We do this dance because some of our tests re-define _LIBCPP_ASSERT to something else. 27*f87aa19bSLouis Dionne// In the future, we should find other ways to test our assertions and disallow re-defining 28*f87aa19bSLouis Dionne// _LIBCPP_ASSERT. 29*f87aa19bSLouis Dionne#if !defined(_LIBCPP_ASSERT) 30*f87aa19bSLouis Dionne# define _LIBCPP_ASSERT(x, m) _LIBCPP_ASSERT_IMPL(x, m) 31*f87aa19bSLouis Dionne#endif 32*f87aa19bSLouis Dionne 33*f87aa19bSLouis Dionne_LIBCPP_BEGIN_NAMESPACE_STD 34*f87aa19bSLouis Dionne 35*f87aa19bSLouis Dionnestruct _LIBCPP_TEMPLATE_VIS __libcpp_debug_info { 36*f87aa19bSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 37*f87aa19bSLouis Dionne __libcpp_debug_info() 38*f87aa19bSLouis Dionne : __file_(nullptr), __line_(-1), __pred_(nullptr), __msg_(nullptr) {} 39*f87aa19bSLouis Dionne _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 40*f87aa19bSLouis Dionne __libcpp_debug_info(const char* __f, int __l, const char* __p, const char* __m) 41*f87aa19bSLouis Dionne : __file_(__f), __line_(__l), __pred_(__p), __msg_(__m) {} 42*f87aa19bSLouis Dionne 43*f87aa19bSLouis Dionne _LIBCPP_FUNC_VIS string what() const; 44*f87aa19bSLouis Dionne 45*f87aa19bSLouis Dionne const char* __file_; 46*f87aa19bSLouis Dionne int __line_; 47*f87aa19bSLouis Dionne const char* __pred_; 48*f87aa19bSLouis Dionne const char* __msg_; 49*f87aa19bSLouis Dionne}; 50*f87aa19bSLouis Dionne 51*f87aa19bSLouis Dionne/// __libcpp_debug_function_type - The type of the assertion failure handler. 52*f87aa19bSLouis Dionnetypedef void(*__libcpp_debug_function_type)(__libcpp_debug_info const&); 53*f87aa19bSLouis Dionne 54*f87aa19bSLouis Dionne/// __libcpp_debug_function - The handler function called when a _LIBCPP_ASSERT 55*f87aa19bSLouis Dionne/// fails. 56*f87aa19bSLouis Dionneextern _LIBCPP_EXPORTED_FROM_ABI __libcpp_debug_function_type __libcpp_debug_function; 57*f87aa19bSLouis Dionne 58*f87aa19bSLouis Dionne/// __libcpp_abort_debug_function - A debug handler that aborts when called. 59*f87aa19bSLouis Dionne_LIBCPP_NORETURN _LIBCPP_FUNC_VIS 60*f87aa19bSLouis Dionnevoid __libcpp_abort_debug_function(__libcpp_debug_info const&); 61*f87aa19bSLouis Dionne 62*f87aa19bSLouis Dionne/// __libcpp_set_debug_function - Set the debug handler to the specified 63*f87aa19bSLouis Dionne/// function. 64*f87aa19bSLouis Dionne_LIBCPP_FUNC_VIS 65*f87aa19bSLouis Dionnebool __libcpp_set_debug_function(__libcpp_debug_function_type __func); 66*f87aa19bSLouis Dionne 67*f87aa19bSLouis Dionne_LIBCPP_END_NAMESPACE_STD 68*f87aa19bSLouis Dionne 69*f87aa19bSLouis Dionne#endif // _LIBCPP___ASSERT 70