This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #127494] TODO test for $AUTOLOAD being set for DESTROY
authorTony Cook <tony@develop-help.com>
Wed, 10 Feb 2016 00:46:48 +0000 (11:46 +1100)
committerTony Cook <tony@develop-help.com>
Wed, 10 Feb 2016 03:30:44 +0000 (14:30 +1100)
000814da allowed the cached DESTROY method to be an AUTOLOAD method,
but didn't ensure that $AUTOLOAD (or the equivalent for XS AUTOLOADS)
was set when AUTOLOAD was called.

Add a TODO test for this behaviour.

t/op/method.t

index d11a703..2a6b399 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
 use strict;
 no warnings 'once';
 
-plan(tests => 149);
+plan(tests => 150);
 
 @A::ISA = 'B';
 @B::ISA = 'C';
@@ -469,6 +469,26 @@ is $kalled, 1, 'calling a class method via a magic variable';
     package main;
     bless {}, "AutoloadDestroy";
     ok($autoloaded, "AUTOLOAD called for DESTROY");
+
+    # 127494 - AUTOLOAD for DESTROY was called without setting $AUTOLOAD
+    local $::TODO = "caching of AUTOLOAD for DESTROY didn't set \$AUTOLOAD";
+    my %methods;
+    package AutoloadDestroy2;
+    sub AUTOLOAD {
+        our $AUTOLOAD;
+        (my $method = $AUTOLOAD) =~ s/.*:://;
+        ++$methods{$method};
+    }
+    package main;
+    # this cached AUTOLOAD as the DESTROY method
+    bless {}, "AutoloadDestroy2";
+    %methods = ();
+    my $o = bless {}, "AutoloadDestroy2";
+    # this sets $AUTOLOAD to "AutoloadDestroy2::foo"
+    $o->foo;
+    # this would call AUTOLOAD without setting $AUTOLOAD
+    undef $o;
+    ok($methods{DESTROY}, "\$AUTOLOAD set correctly for DESTROY");
 }
 
 eval { () = 3; new {} };