From: Viktor Szakats Date: Thu, 17 Jul 2025 17:01:42 +0000 (+0200) Subject: build: extend GNU C guards to clang where applicable, fix fallouts X-Git-Tag: curl-8_16_0~374 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd2ca2399e79e0b821af34c7c164c830c9c6574d;p=thirdparty%2Fcurl.git build: extend GNU C guards to clang where applicable, fix fallouts Some GNU C version guards implicitly include the clang compiler, because clang reports itself as GCC 4.2.1. This implicit inclusion doesn't happen if the guard requires a GCC version above 4.2.1. Fix two such guards to explicitly include clang where it does support the guarded feature: - curl/curl.h: use `typecheck-gcc.h` with clang. llvm clang v14+ supports this. The corresponding Apple clang version is also v14. Ref: https://en.wikipedia.org/wiki/Xcode#Toolchain_versions Apple clang v14 tested OK in CI: https://github.com/curl/curl/actions/runs/16353901480/job/46207437204 - tool_urlglib: use `__builtin_mul_overflow()` with clang v8+. llvm clang v3.8+ supports this, but to accommodate for Apple clang, start with v8, the Apple version having the mainline v3.8 feature set. Also fix compile warnings triggered by the above: - lib1912: fix duplicate `;`: ``` tests/libtest/lib1912.c:44:57: error: empty expression statement has no effect; remove unnecessary ';' to silence this warning [-Werror,-Wextra-semi-stmt] 44 | print_err(o->name, "CURLOT_LONG or CURLOT_VALUES"); | ^ [...] ``` Ref: https://github.com/curl/curl/actions/runs/16351302841/job/46198524880?pr=17955#step:12:61 - lib2032: silence typcheck warning with a cast: ``` tests/libtest/lib2032.c:145:29: error: sizeof on pointer operation will return size of 'CURL **' (aka 'void **') instead of 'CURL *[3]' (aka 'void *[3]') [-Werror,-Wsizeof-array-decay] 145 | ntlm_easy + num_handles); | ~~~~~~~~~ ^ ``` Ref: https://github.com/curl/curl/actions/runs/16351302841/job/46198524880?pr=17955#step:12:86 Closes #17955 --- diff --git a/include/curl/curl.h b/include/curl/curl.h index 4e2cf9ada5..cb4e523c38 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -3317,8 +3317,9 @@ CURL_EXTERN CURLcode curl_easy_ssls_export(CURL *handle, #include "mprintf.h" /* the typechecker does not work in C++ (yet) */ -#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ - ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ +#if ((defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) || \ + (defined(__clang__) && __clang_major__ >= 14)) && \ !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) #include "typecheck-gcc.h" #else diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c index 29c4119cd7..c20bbd4ea3 100644 --- a/src/tool_urlglob.c +++ b/src/tool_urlglob.c @@ -68,8 +68,9 @@ static int multiply(curl_off_t *amount, curl_off_t with) sum = 0; } else { -#if defined(__GNUC__) && \ - ((__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 1))) +#if (defined(__GNUC__) && \ + ((__GNUC__ > 5) || ((__GNUC__ == 5) && (__GNUC_MINOR__ >= 1)))) || \ + (defined(__clang__) && __clang_major__ >= 8) if(__builtin_mul_overflow(*amount, with, &sum)) return 1; #else diff --git a/tests/libtest/lib1912.c b/tests/libtest/lib1912.c index db6c3d1e68..e74808c3c0 100644 --- a/tests/libtest/lib1912.c +++ b/tests/libtest/lib1912.c @@ -27,7 +27,7 @@ #define print_err(name, exp) \ curl_mfprintf(stderr, "Type mismatch for CURLOPT_%s (expected %s)\n", \ - name, exp); + name, exp) static CURLcode test_lib1912(char *URL) { diff --git a/tests/libtest/lib2032.c b/tests/libtest/lib2032.c index a998c72230..993626bb35 100644 --- a/tests/libtest/lib2032.c +++ b/tests/libtest/lib2032.c @@ -142,7 +142,7 @@ static CURLcode test_lib2032(char *URL) /* libntlmconnect */ "testuser:testpass"); easy_setopt(ntlm_easy[num_handles], CURLOPT_WRITEFUNCTION, callback); easy_setopt(ntlm_easy[num_handles], CURLOPT_WRITEDATA, - ntlm_easy + num_handles); + (void *)(ntlm_easy + num_handles)); easy_setopt(ntlm_easy[num_handles], CURLOPT_HEADER, 1L); multi_add_handle(multi, ntlm_easy[num_handles]);