]> granicus.if.org Git - php/commitdiff
Fix lineno for more inheritance errors
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 27 Mar 2019 12:02:28 +0000 (13:02 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 27 Mar 2019 12:02:28 +0000 (13:02 +0100)
And also include explicit linenos in tests.

20 files changed:
Zend/tests/bug61970_1.phpt
Zend/tests/bug61970_2.phpt
Zend/tests/bug62814.phpt
Zend/tests/inter_007.phpt
Zend/tests/magic_methods_008.phpt
Zend/zend.c
Zend/zend.h
Zend/zend_inheritance.c
tests/classes/clone_005.phpt
tests/classes/final_ctor3.phpt
tests/classes/final_redeclare.phpt
tests/classes/static_mix_1.phpt
tests/classes/static_mix_2.phpt
tests/classes/visibility_000a.phpt
tests/classes/visibility_000b.phpt
tests/classes/visibility_001a.phpt
tests/classes/visibility_001b.phpt
tests/classes/visibility_002a.phpt
tests/classes/visibility_002b.phpt
tests/classes/visibility_003b.phpt

index 15dc78138524f316e7ac4f8a009cd21035ddbfc3..417eaa0aefd849c110fbbcc1e9a4e3b0c98c62c5 100644 (file)
@@ -11,4 +11,4 @@ class Bar extends Foo {
     protected function __construct(){}
 }
 --EXPECTF--
-Fatal error: Access level to Bar::__construct() must be public (as in class Foo) in %s
+Fatal error: Access level to Bar::__construct() must be public (as in class Foo) in %s on line 8
index d1e11e94070f38391959b6d45e73b620d8d30875..3e4b5222bebf3dafb9718031cb4ee498efad1790 100644 (file)
@@ -15,4 +15,4 @@ class Baz extends Bar {
     protected function __construct(){}
 }
 --EXPECTF--
-Fatal error: Access level to Baz::__construct() must be public (as in class Bar) in %s
+Fatal error: Access level to Baz::__construct() must be public (as in class Bar) in %s on line 12
index 6646aa283fdcf63ef19305f96ab6b3e2e4ea223f..c08360dd95557e6b97bfaebd238d56c78f608118 100644 (file)
@@ -17,4 +17,4 @@ class C extends B {
 
 ?>
 --EXPECTF--
-Fatal error: Access level to C::test() must be protected (as in class B) or weaker in %s on line %d
+Fatal error: Access level to C::test() must be protected (as in class B) or weaker in %s on line 12
index 610210a7da383551d6cca8d2a655b7d486972b0e..fa7c368a5ef0d48fd9b042d52c35ab771650a656 100644 (file)
@@ -17,4 +17,4 @@ interface a extends d, w { }
 
 ?>
 --EXPECTF--
-Fatal error: Cannot make non static method c::B() static in class d in %s on line %d
+Fatal error: Cannot make non static method c::B() static in class d in %s on line 4
index 61c4fa0a29f587250a84d98ddee5393650e5d312..25731516e66cf2e8069ead85aef299eae5af0394 100644 (file)
@@ -16,4 +16,4 @@ class a extends b {
 --EXPECTF--
 Warning: The magic method __set() must have public visibility and cannot be static in %s on line %d
 
-Fatal error: Access level to a::__set() must be public (as in class b) in %s on line %d
+Fatal error: Access level to a::__set() must be public (as in class b) in %s on line 8
index 721a0971171ff74602290d05b4a88f304006c85a..36f47ee08fb7fa742a306be69cc7e4d95177615e 100644 (file)
@@ -1473,6 +1473,24 @@ ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) {
        va_end(args);
 }
 
+ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(
+               int type, const char *filename, uint32_t lineno, const char *format, ...)
+{
+       va_list args;
+
+       if (!filename) {
+               uint32_t dummy_lineno;
+               get_filename_lineno(type, &filename, &dummy_lineno);
+       }
+
+       va_start(args, format);
+       zend_error_va_list(type, filename, lineno, format, args);
+       va_end(args);
+       /* Should never reach this. */
+       abort();
+}
+/* }}} */
+
 ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...)
 {
        const char *filename;
index 70c3d82c83cbc612ddb985033cd3e0a00ad39647..86b10ea58e92e9c26dc578bb3db85a126391a5f8 100644 (file)
@@ -296,6 +296,7 @@ ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) ZEND_ATTRI
 ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
 /* If filename is NULL the default filename is used. */
 ZEND_API ZEND_COLD void zend_error_at(int type, const char *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5);
+ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(int type, const char *filename, uint32_t lineno, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 4, 5);
 
 ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
 ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 1, 2);
