61 lines
2.2 KiB
Diff
61 lines
2.2 KiB
Diff
|
|
From e080de9a6b37e806dcd7b4814926a1b59b64d2cc Mon Sep 17 00:00:00 2001
|
|||
|
|
From: Jan Engelhardt <jengelh@inai.de>
|
|||
|
|
Date: Wed, 18 Jun 2025 06:07:10 +0200
|
|||
|
|
Subject: [PATCH] Stop using declarators with unspecified arguments
|
|||
|
|
MIME-Version: 1.0
|
|||
|
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
References: https://github.com/gap-system/gap/pull/6010
|
|||
|
|
|
|||
|
|
GCC 15/-std=c23:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
src/bool.c:332:22: error: passing argument 1 of 'InitHandlerFunc' from incompatible pointer type [-Wincompatible-pointer-types]
|
|||
|
|
332 | InitHandlerFunc( ReturnTrue1, "src/bool.c:ReturnTrue1" );
|
|||
|
|
[ 19s] src/calls.h:416:30: note: expected ‘ObjFunc’ {aka ‘struct OpaqueBag * (*)(void)’} but argument is of type ‘struct OpaqueBag * (*)(struct OpaqueBag *, struct OpaqueBag *)’
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Declarators with unspecified arguments `int f();` got socially
|
|||
|
|
deprecated with C89; since then, one can write `f(void)` for actual
|
|||
|
|
zero-argument functions, and `f(T, ...)` for varargs functions.
|
|||
|
|
|
|||
|
|
C23 finally yanked declarators with unspecified arguments.
|
|||
|
|
|
|||
|
|
Different pointer types may have different size. So you can't have
|
|||
|
|
one pointer type for "all kinds of functions" in plain C. Nor C++ for
|
|||
|
|
that matter; some use of templates/RTTI would be necessary (possibly
|
|||
|
|
hidden in something like std::any, but still).
|
|||
|
|
|
|||
|
|
Or rely on platform-specific extensions, e.g. POSIX>=2001 guarantees
|
|||
|
|
that sizeof(void*) >= sizeof(any function pointer) and that
|
|||
|
|
conversion is meaningful; this is effectively mandated by the
|
|||
|
|
presence of dlsym(). For Windows, sizeof(FARPROC) >= sizeof(afp),
|
|||
|
|
effectively mandated by GetProcAddress().
|
|||
|
|
|
|||
|
|
Fixes: #5857 #6009
|
|||
|
|
---
|
|||
|
|
src/common.h | 7 +------
|
|||
|
|
1 file changed, 1 insertion(+), 6 deletions(-)
|
|||
|
|
|
|||
|
|
diff --git a/src/common.h b/src/common.h
|
|||
|
|
index 3932c3020..02818f567 100644
|
|||
|
|
--- a/src/common.h
|
|||
|
|
+++ b/src/common.h
|
|||
|
|
@@ -161,12 +161,7 @@ typedef Bag Obj;
|
|||
|
|
**
|
|||
|
|
** 'ObjFunc' is the type of a function returning an object.
|
|||
|
|
*/
|
|||
|
|
-#pragma GCC diagnostic push
|
|||
|
|
-#ifndef __cplusplus
|
|||
|
|
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
|
|||
|
|
-#endif
|
|||
|
|
-typedef Obj (* ObjFunc) (/*arguments*/);
|
|||
|
|
-#pragma GCC diagnostic pop
|
|||
|
|
+typedef void * ObjFunc;
|
|||
|
|
|
|||
|
|
typedef Obj (* ObjFunc_0ARGS) (Obj self);
|
|||
|
|
typedef Obj (* ObjFunc_1ARGS) (Obj self, Obj a1);
|
|||
|
|
--
|
|||
|
|
2.49.0
|
|||
|
|
|