Commit 02f9b963563 for php

commit 02f9b9635639af9f1e5cb5fa839a39ab6fa39c7e
Author: Gina Peter Banyard <girgias@php.net>
Date:   Sat Sep 19 18:28:57 2026 +0100

    Zend: merge reserved_class_name and builtin_type_info structs

    As it's easy to forget to add it to one or the other

    Closes GH-23776

diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index e4df321fb5e..2633e7d536d 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -199,44 +199,46 @@ static bool zend_get_unqualified_name(const zend_string *name, const char **resu
 }
 /* }}} */

-struct reserved_class_name {
-	const char *name;
-	size_t len;
-};
-static const struct reserved_class_name reserved_class_names[] = {
-	{ZEND_STRL("bool")},
-	{ZEND_STRL("false")},
-	{ZEND_STRL("float")},
-	{ZEND_STRL("int")},
-	{ZEND_STRL("null")},
-	{ZEND_STRL("parent")},
-	{ZEND_STRL("self")},
-	{ZEND_STRL("static")},
-	{ZEND_STRL("string")},
-	{ZEND_STRL("true")},
-	{ZEND_STRL("void")},
-	{ZEND_STRL("never")},
-	{ZEND_STRL("iterable")},
-	{ZEND_STRL("object")},
-	{ZEND_STRL("mixed")},
-	/* These are not usable as class names because they're proper tokens,
-	 * but they are here for class aliases. */
-	{ZEND_STRL("array")},
-	{ZEND_STRL("callable")},
-	{NULL, 0}
+typedef struct builtin_type_info {
+	const char* name;
+	const size_t name_len;
+	const uint8_t type;
+} builtin_type_info;
+
+static const builtin_type_info builtin_types[] = {
+	{ZEND_STRL("null"), IS_NULL},
+	{ZEND_STRL("true"), IS_TRUE},
+	{ZEND_STRL("false"), IS_FALSE},
+	{ZEND_STRL("int"), IS_LONG},
+	{ZEND_STRL("float"), IS_DOUBLE},
+	{ZEND_STRL("string"), IS_STRING},
+	{ZEND_STRL("bool"), _IS_BOOL},
+	{ZEND_STRL("void"), IS_VOID},
+	{ZEND_STRL("never"), IS_NEVER},
+	{ZEND_STRL("iterable"), IS_ITERABLE},
+	{ZEND_STRL("object"), IS_OBJECT},
+	{ZEND_STRL("mixed"), IS_MIXED},
+	/* Should be handled as ZEND_TYPE_ASTs but it may have a namespace component */
+	{ZEND_STRL("array"), IS_ARRAY},
+	{ZEND_STRL("callable"), IS_CALLABLE},
+	{ZEND_STRL("static"), IS_STATIC},
+	/* self and parent are effectively built-in types (and thus reserved), but they allow namespace components */
+	{ZEND_STRL("self"), IS_UNDEF},
+	{ZEND_STRL("parent"), IS_UNDEF},
+	{NULL, 0, IS_UNDEF}
 };

 static bool zend_is_reserved_class_name(const zend_string *name) /* {{{ */
 {
-	const struct reserved_class_name *reserved = reserved_class_names;
+	const builtin_type_info *reserved = builtin_types;

 	const char *uqname = ZSTR_VAL(name);
 	size_t uqname_len = ZSTR_LEN(name);
 	zend_get_unqualified_name(name, &uqname, &uqname_len);

 	for (; reserved->name; ++reserved) {
-		if (uqname_len == reserved->len
-			&& zend_binary_strcasecmp(uqname, uqname_len, reserved->name, reserved->len) == 0
+		if (uqname_len == reserved->name_len
+			&& zend_binary_strcasecmp(uqname, uqname_len, reserved->name, reserved->name_len) == 0
 		) {
 			return true;
 		}
@@ -262,32 +264,6 @@ void zend_assert_valid_class_name(const zend_string *name, const char *type) /*
 }
 /* }}} */

-typedef struct _builtin_type_info {
-	const char* name;
-	const size_t name_len;
-	const uint8_t type;
-} builtin_type_info;
-
-static const builtin_type_info builtin_types[] = {
-	{ZEND_STRL("null"), IS_NULL},
-	{ZEND_STRL("true"), IS_TRUE},
-	{ZEND_STRL("false"), IS_FALSE},
-	{ZEND_STRL("int"), IS_LONG},
-	{ZEND_STRL("float"), IS_DOUBLE},
-	{ZEND_STRL("string"), IS_STRING},
-	{ZEND_STRL("bool"), _IS_BOOL},
-	{ZEND_STRL("void"), IS_VOID},
-	{ZEND_STRL("never"), IS_NEVER},
-	{ZEND_STRL("iterable"), IS_ITERABLE},
-	{ZEND_STRL("object"), IS_OBJECT},
-	{ZEND_STRL("mixed"), IS_MIXED},
-	/* Should be handled as ZEND_TYPE_ASTs but it may have a namespace component */
-	{ZEND_STRL("array"), IS_ARRAY},
-	{ZEND_STRL("callable"), IS_CALLABLE},
-	{ZEND_STRL("static"), IS_STATIC},
-	{NULL, 0, IS_UNDEF}
-};
-
 typedef struct {
 	const char *name;
 	size_t name_len;