mruby-bigint: avoid C99 compound literal in MPZ_CTX_INIT

MPZ_CTX_INIT used a compound literal with designated initializers:

  mpz_ctx_t ctx##_struct = ((mpz_ctx_t){.mrb = ..., .pool = ...});

Both features are C99-only, and are not accepted by legacy C++
compilers (notably gcc 4.x) when mruby is pulled into a C++
translation unit via the -cxx.cxx wrapper.

Replace with plain member assignment so the macro expands to code
that is valid under C89/C++98 as well.

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-04-15 09:01:19 +09:00
parent d65f7a9c5a
commit 617a55b775
+7 -2
View File
@@ -50,11 +50,16 @@ typedef struct mpz_context {
mpz_pool_t *pool; /* NULL for heap-only operations */
} mpz_ctx_t;
/* Convenience macros for context creation */
/* Convenience macros for context creation.
* Uses per-member assignment instead of a C99 compound literal with
* designated initializers so the file compiles as C++ on legacy
* toolchains (pre-C++20). */
#define MPZ_CTX_INIT(mrb_ptr, ctx, pool_ptr) \
mpz_pool_t pool ## _storage = {{0}};\
mpz_pool_t *pool_ptr = &pool ## _storage;\
mpz_ctx_t ctx ## _struct = ((mpz_ctx_t){.mrb = (mrb_ptr), .pool = (pool_ptr)}); \
mpz_ctx_t ctx ## _struct; \
ctx ## _struct.mrb = (mrb_ptr); \
ctx ## _struct.pool = (pool_ptr); \
mpz_ctx_t *ctx = &(ctx ## _struct);
/* Access macros for readability */