Fatalize inheriting AUTOLOAD for non-methods.
authorAbigail <abigail@abigail.be>
Tue, 6 Jun 2017 21:16:30 +0000 (23:16 +0200)
committerAbigail <abigail@abigail.be>
Tue, 6 Jun 2017 21:17:22 +0000 (23:17 +0200)
This was deprecated in 5.004.

gv.c
pod/perldelta.pod
pod/perldiag.pod
t/lib/warnings/gv
t/op/gv.t
t/porting/diag.t

diff --git a/gv.c b/gv.c
index ea41e78..42ef902 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1210,16 +1210,14 @@ Perl_gv_autoload_pvn(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags)
        return NULL;
 
     /*
-     * Inheriting AUTOLOAD for non-methods works ... for now.
+     * Inheriting AUTOLOAD for non-methods no longer works
      */
     if (
         !(flags & GV_AUTOLOAD_ISMETHOD)
      && (GvCVGEN(gv) || GvSTASH(gv) != stash)
     )
-       Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                        "Use of inherited AUTOLOAD for non-method %" SVf
-                        "::%" UTF8f "() is deprecated. This will be "
-                         "fatal in Perl 5.28",
+        Perl_croak(aTHX_ "Use of inherited AUTOLOAD for non-method %" SVf
+                         "::%" UTF8f "() is no longer allowed",
                         SVfARG(packname),
                          UTF8fARG(is_utf8, len, name));
 
index 3dd94cc..58e71e1 100644 (file)
@@ -87,6 +87,10 @@ This was deprecated since Perl 5.24.
 
 Use C<B::Concise::b_terse> instead.
 
+=head2 Use of inherited AUTOLOAD for non-methods is no longer allowed.
+
+This was deprecated in Perl 5.004.
+
 =head1 Deprecations
 
 XXX Any deprecated features, syntax, modules etc. should be listed here.
index a6f59e7..3bbd476 100644 (file)
@@ -7017,31 +7017,14 @@ scope is deprecated and should be avoided.
 
 This was deprecated in Perl 5.12.
 
-=item Use of inherited AUTOLOAD for non-method %s() is deprecated. This will be fatal in Perl 5.28
-
-(D deprecated) As an (ahem) accidental feature, C<AUTOLOAD>
-subroutines are looked up as methods (using the C<@ISA> hierarchy)
-even when the subroutines to be autoloaded were called as plain
-functions (e.g. C<Foo::bar()>), not as methods (e.g. C<< Foo->bar() >> or
-C<< $obj->bar() >>).
-
-This bug will be rectified in future by using method lookup only for
-methods' C<AUTOLOAD>s.  However, there is a significant base of existing
-code that may be using the old behavior.  So, as an interim step, Perl
-currently issues an optional warning when non-methods use inherited
-C<AUTOLOAD>s.
-
-The simple rule is:  Inheritance will not work when autoloading
-non-methods.  The simple fix for old code is:  In any module that used
-to depend on inheriting C<AUTOLOAD> for non-methods from a base class
-named C<BaseClass>, execute C<*AUTOLOAD = \&BaseClass::AUTOLOAD> during
-startup.
-
-In code that currently says C<use AutoLoader; @ISA = qw(AutoLoader);>
-you should remove AutoLoader from @ISA and change C<use AutoLoader;> to
-C<use AutoLoader 'AUTOLOAD';>.
-
-This feature was deprecated in Perl 5.004, and will be fatal in Perl 5.28.
+=item Use of inherited AUTOLOAD for non-method %s::%s() is no longer allowed
+
+(F) As an accidental feature, C<AUTOLOAD> subroutines were looked up as
+methods (using the C<@ISA> hierarchy), even when the subroutines to be
+autoloaded were called as plain functions (e.g. C<Foo::bar()>), not as
+methods (e.g. C<< Foo->bar() >> or C<< $obj->bar() >>).
+
+This was deprecated in Perl 5.004, and was made fatal in Perl 5.28.
 
 =item Use of %s in printf format not supported
 
index c8e2b89..c053d7d 100644 (file)
@@ -3,11 +3,6 @@
      Can't locate package %s for @%s::ISA
        @ISA = qw(Fred); joe()
 
-     Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated
-       sub Other::AUTOLOAD { 1 } sub Other::fred {}
-       @ISA = qw(Other) ;
-       fred() ;
-
      $# is no longer supported
      $* is no longer supported
 
@@ -39,26 +34,6 @@ EXPECT
 Undefined subroutine &main::joe called at - line 3.
 ########
 # gv.c
-sub Other::AUTOLOAD { 1 } sub Other::fred {}
-@ISA = qw(Other) ;
-use warnings 'deprecated' ;
-fred() ;
-my $x = \&barney;
-(bless[])->barney;
-EXPECT
-Use of inherited AUTOLOAD for non-method main::fred() is deprecated. This will be fatal in Perl 5.28 at - line 5.
-########
-# gv.c
-use utf8;
-use open qw( :utf8 :std );
-sub Oᕞʀ::AUTOLOAD { 1 } sub Oᕞʀ::fᕃƌ {}
-@ISA = qw(Oᕞʀ) ;
-use warnings 'deprecated' ;
-fᕃƌ() ;
-EXPECT
-Use of inherited AUTOLOAD for non-method main::fᕃƌ() is deprecated. This will be fatal in Perl 5.28 at - line 7.
-########
-# gv.c
 $a = ${"#"};
 $a = ${"*"};
 no warnings 'deprecated' ;
index be6b0dd..7138725 100644 (file)
--- a/t/op/gv.t
+++ b/t/op/gv.t
@@ -12,7 +12,7 @@ BEGIN {
 
 use warnings;
 
-plan(tests => 280);
+plan(tests => 282);
 
 # type coercion on assignment
 $foo = 'foo';
@@ -1193,6 +1193,30 @@ $::{"A131085"} = sub {}; \&{"A131085"};
 }
 
 
+#
+# Deprecated before 5.28, fatal since then
+#
+undef $@;
+eval << '--';
+    sub Other::AUTOLOAD {1}
+    sub Other::fred {}
+    @ISA = qw [Other];
+    fred ();
+    my $x = \&barney;
+    (bless []) -> barney;
+--
+like $@, qr /^Use of inherited AUTOLOAD for non-method main::fred\(\) is no longer allowed/, "Cannot inherit AUTOLOAD";
+
+undef $@;
+eval << '--';
+    use utf8;
+    use open qw [:utf8 :std];
+    sub Oᕞʀ::AUTOLOAD { 1 } sub Oᕞʀ::fᕃƌ {}
+    @ISA = qw(Oᕞʀ) ;
+    fᕃƌ() ;
+--
+like $@, qr /^Use of inherited AUTOLOAD for non-method main::f\x{1543}\x{18c}\(\) is no longer allowed/, "Cannot inherit AUTOLOAD";
+
 __END__
 Perl
 Rules
index f3805d5..86c5f08 100644 (file)
@@ -685,7 +685,6 @@ Usage: VMS::Filespec::unixrealpath(spec)
 Usage: VMS::Filespec::vmsify(spec)
 Usage: VMS::Filespec::vmspath(spec)
 Usage: VMS::Filespec::vmsrealpath(spec)
-Use of inherited AUTOLOAD for non-method %s::%s() is deprecated. This will be fatal in Perl 5.28
 utf8 "\x%X" does not map to Unicode
 Value of logical "%s" too long. Truncating to %i bytes
 waitpid: process %x is not a child of process %x