1 /* Compile-time assert-like macros.
3 Copyright (C) 2005 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software Foundation,
17 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19 /* Written by Paul Eggert and Jim Meyering. */
24 /* Each of these macros verifies that its argument R is a nonzero
25 constant expression. To be portable, R's type must be integer (or
26 boolean). Unlike assert, there is no run-time overhead.
28 There are two macros, since no single macro can be used in all
29 contexts in C. verify_true (R) is for scalar contexts, where it
30 may be cast to void if need be. verify (R) is for declaration
31 contexts, e.g., the top level.
33 The symbols verify_error_if_negative_size__ and verify_function__
34 are private to this header. */
36 /* Verify requirement R at compile-time, as an integer constant expression.
41 struct verify_type__ { unsigned int verify_error_if_negative_size__: w; };
42 # define verify_true(R) \
43 (!!sizeof (verify_type__<(R) ? 1 : -1>))
45 # define verify_true(R) \
47 (struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
50 /* Verify requirement R at compile-time, as a declaration without a
53 # define verify(R) extern int (* verify_function__ (void)) [verify_true (R)]