]> granicus.if.org Git - php/commitdiff
Improved error message for typed class properties with null as default value
authorBogdan Ungureanu <bogdanungureanu21@gmail.com>
Mon, 2 Nov 2020 22:18:12 +0000 (00:18 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 08:28:53 +0000 (09:28 +0100)
Closes GH-6396.

Zend/tests/nullable_types/union_nullable_property_fails.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/nullable_types/union_nullable_property_fails.phpt b/Zend/tests/nullable_types/union_nullable_property_fails.phpt
new file mode 100644 (file)
index 0000000..809f7d3
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Nullable default property error message
+--FILE--
+<?php
+
+class A {
+    public string|int $b = null;
+}
+
+$t = new A;
+$t->b;
+
+?>
+--EXPECTF--
+Fatal error: Default value for property of type string|int may not be null. Use the nullable type string|int|null to allow null default value in %s on line %d
index 60b0948a478e705e9d1366b7ed19ef8dbccdbe24..0fd9c04330ba1fe63815ecab6914168d609ae167 100644 (file)
@@ -7042,10 +7042,13 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags, z
                                        && !zend_is_valid_default_value(type, &value_zv)) {
                                zend_string *str = zend_type_to_string(type);
                                if (Z_TYPE(value_zv) == IS_NULL) {
+                                       ZEND_TYPE_FULL_MASK(type) |= MAY_BE_NULL;
+                                       zend_string *nullable_str = zend_type_to_string(type);
+
                                        zend_error_noreturn(E_COMPILE_ERROR,
                                                "Default value for property of type %s may not be null. "
-                                               "Use the nullable type ?%s to allow null default value",
-                                               ZSTR_VAL(str), ZSTR_VAL(str));
+                                               "Use the nullable type %s to allow null default value",
+                                               ZSTR_VAL(str), ZSTR_VAL(nullable_str));
                                } else {
                                        zend_error_noreturn(E_COMPILE_ERROR,
                                                "Cannot use %s as default value for property %s::$%s of type %s",