From 3bf21a0d43e8bc8084a19937e5d5dc354f0c07cd Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 8 Aug 2025 21:22:49 +0100 Subject: [PATCH] Zend: Deprecate non-canonical cast names (#19372) RFC: https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_non-standard_cast_names --- Zend/tests/type_casts/cast_to_double.phpt | 4 +-- .../type_casts/non_canonical_binary_cast.phpt | 11 ++++++ .../non_canonical_boolean_cast.phpt | 11 ++++++ .../type_casts/non_canonical_double_cast.phpt | 11 ++++++ .../non_canonical_integer_cast.phpt | 11 ++++++ Zend/zend_ast.c | 2 +- Zend/zend_language_parser.y | 2 +- Zend/zend_language_scanner.l | 36 ++++++++++++++++--- 8 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/type_casts/non_canonical_binary_cast.phpt create mode 100644 Zend/tests/type_casts/non_canonical_boolean_cast.phpt create mode 100644 Zend/tests/type_casts/non_canonical_double_cast.phpt create mode 100644 Zend/tests/type_casts/non_canonical_integer_cast.phpt diff --git a/Zend/tests/type_casts/cast_to_double.phpt b/Zend/tests/type_casts/cast_to_double.phpt index 2972fbbe802..69a625b09de 100644 --- a/Zend/tests/type_casts/cast_to_double.phpt +++ b/Zend/tests/type_casts/cast_to_double.phpt @@ -1,5 +1,5 @@ --TEST-- -casting different variables to double +casting different variables to float --INI-- precision=14 --FILE-- @@ -32,7 +32,7 @@ $vars = array( ); foreach ($vars as $var) { - $tmp = (double)$var; + $tmp = (float)$var; var_dump($tmp); } diff --git a/Zend/tests/type_casts/non_canonical_binary_cast.phpt b/Zend/tests/type_casts/non_canonical_binary_cast.phpt new file mode 100644 index 00000000000..2a24ef5f721 --- /dev/null +++ b/Zend/tests/type_casts/non_canonical_binary_cast.phpt @@ -0,0 +1,11 @@ +--TEST-- +Non canonical (binary) cast +--FILE-- + +--EXPECTF-- +Deprecated: Non-canonical cast (binary) is deprecated, use the (string) cast instead in %s on line %d +int(42) diff --git a/Zend/tests/type_casts/non_canonical_boolean_cast.phpt b/Zend/tests/type_casts/non_canonical_boolean_cast.phpt new file mode 100644 index 00000000000..4d549a93ea0 --- /dev/null +++ b/Zend/tests/type_casts/non_canonical_boolean_cast.phpt @@ -0,0 +1,11 @@ +--TEST-- +Non canonical (boolean) cast +--FILE-- + +--EXPECTF-- +Deprecated: Non-canonical cast (boolean) is deprecated, use the (bool) cast instead in %s on line %d +int(42) diff --git a/Zend/tests/type_casts/non_canonical_double_cast.phpt b/Zend/tests/type_casts/non_canonical_double_cast.phpt new file mode 100644 index 00000000000..043517cd1be --- /dev/null +++ b/Zend/tests/type_casts/non_canonical_double_cast.phpt @@ -0,0 +1,11 @@ +--TEST-- +Non canonical (double) cast +--FILE-- + +--EXPECTF-- +Deprecated: Non-canonical cast (double) is deprecated, use the (float) cast instead in %s on line %d +int(42) diff --git a/Zend/tests/type_casts/non_canonical_integer_cast.phpt b/Zend/tests/type_casts/non_canonical_integer_cast.phpt new file mode 100644 index 00000000000..4f428ff9d53 --- /dev/null +++ b/Zend/tests/type_casts/non_canonical_integer_cast.phpt @@ -0,0 +1,11 @@ +--TEST-- +Non canonical (integer) cast +--FILE-- + +--EXPECTF-- +Deprecated: Non-canonical cast (integer) is deprecated, use the (int) cast instead in %s on line %d +int(42) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 8d2c0077efa..1172cba2d4f 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -2310,7 +2310,7 @@ simple_list: case IS_NULL: PREFIX_OP("(unset)", 240, 241); case _IS_BOOL: PREFIX_OP("(bool)", 240, 241); case IS_LONG: PREFIX_OP("(int)", 240, 241); - case IS_DOUBLE: PREFIX_OP("(double)", 240, 241); + case IS_DOUBLE: PREFIX_OP("(float)", 240, 241); case IS_STRING: PREFIX_OP("(string)", 240, 241); case IS_ARRAY: PREFIX_OP("(array)", 240, 241); case IS_OBJECT: PREFIX_OP("(object)", 240, 241); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 07ea669ae8e..12d93716817 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -212,7 +212,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token T_INC "'++'" %token T_DEC "'--'" %token T_INT_CAST "'(int)'" -%token T_DOUBLE_CAST "'(double)'" +%token T_DOUBLE_CAST "'(float)'" %token T_STRING_CAST "'(string)'" %token T_ARRAY_CAST "'(array)'" %token T_OBJECT_CAST "'(object)'" diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 77437efb2d5..7bbfd2b34e7 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1629,14 +1629,28 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN_WITH_IDENT(T_VAR); } -"("{TABS_AND_SPACES}("int"|"integer"){TABS_AND_SPACES}")" { +"("{TABS_AND_SPACES}("int"){TABS_AND_SPACES}")" { RETURN_TOKEN(T_INT_CAST); } -"("{TABS_AND_SPACES}("double"|"float"){TABS_AND_SPACES}")" { +"("{TABS_AND_SPACES}("integer"){TABS_AND_SPACES}")" { + if (PARSER_MODE()) { + zend_error(E_DEPRECATED, "Non-canonical cast (integer) is deprecated, use the (int) cast instead"); + } + RETURN_TOKEN(T_INT_CAST); +} + +"("{TABS_AND_SPACES}("float"){TABS_AND_SPACES}")" { RETURN_TOKEN(T_DOUBLE_CAST); } +"("{TABS_AND_SPACES}("double"){TABS_AND_SPACES}")" { + if (PARSER_MODE()) { + zend_error(E_DEPRECATED, "Non-canonical cast (double) is deprecated, use the (float) cast instead"); + } + RETURN_TOKEN(T_INT_CAST); +} + "("{TABS_AND_SPACES}"real"{TABS_AND_SPACES}")" { if (PARSER_MODE()) { zend_throw_exception(zend_ce_parse_error, "The (real) cast has been removed, use (float) instead", 0); @@ -1645,10 +1659,17 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN(T_DOUBLE_CAST); } -"("{TABS_AND_SPACES}("string"|"binary"){TABS_AND_SPACES}")" { +"("{TABS_AND_SPACES}("string"){TABS_AND_SPACES}")" { RETURN_TOKEN(T_STRING_CAST); } +"("{TABS_AND_SPACES}("binary"){TABS_AND_SPACES}")" { + if (PARSER_MODE()) { + zend_error(E_DEPRECATED, "Non-canonical cast (binary) is deprecated, use the (string) cast instead"); + } + RETURN_TOKEN(T_INT_CAST); +} + "("{TABS_AND_SPACES}"array"{TABS_AND_SPACES}")" { RETURN_TOKEN(T_ARRAY_CAST); } @@ -1657,10 +1678,17 @@ OPTIONAL_WHITESPACE_OR_COMMENTS ({WHITESPACE}|{MULTI_LINE_COMMENT}|{SINGLE_LINE_ RETURN_TOKEN(T_OBJECT_CAST); } -"("{TABS_AND_SPACES}("bool"|"boolean"){TABS_AND_SPACES}")" { +"("{TABS_AND_SPACES}("bool"){TABS_AND_SPACES}")" { RETURN_TOKEN(T_BOOL_CAST); } +"("{TABS_AND_SPACES}("boolean"){TABS_AND_SPACES}")" { + if (PARSER_MODE()) { + zend_error(E_DEPRECATED, "Non-canonical cast (boolean) is deprecated, use the (bool) cast instead"); + } + RETURN_TOKEN(T_INT_CAST); +} + "("{TABS_AND_SPACES}("unset"){TABS_AND_SPACES}")" { RETURN_TOKEN(T_UNSET_CAST); }