Hallvard B Furuseth wrote:
I think we should insert a number of static assertions in the
OpenLDAP code: Asserts that fail or succeed at compile time.
E.g. for the comment in config.c:bindkey[] (ITS#6419).
Like this - in include/ac/assert.h?
Or ldap_cdefs.h in case we want to use it in installed headers?
/* Declaration which tries to force a compile error if !cond */
#define ber_static_assert(cond) \
LBER_V(LDAP_CONST char) ber_assertion[ber_assertz(cond) + 1]
/* Return 0, or if !cond try to force a compile error */
#define ber_assertz(cond) (sizeof(struct { \
int ber_assert1[(cond) ? 9 : -9], ber_assert2:(cond) ? 9 : -9; })&& 0)
/* Usage: */
ber_static_assert(~0U>= 0xFFFFFFFFUL); /* int = 32 bits or wider */
int foo(int i) { return i + ber_assertz(LDAP_SUCCESS == 0); }
liblber will need a dummy variable 'const char ber_assertion[1];'.
We can drop that if anyone dislikes it: ber_static_assert() can take
an assertion_name parameter and declare a typedef based on that name.
Or it can generate a name from __LINE__. Then we can have only one
static assert per line, which matters for macros but little else.
You could avoid the naming issue by just enclosing the body in a block {}. I'm
assuming we only need this inside functions, and not at file scope.
Since this is all ber/LBER, it should go in an lber_* header file, not
ac/assert.h.
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/