You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
With PHP_COMPILER_PROFILE=8.4, the partial grapheme cluster implementation runs (grapheme_strlen, grapheme_str_split, etc.) but function_exists() remains false for those symbols and extension_loaded('intl') is false. Zend only exposes grapheme helpers when ext/intl is loaded; our forward profile should either advertise consistently or withhold callability.
Repro
Zend 8.4 + intl
VM forward 8.4 (2026-07-10)
function_exists('grapheme_strlen')
true with ext/intl
false
grapheme_strlen("a\xCC\x81b")
2
2 (callable)
function_exists('grapheme_str_split')
true with ext/intl
false
count(grapheme_str_split("a\xCC\x81b"))
2
2 (callable)
Closed #11815/#11825 fixed over-advertisinggrapheme_stripos without intl; this is the inverse gap on the forward profile core cluster API.
Activity
PurHur commentedon Jul 10, 2026
claim: cursor-agent-lane-b — starting this run
Stdlib: advertise forward 8.4 grapheme cluster in function_exists() (#…
PurHur commentedon Jul 10, 2026
Merged via #17625.
Fix:
IntlExtensionPolicy::advertisesGraphemeCore/StrContains/Strimwidth()+BuiltinIntrospectionPolicyrouting so forwardPHP_COMPILER_PROFILE=8.4advertises the core grapheme cluster (grapheme_strlen,grapheme_substr,grapheme_strpos,grapheme_extract,grapheme_str_split,grapheme_str_contains,grapheme_strimwidth) infunction_exists()/is_callable()without full ext/intl.grapheme_stripos/grapheme_stristr/grapheme_strrposremain intl-gated (#11815).Verification: repros
maintainer_gap_grapheme_forward84_phantom.php+maintainer_gap_grapheme_forward_profile_partial.phpprintok; compliancegrapheme_forward_profile_introspection.phpt,grapheme_profile_84.phpt,grapheme_stripos_intl_gated.phptgreen (VM+JIT).