Commit 2d651e203db for php.net

commit 2d651e203dbce8b7c89a7039c0447ccc0469be93
Author: Pratik Bhujel <prateekbhujelpb@gmail.com>
Date:   Mon Apr 20 13:34:42 2026 +0545

    zend_inheritance: Fix enum case conflict in trait binding (#21771)

    Fixes GH-21760.

diff --git a/NEWS b/NEWS
index 2790d81dccf..97cbd684a76 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ PHP                                                                        NEWS
   . Fixed bug GH-21699 (Assertion failure in shutdown_executor when resolving
     self::/parent::/static:: callables if the error handler throws). (macoaure)
   . Fixed bug GH-21603 (Missing addref for __unset). (ilutov)
+  . Fixed bug GH-21760 (Trait with class constant name conflict against
+    enum case causes SEGV). (Pratik Bhujel)

 - CLI:
   . Fixed bug GH-21754 (`--rf` command line option with a method triggers
diff --git a/Zend/tests/enum/gh21760.phpt b/Zend/tests/enum/gh21760.phpt
new file mode 100644
index 00000000000..0835e3ca937
--- /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--
+<?php
+
+trait X {
+    public const Up = 1;
+}
+
+enum Direction {
+    use X;
+
+    case Up;
+    case Down;
+}
+
+?>
+--EXPECTF--
+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 56e5bdb9295..eba21dd8e82 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -2757,6 +2757,19 @@ 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 %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)
+	);
+}
+
 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
 ) {
@@ -2770,6 +2783,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_trait_constant_enum_case_conflict_error(ce, trait_constant, name);
+		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;