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