index f7cb37e2dfd01f2239b74181dce9604eea471532..72bc9cfaae90e8a9789ee4208f787764579dcadf 100644 (file)
@@ -546,13 +546,19 @@ static ZEND_COLD zend_string *zend_get_function_declaration(const zend_function
 }
 /* }}} */
 
+static zend_always_inline uint32_t func_lineno(zend_function *fn) {
+       return fn->common.type == ZEND_USER_FUNCTION ? fn->op_array.line_start : 0;
+}
+
 static void do_inheritance_check_on_method(zend_function *child, zend_function *parent, zend_class_entry *ce, zval *child_zv) /* {{{ */
 {
        uint32_t child_flags;
        uint32_t parent_flags = parent->common.fn_flags;
 
        if (UNEXPECTED(parent_flags & ZEND_ACC_FINAL)) {
-               zend_error_noreturn(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name));
+               zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+                       "Cannot override final method %s::%s()",
+                       ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name));
        }
 
        child_flags     = child->common.fn_flags;
@@ -560,15 +566,21 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
         */
        if (UNEXPECTED((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC))) {
                if (child_flags & ZEND_ACC_STATIC) {
-                       zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non static method %s::%s() static in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
+                       zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+                               "Cannot make non static method %s::%s() static in class %s",
+                               ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
                } else {
-                       zend_error_noreturn(E_COMPILE_ERROR, "Cannot make static method %s::%s() non static in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
+                       zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+                               "Cannot make static method %s::%s() non static in class %s",
+                               ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
                }
        }
 
        /* Disallow making an inherited method abstract. */
        if (UNEXPECTED((child_flags & ZEND_ACC_ABSTRACT) > (parent_flags & ZEND_ACC_ABSTRACT))) {
-               zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
+               zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+                       "Cannot make non abstract method %s::%s() abstract in class %s",
+                       ZEND_FN_SCOPE_NAME(parent), ZSTR_VAL(child->common.function_name), ZEND_FN_SCOPE_NAME(child));
        }
 
        if (parent_flags & (ZEND_ACC_PRIVATE|ZEND_ACC_CHANGED)) {
@@ -615,7 +627,9 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
                        }
                        /* Prevent derived classes from restricting access that was available in parent classes (except deriving from non-abstract ctors) */
                        if ((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK)) {
-                               zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), ZSTR_VAL(child->common.function_name), zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker");
+                               zend_error_at_noreturn(E_COMPILE_ERROR, NULL, func_lineno(child),
+                                       "Access level to %s::%s() must be %s (as in class %s)%s",
+                                       ZEND_FN_SCOPE_NAME(child), ZSTR_VAL(child->common.function_name), zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker");
                        }
 
                        if (UNEXPECTED(!zend_do_perform_implementation_check(child, parent))) {
@@ -639,8 +653,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function *
                                        error_level = E_WARNING;
                                        error_verb = "should";
                                }
