Commit edcd94d5816 for php.net
commit edcd94d5816ac072f34cd3a93f59905575bbfe39
Author: OndÅ™ej Surý <ondrej@sury.org>
Date: Wed Jul 8 11:27:30 2026 +0200
ext/intl: don't include C++ ICU headers from C translation units (#22636)
php_intl.c is compiled as C but transitively includes formatter_data.h and
listformatter_class.h, which (since 8.6) include <unicode/numfmt.h> and
<unicode/listformatter.h> unconditionally. On ICU >= 64 those C++ headers are
a no-op in a C compile, but ICU 63 (Debian Buster) has an unguarded
"#include <cstddef>" at the top of unistr.h, so the C compile fails with
"fatal error: cstddef: No such file or directory".
The C path only uses the "typedef void" shim (NumberFormat*/ListFormatter*
are just void*), so it needs no ICU header at all. Move the C++ include inside
the existing #ifdef __cplusplus guard. No-op on newer ICU.
diff --git a/ext/intl/formatter/formatter_data.h b/ext/intl/formatter/formatter_data.h
index 1208970471b..46a82cb9bd0 100644
--- a/ext/intl/formatter/formatter_data.h
+++ b/ext/intl/formatter/formatter_data.h
@@ -23,9 +23,8 @@ extern "C" {
}
#endif
-#include <unicode/numfmt.h>
-
#ifdef __cplusplus
+#include <unicode/numfmt.h>
using icu::NumberFormat;
#else
typedef void NumberFormat;
diff --git a/ext/intl/listformatter/listformatter_class.h b/ext/intl/listformatter/listformatter_class.h
index 7e7fd29207f..bdf21b6886e 100644
--- a/ext/intl/listformatter/listformatter_class.h
+++ b/ext/intl/listformatter/listformatter_class.h
@@ -21,9 +21,8 @@
#include "intl_error.h"
#include "intl_data.h"
-#include <unicode/listformatter.h>
-
#ifdef __cplusplus
+#include <unicode/listformatter.h>
using icu::ListFormatter;
#else
typedef void ListFormatter;