telepathy-glib: Replace tp_verify_* with equivalent G_STATIC_ASSERTs

Simon McVittie smcv at kemper.freedesktop.org
Wed Sep 17 04:18:21 PDT 2014


Module: telepathy-glib
Branch: master
Commit: d27684c488ceee4f2f54f549738adab0e2e8165d
URL:    http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=d27684c488ceee4f2f54f549738adab0e2e8165d

Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Wed Sep 17 12:14:24 2014 +0100

Replace tp_verify_* with equivalent G_STATIC_ASSERTs

This was breaking the build: gtk-doc no longer understands verify.h.

---

 telepathy-glib/Makefile.am |    2 +-
 telepathy-glib/util.h      |    5 +-
 telepathy-glib/verify.h    |  146 --------------------------------------------
 3 files changed, 4 insertions(+), 149 deletions(-)

diff --git a/telepathy-glib/Makefile.am b/telepathy-glib/Makefile.am
index ce60d7d..fe642b2 100644
--- a/telepathy-glib/Makefile.am
+++ b/telepathy-glib/Makefile.am
@@ -144,7 +144,7 @@ our_headers = \
 
 tpginclude_HEADERS = \
     $(our_headers) \
-    verify.h
+    $(NULL)
 
 BUILT_SOURCES = $(codegen_sources)
 
diff --git a/telepathy-glib/util.h b/telepathy-glib/util.h
index af63a3a..4c26d73 100644
--- a/telepathy-glib/util.h
+++ b/telepathy-glib/util.h
@@ -30,9 +30,10 @@
 #include <gio/gio.h>
 
 #include <telepathy-glib/defs.h>
-#include <telepathy-glib/verify.h>
 
-#define tp_verify_statement(R) ((void) tp_verify_true (R))
+#define tp_verify_statement(R)  ((void) G_STATIC_ASSERT_EXPR (R))
+#define tp_verify_true(R)       (((void) G_STATIC_ASSERT_EXPR (R)), 1)
+#define tp_verify(R)            G_STATIC_ASSERT (R)
 
 G_BEGIN_DECLS
 
diff --git a/telepathy-glib/verify.h b/telepathy-glib/verify.h
deleted file mode 100644
index d46a460..0000000
--- a/telepathy-glib/verify.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Compile-time assert-like macros.
-
-   Imported from gnulib 20090701 and adapted to Telepathy namespace.
-
-   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-
-   This program is free software: you can redistribute it and/or modify
-   it under the terms of the GNU Lesser General Public License as published by
-   the Free Software Foundation; either version 2.1 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
-
-#ifndef __TP_IN_UTIL_H__
-#error Not to be used directly, #include <telepathy-glib/util.h> instead
-#endif
-
-#ifndef TP_VERIFY_H
-# define TP_VERIFY_H 1
-
-/* Each of these macros verifies that its argument R is nonzero.  To
-   be portable, R should be an integer constant expression.  Unlike
-   assert (R), there is no run-time overhead.
-
-   There are two macros, since no single macro can be used in all
-   contexts in C.  verify_true (R) is for scalar contexts, including
-   integer constant expression contexts.  verify (R) is for declaration
-   contexts, e.g., the top level.
-
-   Symbols ending in "__" are private to this header.
-
-   The code below uses several ideas.
-
-   * The first step is ((R) ? 1 : -1).  Given an expression R, of
-     integral or boolean or floating-point type, this yields an
-     expression of integral type, whose value is later verified to be
-     constant and nonnegative.
-
-   * Next this expression W is wrapped in a type
-     struct verify_type__ { unsigned int verify_error_if_negative_size__: W; }.
-     If W is negative, this yields a compile-time error.  No compiler can
-     deal with a bit-field of negative size.
-
-     One might think that an array size check would have the same
-     effect, that is, that the type struct { unsigned int dummy[W]; }
-     would work as well.  However, inside a function, some compilers
-     (such as C++ compilers and GNU C) allow local parameters and
-     variables inside array size expressions.  With these compilers,
-     an array size check would not properly diagnose this misuse of
-     the verify macro:
-
-       void function (int n) { verify (n < 0); }
-
-   * For the verify macro, the struct verify_type__ will need to
-     somehow be embedded into a declaration.  To be portable, this
-     declaration must declare an object, a constant, a function, or a
-     typedef name.  If the declared entity uses the type directly,
-     such as in
-
-       struct dummy {...};
-       typedef struct {...} dummy;
-       extern struct {...} *dummy;
-       extern void dummy (struct {...} *);
-       extern struct {...} *dummy (void);
-
-     two uses of the verify macro would yield colliding declarations
-     if the entity names are not disambiguated.  A workaround is to
-     attach the current line number to the entity name:
-
-       #define GL_CONCAT0(x, y) x##y
-       #define GL_CONCAT(x, y) GL_CONCAT0 (x, y)
-       extern struct {...} * GL_CONCAT(dummy,__LINE__);
-
-     But this has the problem that two invocations of verify from
-     within the same macro would collide, since the __LINE__ value
-     would be the same for both invocations.
-
-     A solution is to use the sizeof operator.  It yields a number,
-     getting rid of the identity of the type.  Declarations like
-
-       extern int dummy [sizeof (struct {...})];
-       extern void dummy (int [sizeof (struct {...})]);
-       extern int (*dummy (void)) [sizeof (struct {...})];
-
-     can be repeated.
-
-   * Should the implementation use a named struct or an unnamed struct?
-     Which of the following alternatives can be used?
-
-       extern int dummy [sizeof (struct {...})];
-       extern int dummy [sizeof (struct verify_type__ {...})];
-       extern void dummy (int [sizeof (struct {...})]);
-       extern void dummy (int [sizeof (struct verify_type__ {...})]);
-       extern int (*dummy (void)) [sizeof (struct {...})];
-       extern int (*dummy (void)) [sizeof (struct verify_type__ {...})];
-
-     In the second and sixth case, the struct type is exported to the
-     outer scope; two such declarations therefore collide.  GCC warns
-     about the first, third, and fourth cases.  So the only remaining
-     possibility is the fifth case:
-
-       extern int (*dummy (void)) [sizeof (struct {...})];
-
-   * This implementation exploits the fact that GCC does not warn about
-     the last declaration mentioned above.  If a future version of GCC
-     introduces a warning for this, the problem could be worked around
-     by using code specialized to GCC, e.g.,:
-
-       #if 4 <= __GNUC__
-       # define verify(R) \
-	   extern int (* verify_function__ (void)) \
-		      [__builtin_constant_p (R) && (R) ? 1 : -1]
-       #endif
-
-   * In C++, any struct definition inside sizeof is invalid.
-     Use a template type to work around the problem.  */
-
-
-/* Verify requirement R at compile-time, as an integer constant expression.
-   Return 1.  */
-
-# ifdef __cplusplus
-template <int w>
-  struct tp_verify_type__ { unsigned int verify_error_if_negative_size__: w; };
-#  define tp_verify_true(R) \
-     (!!sizeof (tp_verify_type__<(R) ? 1 : -1>))
-# else
-#  define tp_verify_true(R) \
-     (!!sizeof \
-      (struct { unsigned int verify_error_if_negative_size__: (R) ? 1 : -1; }))
-# endif
-
-/* Verify requirement R at compile-time, as a declaration without a
-   trailing ';'.  */
-
-# define tp_verify(R) extern int (* tp_verify_function__ (void)) [tp_verify_true (R)]
-
-#endif



More information about the telepathy-commits mailing list