-                               zend_error_at(error_level, NULL,
-                                       child->common.type == ZEND_USER_FUNCTION ? child->op_array.line_start : 0,
+                               zend_error_at(error_level, NULL, func_lineno(child),
                                        "Declaration of %s %s be compatible with %s",
                                        ZSTR_VAL(child_prototype), error_verb, ZSTR_VAL(method_prototype));
                                zend_string_efree(child_prototype);
index bfe4d66d6fa5fa262ddaf88856441e53f95c09cb..f7592214804764c0079c7c3e609b9043b2f22aff 100644 (file)
@@ -16,4 +16,4 @@ class test extends base {
 
 ?>
 --EXPECTF--
-Fatal error: Cannot override final method base::__clone() in %sclone_005.php on line %d
+Fatal error: Cannot override final method base::__clone() in %sclone_005.php on line 11
index b34996c979aaf4ee703967263e4f8aeeecf54c0f..b0156ef2949d10bc62bf35d4e7c67ac17eca91a9 100644 (file)
@@ -12,4 +12,4 @@ Ensure implicit final inherited old-style constructor cannot be overridden.
 --EXPECTF--
 Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; A has a deprecated constructor in %s on line %d
 
-Fatal error: Cannot override final method A::A() in %s on line %d
+Fatal error: Cannot override final method A::A() in %s on line 6
index bdcbf3c86c23d6b89bcd930b1eab1e8a8f063dd8..d3d53c5dc7f960b82e817e2e1b09796b8915075a 100644 (file)
@@ -20,4 +20,4 @@ class fail extends pass {
 echo "Done\n"; // Shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Cannot override final method pass::show() in %s on line %d
+Fatal error: Cannot override final method pass::show() in %s on line 12
index 70740d23365888e7e7c7a31a090303d9fb994749..8dead368567d911a4dae0874167d515f849cd6d4 100644 (file)
@@ -21,4 +21,4 @@ fail::show();
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Cannot make static method pass::show() non static in class fail in %s on line %d
+Fatal error: Cannot make static method pass::show() non static in class fail in %s on line 10
index ec657c0d5ea70581c7fb1b3579b13ccbebcf6771..bbf6f9c1ddebbb90504c87e57e86fa65ccf48b18 100644 (file)
@@ -22,4 +22,4 @@ fail::show();
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Cannot make non static method pass::show() static in class fail in %s on line %d
+Fatal error: Cannot make non static method pass::show() static in class fail in %s on line 10
index 0dd86aa18257d693a5d327fc3a695bcea04c528c..00e918ad30830003b9bf58aecb3acdfbb246c28f 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f0() must be public (as in class same) in %s on line %d
+Fatal error: Access level to fail::f0() must be public (as in class same) in %s on line 22
index f6ac466345b994efabc67c61bff7175230145c72..aeb3078b72222bffc8544768c87d9986426390ff 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f0() must be public (as in class same) in %s on line %d
+Fatal error: Access level to fail::f0() must be public (as in class same) in %s on line 22
index d749b5266aa2dc771633403d3b5d11a76b8f635e..50baf64d678986f9cbcb66944bdf8d51f9ad0ce4 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f1() must be public (as in class same) in %s on line %d
+Fatal error: Access level to fail::f1() must be public (as in class same) in %s on line 22
index 27c39cf4306aa035bc0146d0498038cd98a27885..626b5303f8931e1de170835ddb7c130960a10ca0 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f1() must be public (as in class same) in %s on line %d
+Fatal error: Access level to fail::f1() must be public (as in class same) in %s on line 22
index ea86412ceafd37095d483a9e27048ebf9bd9506b..2fd402070d73fe4e3cce107a4559b49e0a5f1e5f 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f2() must be public (as in class same) in %s on line %d
+Fatal error: Access level to fail::f2() must be public (as in class same) in %s on line 22
index 8116a3239b9d5e1f8c31725e45b394eeee3b4b37..a8b1c5e79e8a2fb73f414fd39bbe2c773645f1c5 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f2() must be public (as in class same) in %s on line %d
+Fatal error: Access level to fail::f2() must be public (as in class same) in %s on line 22
index 9b45aa3487de1dc4fc23e5e2828160b09b1d1958..474e0df235a462606e5b00b45f83aafffa3478e4 100644 (file)
@@ -28,4 +28,4 @@ class fail extends same {
 echo "Done\n"; // shouldn't be displayed
 ?>
 --EXPECTF--
-Fatal error: Access level to fail::f3() must be protected (as in class same) or weaker in %s on line %d
+Fatal error: Access level to fail::f3() must be protected (as in class same) or weaker in %s on line 22