From 33f412cd334c0e65ca7a800e0e18b7c2205c1d0d Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Jun 2025 09:44:32 -0400 Subject: [PATCH 1/2] portable static asserts --- include/roaring/portability.h | 7 +++++++ src/art/art.c | 10 +++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/roaring/portability.h b/include/roaring/portability.h index 03e741b5..288279d1 100644 --- a/include/roaring/portability.h +++ b/include/roaring/portability.h @@ -587,6 +587,13 @@ static inline uint32_t croaring_refcount_get(const croaring_refcount_t *val) { { 0 } #endif +#if defined(__cplusplus) +#define CROARING_STATIC_ASSERT(x,y) static_assert(x, y) +#else +#define CROARING_STATIC_ASSERT(x,y) _Static_assert(x, y) +#endif + + // We need portability.h to be included first, // but we also always want isadetection.h to be // included (right after). diff --git a/src/art/art.c b/src/art/art.c index 69b2ddcb..a43a05af 100644 --- a/src/art/art.c +++ b/src/art/art.c @@ -2284,13 +2284,13 @@ bool art_internal_validate(const art_t *art, const char **reason, return art_internal_validate_at(art, art->root, validator); } -_Static_assert(alignof(art_leaf_t) == alignof(art_node4_t), +CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node4_t), "Serialization assumes node type alignment is equal"); -_Static_assert(alignof(art_leaf_t) == alignof(art_node16_t), +CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node16_t), "Serialization assumes node type alignment is equal"); -_Static_assert(alignof(art_leaf_t) == alignof(art_node48_t), +CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node48_t), "Serialization assumes node type alignment is equal"); -_Static_assert(alignof(art_leaf_t) == alignof(art_node256_t), +CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node256_t), "Serialization assumes node type alignment is equal"); size_t art_size_in_bytes(const art_t *art) { @@ -2363,7 +2363,7 @@ size_t art_frozen_view(const char *buf, size_t maxbytes, art_t *art) { if (maxbytes < sizeof(art->capacities)) { return 0; } - _Static_assert(sizeof(art->first_free) == sizeof(art->capacities), + CROARING_STATIC_ASSERT(sizeof(art->first_free) == sizeof(art->capacities), "first_free is read from capacities"); memcpy(art->first_free, buf, sizeof(art->capacities)); memcpy(art->capacities, buf, sizeof(art->capacities)); From b002dc0742aa3396a7bfb770a175d98d3486c384 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Wed, 4 Jun 2025 09:45:16 -0400 Subject: [PATCH 2/2] lint --- include/roaring/portability.h | 5 ++--- src/art/art.c | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/roaring/portability.h b/include/roaring/portability.h index 288279d1..c54f6d18 100644 --- a/include/roaring/portability.h +++ b/include/roaring/portability.h @@ -588,12 +588,11 @@ static inline uint32_t croaring_refcount_get(const croaring_refcount_t *val) { #endif #if defined(__cplusplus) -#define CROARING_STATIC_ASSERT(x,y) static_assert(x, y) +#define CROARING_STATIC_ASSERT(x, y) static_assert(x, y) #else -#define CROARING_STATIC_ASSERT(x,y) _Static_assert(x, y) +#define CROARING_STATIC_ASSERT(x, y) _Static_assert(x, y) #endif - // We need portability.h to be included first, // but we also always want isadetection.h to be // included (right after). diff --git a/src/art/art.c b/src/art/art.c index a43a05af..76a8266a 100644 --- a/src/art/art.c +++ b/src/art/art.c @@ -2285,13 +2285,13 @@ bool art_internal_validate(const art_t *art, const char **reason, } CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node4_t), - "Serialization assumes node type alignment is equal"); + "Serialization assumes node type alignment is equal"); CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node16_t), - "Serialization assumes node type alignment is equal"); + "Serialization assumes node type alignment is equal"); CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node48_t), - "Serialization assumes node type alignment is equal"); + "Serialization assumes node type alignment is equal"); CROARING_STATIC_ASSERT(alignof(art_leaf_t) == alignof(art_node256_t), - "Serialization assumes node type alignment is equal"); + "Serialization assumes node type alignment is equal"); size_t art_size_in_bytes(const art_t *art) { if (!art_is_shrunken(art)) { @@ -2364,7 +2364,7 @@ size_t art_frozen_view(const char *buf, size_t maxbytes, art_t *art) { return 0; } CROARING_STATIC_ASSERT(sizeof(art->first_free) == sizeof(art->capacities), - "first_free is read from capacities"); + "first_free is read from capacities"); memcpy(art->first_free, buf, sizeof(art->capacities)); memcpy(art->capacities, buf, sizeof(art->capacities)); buf += sizeof(art->capacities);