Paul Eggert wrote:
> The first step is to add a new module "verify", which defines macros
> verify(EXPR) and verify_expr(EXPR) that act like assert(EXPR) except
> they check EXPR at compile-time, not at run-time.  verify(EXPR) is for
> declaration contexts, and verify_expr is for expression contexts.

Thanks a lot for making this generally available!

At first sight, using a bitfield width instead of an array size, to
avoid multiple-definition errors, seems awfully cool. But it does not
work:

$ cat foo.c
#include "verify.h"
verify (1 + 1 == 2); verify (1 + 1 == 2);
$ gcc -O -c foo.c
foo.c:2: conflicting types for `verify_function_2'
foo.c:2: previous declaration of `verify_function_2'

Here's a fix that makes this work. OK to commit?

Bruno


diff -c -3 -r1.1 verify.h
*** verify.h    22 Sep 2005 22:56:29 -0000      1.1
--- verify.h    23 Sep 2005 09:48:54 -0000
***************
*** 16,22 ****
     along with this program; if not, write to the Free Software Foundation,
     Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
  
! /* Written by Paul Eggert and Jim Meyering.  */
  
  #ifndef VERIFY_H
  # define VERIFY_H 1
--- 16,22 ----
     along with this program; if not, write to the Free Software Foundation,
     Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
  
! /* Written by Paul Eggert, Jim Meyering, Bruno Haible.  */
  
  #ifndef VERIFY_H
  # define VERIFY_H 1
***************
*** 26,36 ****
  
  /* A type that is valid if and only if R is nonzero.
     R should be an integer constant expression.
!    verify_type__ and verify_error_if_negative_size__ are symbols that
!    are private to this header file.  */
  
! # define verify_type__(R) \
!     struct { int verify_error_if_negative_size__ : (R) ? 1 : -1; }
  
  /* Verify requirement R at compile-time, as a declaration.
     R should be an integer constant expression.
--- 26,36 ----
  
  /* A type that is valid if and only if R is nonzero.
     R should be an integer constant expression.
!    verify_array_type__ and verify_pointer_type__ are symbols that are
!    private to this header file.  */
  
! # define verify_array_type__(R) int [(R) ? 1 : -1]
! # define verify_pointer_type__(R) int (*) [(R) ? 1 : -1]
  
  /* Verify requirement R at compile-time, as a declaration.
     R should be an integer constant expression.
***************
*** 44,50 ****
     no conforming compiler will reject them outright.  */
  
  # define verify(R) \
!     extern verify_type__ (R) GL_CONCAT (verify_function_, __LINE__) (void)
  
  /* Verify requirement R at compile-time, as an expression.
     R should be an integer constant expression.
--- 44,50 ----
     no conforming compiler will reject them outright.  */
  
  # define verify(R) \
!     extern void GL_CONCAT (verify_function_, __LINE__) (verify_array_type__ 
(R))
  
  /* Verify requirement R at compile-time, as an expression.
     R should be an integer constant expression.
***************
*** 52,57 ****
     This macro can be used in some contexts where verify cannot, and vice 
versa.
     Return void.  */
  
! # define verify_expr(R) ((void) ((verify_type__ (R) *) 0))
  
  #endif
--- 52,57 ----
     This macro can be used in some contexts where verify cannot, and vice 
versa.
     Return void.  */
  
! # define verify_expr(R) ((void) ((verify_pointer_type__ (R)) 0))
  
  #endif



_______________________________________________
bug-gnulib mailing list
bug-gnulib@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-gnulib

Reply via email to