From cfc148f84d6b73fe60d56fad84459792365d71f3 Mon Sep 17 00:00:00 2001 From: pratik bhujel Date: Thu, 16 Apr 2026 17:00:29 +0545 Subject: [PATCH 1/4] Fix enum case conflict in trait binding --- Zend/tests/enum/gh21760.phpt | 19 +++++++++++++++++++ Zend/zend_inheritance.c | 5 +++++ 2 files changed, 24 insertions(+) create mode 100644 Zend/tests/enum/gh21760.phpt diff --git a/Zend/tests/enum/gh21760.phpt b/Zend/tests/enum/gh21760.phpt new file mode 100644 index 0000000000000..5e909b07680ba --- /dev/null +++ b/Zend/tests/enum/gh21760.phpt @@ -0,0 +1,19 @@ +--TEST-- +GH-21760 (Trait with class constant name conflict against enum case causes SEGV) +--FILE-- + +--EXPECTF-- +Fatal error: Direction and X define the same constant (Up) in the composition of Direction. However, the definition differs and is considered incompatible. Class was composed in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 56e5bdb9295a6..03369ffb4c6fa 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -2770,6 +2770,11 @@ static bool do_trait_constant_check( zend_class_constant *existing_constant = Z_PTR_P(zv); + if (UNEXPECTED(ZEND_CLASS_CONST_FLAGS(existing_constant) & ZEND_CLASS_CONST_IS_CASE)) { + emit_incompatible_trait_constant_error(ce, existing_constant, trait_constant, name, traits, current_trait); + return false; + } + if ((ZEND_CLASS_CONST_FLAGS(trait_constant) & flags_mask) != (ZEND_CLASS_CONST_FLAGS(existing_constant) & flags_mask)) { emit_incompatible_trait_constant_error(ce, existing_constant, trait_constant, name, traits, current_trait); return false; From 4d1f2861abc4e15193d722f43c9f02e6284e42c5 Mon Sep 17 00:00:00 2001 From: pratik bhujel Date: Fri, 17 Apr 2026 05:49:25 +0545 Subject: [PATCH 2/4] Use dedicated error for enum case conflict --- Zend/tests/enum/gh21760.phpt | 2 +- Zend/zend_inheritance.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Zend/tests/enum/gh21760.phpt b/Zend/tests/enum/gh21760.phpt index 5e909b07680ba..8ba77dcceb1ed 100644 --- a/Zend/tests/enum/gh21760.phpt +++ b/Zend/tests/enum/gh21760.phpt @@ -16,4 +16,4 @@ enum Direction { ?> --EXPECTF-- -Fatal error: Direction and X define the same constant (Up) in the composition of Direction. However, the definition differs and is considered incompatible. Class was composed in %s on line %d +Fatal error: Cannot use trait X, because constant Up conflicts with enum case Direction::Up in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 03369ffb4c6fa..35eb4488c5fab 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -2757,6 +2757,18 @@ static void emit_incompatible_trait_constant_error( ); } +static void emit_trait_constant_enum_case_conflict_error( + const zend_class_entry *ce, const zend_class_constant *trait_constant, zend_string *name +) { + zend_error_noreturn(E_COMPILE_ERROR, + "Cannot use trait %s, because constant %s conflicts with enum case %s::%s", + ZSTR_VAL(trait_constant->ce->name), + ZSTR_VAL(name), + ZSTR_VAL(ce->name), + ZSTR_VAL(name) + ); +} + static bool do_trait_constant_check( zend_class_entry *ce, zend_class_constant *trait_constant, zend_string *name, zend_class_entry **traits, size_t current_trait ) { @@ -2771,7 +2783,7 @@ static bool do_trait_constant_check( zend_class_constant *existing_constant = Z_PTR_P(zv); if (UNEXPECTED(ZEND_CLASS_CONST_FLAGS(existing_constant) & ZEND_CLASS_CONST_IS_CASE)) { - emit_incompatible_trait_constant_error(ce, existing_constant, trait_constant, name, traits, current_trait); + emit_trait_constant_enum_case_conflict_error(ce, trait_constant, name); return false; } From 90802ecd8b44cd5202f6bad609b4ab52a8fb5597 Mon Sep 17 00:00:00 2001 From: pratik bhujel Date: Fri, 17 Apr 2026 21:51:17 +0545 Subject: [PATCH 3/4] Adjust enum conflict wording --- Zend/tests/enum/gh21760.phpt | 2 +- Zend/zend_inheritance.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/tests/enum/gh21760.phpt b/Zend/tests/enum/gh21760.phpt index 8ba77dcceb1ed..0835e3ca937d9 100644 --- a/Zend/tests/enum/gh21760.phpt +++ b/Zend/tests/enum/gh21760.phpt @@ -16,4 +16,4 @@ enum Direction { ?> --EXPECTF-- -Fatal error: Cannot use trait X, because constant Up conflicts with enum case Direction::Up in %s on line %d +Fatal error: Cannot use trait X, because X::Up conflicts with enum case Direction::Up in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 35eb4488c5fab..a12401592a78f 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -2761,7 +2761,7 @@ static void emit_trait_constant_enum_case_conflict_error( const zend_class_entry *ce, const zend_class_constant *trait_constant, zend_string *name ) { zend_error_noreturn(E_COMPILE_ERROR, - "Cannot use trait %s, because constant %s conflicts with enum case %s::%s", + "Cannot use trait %s, because %s::%s conflicts with enum case %s::%s", ZSTR_VAL(trait_constant->ce->name), ZSTR_VAL(name), ZSTR_VAL(ce->name), From ed9e56383b5b9025198e51eaff9af57f1c5efca1 Mon Sep 17 00:00:00 2001 From: pratik bhujel Date: Fri, 17 Apr 2026 21:58:36 +0545 Subject: [PATCH 4/4] Fix enum conflict format args --- Zend/zend_inheritance.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index a12401592a78f..eba21dd8e82a7 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -2763,6 +2763,7 @@ static void emit_trait_constant_enum_case_conflict_error( zend_error_noreturn(E_COMPILE_ERROR, "Cannot use trait %s, because %s::%s conflicts with enum case %s::%s", ZSTR_VAL(trait_constant->ce->name), + ZSTR_VAL(trait_constant->ce->name), ZSTR_VAL(name), ZSTR_VAL(ce->name), ZSTR_VAL(name)