X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=includes%2Fassert.h;h=44b30b87b7bdbe98281ad086afed1162fb623a4c;hp=7874167258675dcb713b9e2f69328db9f2e2b4ad;hb=0b6ba474c9a13ef218554539106c0a52776ac189;hpb=b41576197133c1211d6ec353faf93f505f573b8a diff --git a/includes/assert.h b/includes/assert.h index 7874167..44b30b8 100644 --- a/includes/assert.h +++ b/includes/assert.h @@ -1,45 +1,70 @@ -/* $Id$ */ - /* 7.2 Diagnostics This file is part of the Public Domain C Library (PDCLib). Permission is granted to use, modify, and / or redistribute at will. */ -#ifndef _PDCLIB_ASSERT_H -#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H #include <_PDCLIB_aux.h> #include <_PDCLIB_config.h> + +/* + Defines a macro assert() that, depending on the value of the preprocessor + symbol NDEBUG, does + * evaluate to a void expression if NDEBUG is set OR the parameter expression + evaluates to true; + * print an error message and terminates the program if NDEBUG is not set AND + the parameter expression evaluates to false. + The error message contains the parameter expression, name of the source file + (__FILE__), line number (__LINE__), and (from C99 onward) name of the function + (__func__). + The header can be included MULTIPLE times, and redefines the macro depending + on the current setting of NDEBUG. +*/ + _PDCLIB_BEGIN_EXTERN_C +#ifndef _PDCLIB_ASSERT_H +#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H + +/* Functions _NOT_ tagged noreturn as this hampers debugging */ void _PDCLIB_assert99( char const * const, char const * const, char const * const ); void _PDCLIB_assert89( char const * const ); +#if _PDCLIB_C_VERSION >= 2011 +#define static_assert _Static_assert +#else +#define static_assert( e, m ) +#endif + +#endif + /* If NDEBUG is set, assert() is a null operation. */ #undef assert #ifdef NDEBUG #define assert( ignore ) ( (void) 0 ) -#elif _PDCLIB_C_VERSION >= 99 +#elif _PDCLIB_C_MIN(99) #define assert(expression) \ - do { if(!(expression)) \ - _PDCLIB_assert99("Assertion failed: " #expression \ + do { if(!(expression)) { \ + _PDCLIB_assert99("Assertion failed: " _PDCLIB_symbol2string(expression)\ ", function ", __func__, \ ", file " __FILE__ \ ", line " _PDCLIB_symbol2string( __LINE__ ) \ "." _PDCLIB_endl ); \ + _PDCLIB_UNREACHABLE; \ + } \ } while(0) + #else #define assert(expression) \ - do { \ - if(!(expression)) \ - _PDCLIB_assert89( "Assertion failed: " #expression \ - ", file " __FILE__ \ - ", line " _PDCLIB_symbol2string( __LINE__ ) \ - "." _PDCLIB_endl ); \ + do { if(!(expression)) { \ + _PDCLIB_assert89("Assertion failed: " _PDCLIB_symbol2string(expression)\ + ", file " __FILE__ \ + ", line " _PDCLIB_symbol2string( __LINE__ ) \ + "." _PDCLIB_endl ); \ + _PDCLIB_UNREACHABLE; \ + } \ } while(0) #endif _PDCLIB_END_EXTERN_C -#endif -