On Sun Oct 30 15:28:32 2011, asg wrote: > sorry, gmail mangled the whitespace: > > Subject: strict subs fails with lvalue subroutines > Message-Id: <5.15.3_4541_1318900144@linux-op1p> > Reply-To: asg@cpan.org > To: perlbug@perl.org > From: asg@cpan.org > > > This is a bug report for perl from asg@cpan.org, > generated with the help of perlbug 1.39 running under perl 5.15.3. > > > ----------------------------------------------------------------- > [Please describe your issue here] > > the test file: > > #!/usr/bin/env perl > > use warnings; > use strict; > > print "perl v$]\n---\n"; > > sub abc_string { > my $x = die 'abc_string called'; > } > sub abc_string_lvalue :lvalue { > my $x = die 'abc_string_lvalue called'; > } > sub abc { > my $x = "abc_string@_"; > &$x > } > sub abc_lvalue :lvalue { > my $x = "abc_string@_"; > &$x > } > eval {abc ; 1} or print "abc died: > $@\n"; > eval {abc_lvalue ; 1} or print "abc_lvalue died: > $@\n"; > eval {abc '_lvalue'; 1} or print "abc 'lvalue' died: > $@\n"; > eval {abc_lvalue '_lvalue'; 1} or print "abc_lvalue '_lvalue' > died: > $@\n"; > > results in: > > perl v5.015003 > --- > abc died: Can't use string ("abc_string") as a > subroutine ref while "strict refs" in use at test.pl line 16. > > abc_lvalue died: Can't modify non-lvalue subroutine call > at test.pl line 20. > > abc 'lvalue' died: Can't use string ("abc_string_lvalue") > as > a subroutine ref while "strict refs" in use at test.pl line 16. > > abc_lvalue '_lvalue' died: abc_string_lvalue called at test.pl > line 12. > > --- > > the two abc_lvalue() calls should die from "strict refs" but instead > both continue past and fail for other reasons. > > the bug has been observed in perl 5.10.1 and 5.15.3 (the latter of > which > is shown below). The original lvalue sub implementation was so wrong I practically rewrote it a few months ago. This is one part I didn’t really look at, because all the tests were passing. Now that I look at it, I see multiple problems with it. Your test case exhibits two bugs, not one (the second call should not be dying with ‘Can’t assign to non-lvalue subroutine’, even with strictures off). In trying to fix it, I found two more. Details are in commit da1dff9483. I deleted about forty lines and added three (not counting tests), thereby fixing four bugs. That’s something, isn’t it? -- Father Chrysostomos --- via perlbug: queue: perl5 status: new https://rt.perl.org:443/rt3/Ticket/Display.html?id=102486Thread Next