From 380e705fc280dacb24d71c90a8cf995a4dbc10a9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 28 Jul 2021 12:35:20 +0200 Subject: [PATCH] Use consistent line numbers for early binding errors Non-early-bound classes report inheritance errors at the first line of the class, if no better line information is available (we should really store line numbers for properties at least...) Early bound classes report it at the last line of the class instead. Make the error reporting consistent by always reporting at the first line. --- .../tests/type_declarations/typed_properties_006.phpt | 2 +- .../tests/type_declarations/typed_properties_007.phpt | 2 +- .../tests/type_declarations/typed_properties_008.phpt | 2 +- .../tests/type_declarations/typed_properties_035.phpt | 2 +- Zend/zend_compile.c | 3 --- ext/opcache/ZendAccelerator.c | 11 +---------- tests/classes/constants_visibility_error_003.phpt | 2 +- tests/classes/constants_visibility_error_004.phpt | 2 +- .../property_override_protectedStatic_private.phpt | 2 +- ...operty_override_protectedStatic_privateStatic.phpt | 2 +- .../property_override_protectedStatic_protected.phpt | 2 +- .../property_override_protectedStatic_public.phpt | 2 +- .../classes/property_override_protected_private.phpt | 2 +- .../property_override_protected_privateStatic.phpt | 2 +- .../property_override_protected_protectedStatic.phpt | 2 +- .../property_override_protected_publicStatic.phpt | 2 +- .../property_override_publicStatic_private.phpt | 2 +- .../property_override_publicStatic_privateStatic.phpt | 2 +- .../property_override_publicStatic_protected.phpt | 2 +- ...roperty_override_publicStatic_protectedStatic.phpt | 2 +- .../property_override_publicStatic_public.phpt | 2 +- tests/classes/property_override_public_private.phpt | 2 +- .../property_override_public_privateStatic.phpt | 2 +- tests/classes/property_override_public_protected.phpt | 2 +- .../property_override_public_protectedStatic.phpt | 2 +- .../property_override_public_publicStatic.phpt | 2 +- 26 files changed, 25 insertions(+), 37 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_006.phpt b/Zend/tests/type_declarations/typed_properties_006.phpt index 493b64fb865..71bd6716664 100644 --- a/Zend/tests/type_declarations/typed_properties_006.phpt +++ b/Zend/tests/type_declarations/typed_properties_006.phpt @@ -11,4 +11,4 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8 +Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_007.phpt b/Zend/tests/type_declarations/typed_properties_007.phpt index 90d53b46ade..5d50a9db4fb 100644 --- a/Zend/tests/type_declarations/typed_properties_007.phpt +++ b/Zend/tests/type_declarations/typed_properties_007.phpt @@ -14,4 +14,4 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be Whatever (as in class Foo) in %s on line 11 +Fatal error: Type of Bar::$qux must be Whatever (as in class Foo) in %s on line 9 diff --git a/Zend/tests/type_declarations/typed_properties_008.phpt b/Zend/tests/type_declarations/typed_properties_008.phpt index 3f82d6161dc..529d549e683 100644 --- a/Zend/tests/type_declarations/typed_properties_008.phpt +++ b/Zend/tests/type_declarations/typed_properties_008.phpt @@ -11,4 +11,4 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8 +Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_035.phpt b/Zend/tests/type_declarations/typed_properties_035.phpt index 2fde156371e..165479021a7 100644 --- a/Zend/tests/type_declarations/typed_properties_035.phpt +++ b/Zend/tests/type_declarations/typed_properties_035.phpt @@ -11,4 +11,4 @@ class Baz extends Foo{ } ?> --EXPECTF-- -Fatal error: Type of Baz::$bar must not be defined (as in class Foo) in %s on line 8 +Fatal error: Type of Baz::$bar must not be defined (as in class Foo) in %s on line 6 diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 09e58aa98ae..86363bdee0a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7761,13 +7761,10 @@ void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel) /* {{{ && ((parent_ce->type != ZEND_INTERNAL_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES)) && ((parent_ce->type != ZEND_USER_CLASS) || !(CG(compiler_options) & ZEND_COMPILE_IGNORE_OTHER_FILES) || (parent_ce->info.user.filename == ce->info.user.filename))) { - CG(zend_lineno) = decl->end_lineno; if (zend_try_early_bind(ce, parent_ce, lcname, NULL)) { - CG(zend_lineno) = ast->lineno; zend_string_release(lcname); return; } - CG(zend_lineno) = ast->lineno; } } else if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) { zend_string_release(lcname); diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 0f209059635..55efd62236d 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3983,16 +3983,7 @@ static void preload_link(void) /* Set filename & lineno information for inheritance errors */ CG(in_compilation) = 1; CG(compiled_filename) = ce->info.user.filename; - if (ce->parent_name - && !ce->num_interfaces - && !ce->num_traits - && (parent->type == ZEND_INTERNAL_CLASS - || parent->info.user.filename == ce->info.user.filename)) { - /* simulate early binding */ - CG(zend_lineno) = ce->info.user.line_end; - } else { - CG(zend_lineno) = ce->info.user.line_start; - } + CG(zend_lineno) = ce->info.user.line_start; ce = zend_do_link_class(ce, NULL, key); if (!ce) { ZEND_ASSERT(0 && "Class linking failed?"); diff --git a/tests/classes/constants_visibility_error_003.phpt b/tests/classes/constants_visibility_error_003.phpt index 44b1e1c5f9f..97f257a9240 100644 --- a/tests/classes/constants_visibility_error_003.phpt +++ b/tests/classes/constants_visibility_error_003.phpt @@ -12,4 +12,4 @@ class B extends A { } ?> --EXPECTF-- -Fatal error: Access level to B::publicConst must be public (as in class A) in %s on line 9 +Fatal error: Access level to B::publicConst must be public (as in class A) in %s on line 7 diff --git a/tests/classes/constants_visibility_error_004.phpt b/tests/classes/constants_visibility_error_004.phpt index 72da6446cad..53240184144 100644 --- a/tests/classes/constants_visibility_error_004.phpt +++ b/tests/classes/constants_visibility_error_004.phpt @@ -12,4 +12,4 @@ class B extends A { } ?> --EXPECTF-- -Fatal error: Access level to B::protectedConst must be protected (as in class A) or weaker in %s on line 9 +Fatal error: Access level to B::protectedConst must be protected (as in class A) or weaker in %s on line 7 diff --git a/tests/classes/property_override_protectedStatic_private.phpt b/tests/classes/property_override_protectedStatic_private.phpt index 1914825804d..973b6421373 100644 --- a/tests/classes/property_override_protectedStatic_private.phpt +++ b/tests/classes/property_override_protectedStatic_private.phpt @@ -28,4 +28,4 @@ Redeclare inherited protected static property as private. $b->showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 18 +Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 11 diff --git a/tests/classes/property_override_protectedStatic_privateStatic.phpt b/tests/classes/property_override_protectedStatic_privateStatic.phpt index 126afb36a77..c81c1d49319 100644 --- a/tests/classes/property_override_protectedStatic_privateStatic.phpt +++ b/tests/classes/property_override_protectedStatic_privateStatic.phpt @@ -27,4 +27,4 @@ Redeclare inherited protected static property as private static. B::showB(); ?> --EXPECTF-- -Fatal error: Access level to B::$p must be protected (as in class A) or weaker in %s on line 18 +Fatal error: Access level to B::$p must be protected (as in class A) or weaker in %s on line 11 diff --git a/tests/classes/property_override_protectedStatic_protected.phpt b/tests/classes/property_override_protectedStatic_protected.phpt index 4706115724e..95b05350a2e 100644 --- a/tests/classes/property_override_protectedStatic_protected.phpt +++ b/tests/classes/property_override_protectedStatic_protected.phpt @@ -28,4 +28,4 @@ Redeclare inherited protected static property as protected. $b->showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 18 +Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 11 diff --git a/tests/classes/property_override_protectedStatic_public.phpt b/tests/classes/property_override_protectedStatic_public.phpt index a0a68eebbda..b00de44a5c5 100644 --- a/tests/classes/property_override_protectedStatic_public.phpt +++ b/tests/classes/property_override_protectedStatic_public.phpt @@ -28,4 +28,4 @@ Redeclare inherited protected static property as public. $b->showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 18 +Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 11 diff --git a/tests/classes/property_override_protected_private.phpt b/tests/classes/property_override_protected_private.phpt index b19185d5417..300c72a8f5b 100644 --- a/tests/classes/property_override_protected_private.phpt +++ b/tests/classes/property_override_protected_private.phpt @@ -29,4 +29,4 @@ Redeclare inherited protected property as private (duplicates Zend/tests/errmsg_ $b->showB(); ?> --EXPECTF-- -Fatal error: Access level to B::$p must be protected (as in class A) or weaker in %s on line 18 +Fatal error: Access level to B::$p must be protected (as in class A) or weaker in %s on line 11 diff --git a/tests/classes/property_override_protected_privateStatic.phpt b/tests/classes/property_override_protected_privateStatic.phpt index 149107424c9..70f3287e896 100644 --- a/tests/classes/property_override_protected_privateStatic.phpt +++ b/tests/classes/property_override_protected_privateStatic.phpt @@ -29,4 +29,4 @@ Redeclare inherited protected property as private static. B::showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 18 +Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 11 diff --git a/tests/classes/property_override_protected_protectedStatic.phpt b/tests/classes/property_override_protected_protectedStatic.phpt index e05b5f6f683..f9a3aa4c07b 100644 --- a/tests/classes/property_override_protected_protectedStatic.phpt +++ b/tests/classes/property_override_protected_protectedStatic.phpt @@ -29,4 +29,4 @@ Redeclare inherited protected property as protected static. B::showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 18 +Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 11 diff --git a/tests/classes/property_override_protected_publicStatic.phpt b/tests/classes/property_override_protected_publicStatic.phpt index 59132bf6ce0..fed7adf58fc 100644 --- a/tests/classes/property_override_protected_publicStatic.phpt +++ b/tests/classes/property_override_protected_publicStatic.phpt @@ -29,4 +29,4 @@ Redeclare inherited protected property as public static. B::showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 18 +Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 11 diff --git a/tests/classes/property_override_publicStatic_private.phpt b/tests/classes/property_override_publicStatic_private.phpt index 1e5d28680ca..52fcc8343a0 100644 --- a/tests/classes/property_override_publicStatic_private.phpt +++ b/tests/classes/property_override_publicStatic_private.phpt @@ -28,4 +28,4 @@ Redeclare inherited public static property as private. $b->showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 18 +Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 11 diff --git a/tests/classes/property_override_publicStatic_privateStatic.phpt b/tests/classes/property_override_publicStatic_privateStatic.phpt index 12b0c3fcaa9..ae1c5fb286e 100644 --- a/tests/classes/property_override_publicStatic_privateStatic.phpt +++ b/tests/classes/property_override_publicStatic_privateStatic.phpt @@ -27,4 +27,4 @@ Redeclare inherited public static property as private static. B::showB(); ?> --EXPECTF-- -Fatal error: Access level to B::$p must be public (as in class A) in %s on line 18 +Fatal error: Access level to B::$p must be public (as in class A) in %s on line 11 diff --git a/tests/classes/property_override_publicStatic_protected.phpt b/tests/classes/property_override_publicStatic_protected.phpt index 1b0fd0bdf15..fba0756acd9 100644 --- a/tests/classes/property_override_publicStatic_protected.phpt +++ b/tests/classes/property_override_publicStatic_protected.phpt @@ -28,4 +28,4 @@ Redeclare inherited public static property as protected. $b->showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 18 +Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 11 diff --git a/tests/classes/property_override_publicStatic_protectedStatic.phpt b/tests/classes/property_override_publicStatic_protectedStatic.phpt index c1f6f8ff1d8..e50c19c0a73 100644 --- a/tests/classes/property_override_publicStatic_protectedStatic.phpt +++ b/tests/classes/property_override_publicStatic_protectedStatic.phpt @@ -27,4 +27,4 @@ Redeclare inherited public static property as protected static. B::showB(); ?> --EXPECTF-- -Fatal error: Access level to B::$p must be public (as in class A) in %s on line 18 +Fatal error: Access level to B::$p must be public (as in class A) in %s on line 11 diff --git a/tests/classes/property_override_publicStatic_public.phpt b/tests/classes/property_override_publicStatic_public.phpt index c6b6bf1b249..557bab8f15e 100644 --- a/tests/classes/property_override_publicStatic_public.phpt +++ b/tests/classes/property_override_publicStatic_public.phpt @@ -28,4 +28,4 @@ Redeclare inherited public static property as public. $b->showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 18 +Fatal error: Cannot redeclare static A::$p as non static B::$p in %s on line 11 diff --git a/tests/classes/property_override_public_private.phpt b/tests/classes/property_override_public_private.phpt index fe4df691ccb..9a780f4f74e 100644 --- a/tests/classes/property_override_public_private.phpt +++ b/tests/classes/property_override_public_private.phpt @@ -29,4 +29,4 @@ Redeclare inherited public property as private. $b->showB(); ?> --EXPECTF-- -Fatal error: Access level to B::$p must be public (as in class A) in %s on line 18 +Fatal error: Access level to B::$p must be public (as in class A) in %s on line 11 diff --git a/tests/classes/property_override_public_privateStatic.phpt b/tests/classes/property_override_public_privateStatic.phpt index 41daac4503c..36040709445 100644 --- a/tests/classes/property_override_public_privateStatic.phpt +++ b/tests/classes/property_override_public_privateStatic.phpt @@ -29,4 +29,4 @@ Redeclare inherited public property as private static. B::showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 18 +Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 11 diff --git a/tests/classes/property_override_public_protected.phpt b/tests/classes/property_override_public_protected.phpt index eb7f1d7b2c3..2a0111a6743 100644 --- a/tests/classes/property_override_public_protected.phpt +++ b/tests/classes/property_override_public_protected.phpt @@ -29,4 +29,4 @@ Redeclare inherited public property as protected. $b->showB(); ?> --EXPECTF-- -Fatal error: Access level to B::$p must be public (as in class A) in %s on line 18 +Fatal error: Access level to B::$p must be public (as in class A) in %s on line 11 diff --git a/tests/classes/property_override_public_protectedStatic.phpt b/tests/classes/property_override_public_protectedStatic.phpt index 2582305471b..06b73bfbbbb 100644 --- a/tests/classes/property_override_public_protectedStatic.phpt +++ b/tests/classes/property_override_public_protectedStatic.phpt @@ -29,4 +29,4 @@ Redeclare inherited public property as protected static. B::showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 18 +Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 11 diff --git a/tests/classes/property_override_public_publicStatic.phpt b/tests/classes/property_override_public_publicStatic.phpt index bb6021454cd..2d9a44ede9e 100644 --- a/tests/classes/property_override_public_publicStatic.phpt +++ b/tests/classes/property_override_public_publicStatic.phpt @@ -29,4 +29,4 @@ Redeclare inherited public property as public static. B::showB(); ?> --EXPECTF-- -Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 18 +Fatal error: Cannot redeclare non static A::$p as static B::$p in %s on line 11