fix vendored libdeflate _rotr* macros vs mingw stdlib.h #1

Merged
jorijnvdgraaf merged 1 commit from fix/mingw-rotr64-stdlib-collision into master 2026-05-27 04:28:37 +02:00
Showing only changes of commit 021ced683d - Show all commits

fix vendored libdeflate _rotr* macros colliding with mingw stdlib.h

compiler_gcc.h defined _rotl/_rotr/_rotl64/_rotr64 as macros before
mingw's <stdlib.h> got a chance to declare them as functions. Any
translation unit that did `#include "lib_common.h"` (which transitively
pulls in compiler_gcc.h) and later included <stdlib.h> — utils.c does
exactly this — would have the mingw function declarations textually
substituted by the macros, producing a syntax error.

Force <stdlib.h> in from compiler_gcc.h on mingw so the function
declarations are parsed before the macro names get shadowed. The
later #include in utils.c becomes a no-op via the header guard, and
call sites still resolve to the macros below (so the generated code
is unchanged on every other compiler/target).

This unblocks the Crafter.Build CI's x86_64-w64-mingw32 cross-compile,
which has been failing for a while when building Crafter.Asset →
gdeflate → libdeflate as a dep.
Crafter Build CI 2026-05-27 02:23:53 +00:00

View file

@ -203,7 +203,19 @@ typedef char __v64qi __attribute__((__vector_size__(64)));
/* /*
* Setup rotation macros similar to MSVS intrinsics. * Setup rotation macros similar to MSVS intrinsics.
* These should recognized by compilers. * These should recognized by compilers.
*
* mingw's <stdlib.h> declares _rotl/_rotr/_rotl64/_rotr64 as functions, so
* a translation unit that pulls compiler_gcc.h in first (libdeflate's own
* utils.c does exactly that) and then includes <stdlib.h> would see the
* function declarations mangled by these macros. Force <stdlib.h> in here
* on mingw so the declarations get parsed before the macro names get
* shadowed; the header guard makes the later #include a no-op and call
* sites still resolve to the macros below.
*/ */
#if defined(__MINGW32__) || defined(__MINGW64__)
# include <stdlib.h>
#endif
#ifndef _rotr16 #ifndef _rotr16
#define _rotr16(x,n) ((x>>n) + (x<<(16-n))) #define _rotr16(x,n) ((x>>n) + (x<<(16-n)))
#endif #endif