On 4. Nov 2025, at 14.12, adesh--- via dovecot <dovecot@dovecot.org> wrote:
When building Dovecot 2.4.2 on modern compilers (GCC ≥ 5, Clang, or any C99/C11-compliant environment), the build fails in src/lib/unicode-transform.c due to the use of non-constant initializers in static const global variables.
The affected lines define Hangul composition constants using other const variables instead of compile-time constants, which is not allowed in standard C99 and later.
error log: unicode-transform.c:211:1: error: initializer element is not constant static const size_t uni_hangul_n_count = uni_hangul_v_count * uni_hangul_t_count; ^ unicode-transform.c:212:1: error: initializer element is not constant static const uint16_t uni_hangul_l_end = uni_hangul_l_base + uni_hangul_l_count; ^ unicode-transform.c:213:1: error: initializer element is not constant static const uint16_t uni_hangul_v_end = uni_hangul_v_base + uni_hangul_v_count; ^ unicode-transform.c:214:1: error: initializer element is not constant static const uint16_t uni_hangul_t_end = uni_hangul_t_base + uni_hangul_t_count; ^
Need to fix it, but ..
This issue prevents building Dovecot 2.4.x on modern systems without non-standard compiler flags, breaking out-of-the-box builds on up-to-date Linux distributions.
This can't be true. We've been compiling it with latest distros, and we don't see such compiling errors. For example locally I have clang 18.1.3 and gcc 13.3.0, and I can't get these errors with any -std options. Does it compile with the following patch? Unlikely to be the final fix, but I just want to know if there are other issues: diff --git a/src/lib/unicode-transform.c b/src/lib/unicode-transform.c index 3be88f7a0b..58bd1c1e04 100644 --- a/src/lib/unicode-transform.c +++ b/src/lib/unicode-transform.c @@ -201,13 +201,13 @@ unicode_static_array_sink_input(struct unicode_transform *trans, * Hangul syllable (de)composition */ -static const uint16_t uni_hangul_s_base = 0xac00; -static const uint16_t uni_hangul_l_base = 0x1100; -static const uint16_t uni_hangul_v_base = 0x1161; -static const uint16_t uni_hangul_t_base = 0x11a7; -static const size_t uni_hangul_l_count = 19; -static const size_t uni_hangul_v_count = 21; -static const size_t uni_hangul_t_count = 28; +#define uni_hangul_s_base 0xac00 +#define uni_hangul_l_base 0x1100 +#define uni_hangul_v_base 0x1161 +#define uni_hangul_t_base 0x11a7 +#define uni_hangul_l_count 19 +#define uni_hangul_v_count 21 +#define uni_hangul_t_count 28 static const size_t uni_hangul_n_count = uni_hangul_v_count * uni_hangul_t_count; static const uint16_t uni_hangul_l_end = uni_hangul_l_base + uni_hangul_l_count; static const uint16_t uni_hangul_v_end = uni_hangul_v_base + uni_hangul_v_count;