* verify.h (verify_true): Provide alternative definition for C++.
[gnulib.git] / lib / verify.h
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    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.
32
33    The symbols verify_error_if_negative_size__ and verify_function__
34    are private to this header.  */
35
36 /* Verify requirement R at compile-time, as an integer constant expression.
37    Return true.  */
38
39 # ifdef __cplusplus
40 template <int w>
41   struct verify_type__ { unsigned int verify_error_if_negative_size__: w; };
42 #  define verify_true(R) \
43      (!!sizeof (verify_type__<(R) ? 1 : -1>))
44 # else
45 #  define verify_true(R) \
46      (!!sizeof \
47       (struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
48 # endif
49
50 /* Verify requirement R at compile-time, as a declaration without a
51    trailing ';'.  */
52
53 # define verify(R) extern int (* verify_function__ (void)) [verify_true (R)]
54
55 #endif