xref: /aosp_15_r20/bionic/libc/include/assert.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*-
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (c) 1992, 1993
3*8d67ca89SAndroid Build Coastguard Worker  *	The Regents of the University of California.  All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  * (c) UNIX System Laboratories, Inc.
5*8d67ca89SAndroid Build Coastguard Worker  * All or some portions of this file are derived from material licensed
6*8d67ca89SAndroid Build Coastguard Worker  * to the University of California by American Telephone and Telegraph
7*8d67ca89SAndroid Build Coastguard Worker  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8*8d67ca89SAndroid Build Coastguard Worker  * the permission of UNIX System Laboratories, Inc.
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
11*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
12*8d67ca89SAndroid Build Coastguard Worker  * are met:
13*8d67ca89SAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
14*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
15*8d67ca89SAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
16*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
17*8d67ca89SAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
18*8d67ca89SAndroid Build Coastguard Worker  * 3. Neither the name of the University nor the names of its contributors
19*8d67ca89SAndroid Build Coastguard Worker  *    may be used to endorse or promote products derived from this software
20*8d67ca89SAndroid Build Coastguard Worker  *    without specific prior written permission.
21*8d67ca89SAndroid Build Coastguard Worker  *
22*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*8d67ca89SAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*8d67ca89SAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*8d67ca89SAndroid Build Coastguard Worker  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*8d67ca89SAndroid Build Coastguard Worker  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*8d67ca89SAndroid Build Coastguard Worker  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*8d67ca89SAndroid Build Coastguard Worker  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*8d67ca89SAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*8d67ca89SAndroid Build Coastguard Worker  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*8d67ca89SAndroid Build Coastguard Worker  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
33*8d67ca89SAndroid Build Coastguard Worker  */
34*8d67ca89SAndroid Build Coastguard Worker 
35*8d67ca89SAndroid Build Coastguard Worker /**
36*8d67ca89SAndroid Build Coastguard Worker  * @file assert.h
37*8d67ca89SAndroid Build Coastguard Worker  * @brief Assertions.
38*8d67ca89SAndroid Build Coastguard Worker  *
39*8d67ca89SAndroid Build Coastguard Worker  * There's no include guard in this file because <assert.h> may usefully be
40*8d67ca89SAndroid Build Coastguard Worker  * included multiple times, with and without NDEBUG defined.
41*8d67ca89SAndroid Build Coastguard Worker  */
42*8d67ca89SAndroid Build Coastguard Worker 
43*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
44*8d67ca89SAndroid Build Coastguard Worker 
45*8d67ca89SAndroid Build Coastguard Worker #undef assert
46*8d67ca89SAndroid Build Coastguard Worker #undef __assert_no_op
47*8d67ca89SAndroid Build Coastguard Worker 
48*8d67ca89SAndroid Build Coastguard Worker /** Internal implementation detail. Do not use. */
49*8d67ca89SAndroid Build Coastguard Worker #define __assert_no_op __BIONIC_CAST(static_cast, void, 0)
50*8d67ca89SAndroid Build Coastguard Worker 
51*8d67ca89SAndroid Build Coastguard Worker #ifdef NDEBUG
52*8d67ca89SAndroid Build Coastguard Worker # define assert(e) __assert_no_op
53*8d67ca89SAndroid Build Coastguard Worker #else
54*8d67ca89SAndroid Build Coastguard Worker # if defined(__cplusplus) || __STDC_VERSION__ >= 199901L
55*8d67ca89SAndroid Build Coastguard Worker #  define assert(e) ((e) ? __assert_no_op : __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, #e))
56*8d67ca89SAndroid Build Coastguard Worker # else
57*8d67ca89SAndroid Build Coastguard Worker /**
58*8d67ca89SAndroid Build Coastguard Worker  * assert() aborts the program after logging an error message, if the
59*8d67ca89SAndroid Build Coastguard Worker  * expression evaluates to false.
60*8d67ca89SAndroid Build Coastguard Worker  *
61*8d67ca89SAndroid Build Coastguard Worker  * On Android, the error goes to both stderr and logcat.
62*8d67ca89SAndroid Build Coastguard Worker  */
63*8d67ca89SAndroid Build Coastguard Worker #  define assert(e) ((e) ? __assert_no_op : __assert(__FILE__, __LINE__, #e))
64*8d67ca89SAndroid Build Coastguard Worker # endif
65*8d67ca89SAndroid Build Coastguard Worker #endif
66*8d67ca89SAndroid Build Coastguard Worker 
67*8d67ca89SAndroid Build Coastguard Worker /* `static_assert` is a keyword in C++11 and C23; C11 had `_Static_assert` instead. */
68*8d67ca89SAndroid Build Coastguard Worker #if !defined(__cplusplus) && (__STDC_VERSION__ >= 201112L && __STDC_VERSION__ < 202311L)
69*8d67ca89SAndroid Build Coastguard Worker # undef static_assert
70*8d67ca89SAndroid Build Coastguard Worker # define static_assert _Static_assert
71*8d67ca89SAndroid Build Coastguard Worker #endif
72*8d67ca89SAndroid Build Coastguard Worker 
73*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
74*8d67ca89SAndroid Build Coastguard Worker 
75*8d67ca89SAndroid Build Coastguard Worker /**
76*8d67ca89SAndroid Build Coastguard Worker  * __assert() is called by assert() on failure. Most users want assert()
77*8d67ca89SAndroid Build Coastguard Worker  * instead, but this can be useful for reporting other failures.
78*8d67ca89SAndroid Build Coastguard Worker  */
79*8d67ca89SAndroid Build Coastguard Worker void __assert(const char* _Nonnull __file, int __line, const char* _Nonnull __msg) __noreturn;
80*8d67ca89SAndroid Build Coastguard Worker 
81*8d67ca89SAndroid Build Coastguard Worker /**
82*8d67ca89SAndroid Build Coastguard Worker  * __assert2() is called by assert() on failure. Most users want assert()
83*8d67ca89SAndroid Build Coastguard Worker  * instead, but this can be useful for reporting other failures.
84*8d67ca89SAndroid Build Coastguard Worker  */
85*8d67ca89SAndroid Build Coastguard Worker void __assert2(const char* _Nonnull __file, int __line, const char* _Nonnull __function, const char* _Nonnull __msg) __noreturn;
86*8d67ca89SAndroid Build Coastguard Worker 
87*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
88