1/* Compile-time assert-like macros.
2
3   Copyright (C) 2005 Free Software Foundation, Inc.
4
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)
8   any later version.
9
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.
14
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.  */
18
19/* Written by Paul Eggert and Jim Meyering.  */
20
21#ifndef VERIFY_H
22# define VERIFY_H 1
23
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.  */
27
28/* A type that is valid if and only if R is a nonzero constant expression.
29   The symbols verify_type__ and verify_error_if_negative_size__ are
30   private to this header file.  */
31
32# define verify_type__(R) \
33    struct { unsigned int verify_error_if_negative_size__ : (R) ? 1 : -1; }
34
35/* Verify requirement R at compile-time, as a declaration.  */
36
37# define verify(R) \
38    extern int (* verify_function__ (void)) [sizeof (verify_type__ (R))]
39
40/* Verify requirement R at compile-time, as an expression.
41   This macro can be used in some contexts where verify cannot, and vice versa.
42   Return void.  */
43
44# define verify_expr(R) ((void) ((verify_type__ (R) *) 0))
45
46#endif
47