GCC 15 treats an empty parameter list as (void). Prototype the strto* callback.
--- a/ext/standard/scanf.c
+++ b/ext/standard/scanf.c
@@ -585,7 +585,7 @@
 	int  base = 0;
 	int  underflow = 0;
 	size_t width;
-	zend_long (*fn)() = NULL;
+	zend_long (*fn)(const char *, char **, int) = NULL;
 	char *ch, sch;
 	int  flags;
 	char buf[64];	/* Temporary buffer to hold scanned number
@@ -750,29 +750,29 @@
 			case 'D':
 				op = 'i';
 				base = 10;
-				fn = (zend_long (*)())ZEND_STRTOL_PTR;
+				fn = (zend_long (*)(const char *, char **, int))ZEND_STRTOL_PTR;
 				break;
 			case 'i':
 				op = 'i';
 				base = 0;
-				fn = (zend_long (*)())ZEND_STRTOL_PTR;
+				fn = (zend_long (*)(const char *, char **, int))ZEND_STRTOL_PTR;
 				break;
 			case 'o':
 				op = 'i';
 				base = 8;
-				fn = (zend_long (*)())ZEND_STRTOL_PTR;
+				fn = (zend_long (*)(const char *, char **, int))ZEND_STRTOL_PTR;
 				break;
 			case 'x':
 			case 'X':
 				op = 'i';
 				base = 16;
-				fn = (zend_long (*)())ZEND_STRTOL_PTR;
+				fn = (zend_long (*)(const char *, char **, int))ZEND_STRTOL_PTR;
 				break;
 			case 'u':
 				op = 'i';
 				base = 10;
 				flags |= SCAN_UNSIGNED;
-				fn = (zend_long (*)())ZEND_STRTOUL_PTR;
+				fn = (zend_long (*)(const char *, char **, int))ZEND_STRTOUL_PTR;
 				break;
 
 			case 'f':
