This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #31946] Warn when assigning to a TEMP
authorFather Chrysostomos <sprout@cpan.org>
Mon, 30 May 2011 16:49:36 +0000 (09:49 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 30 May 2011 16:49:36 +0000 (09:49 -0700)
This is the first step in downgrading a fatal error (Can't return a
temporary from lvalue subroutine) to a warning. Currently only XS
lvalue routines that return TEMPs and pure-Perl lvalue routines that
use explicit return (which don’t quite work properly yet anyway,
despite commit fa1e92c) are affected by this.

This is implemented in pp_sassign and pp_aassign, rather than
pp_leavesublv, so it will affect explicit returns and so it will
be skipped for overloaded ‘.=’, etc.

Thanks to Craig DeForest for suggesting how to do this.

pod/perldiag.pod
pp_hot.c

index b90a141..39393d8 100644 (file)
@@ -4974,6 +4974,12 @@ See L<POSIX/FUNCTIONS> for more information.
 (F) You called a Win32 function with incorrect arguments.
 See L<Win32> for more information.
 
+=item Useless assignment to a temporary
+
+(W misc) You assigned to an lvalue subroutine, but what
+the subroutine returned was a temporary scalar about to
+be discarded, so the assignment had no effect.
+
 =item Useless (?-%s) - don't use /%s modifier in regex; marked by <-- HERE in m/%s/
 
 (W regexp) You have used an internal modifier such as (?-o) that has no
index 531a33e..04de368 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -197,6 +197,13 @@ PP(pp_sassign)
        }
 
     }
+    if (
+      SvTEMP(right) && !SvSMAGICAL(right) && SvREFCNT(right) == 1 &&
+      (!isGV_with_GP(right) || SvFAKE(right)) && ckWARN(WARN_MISC)
+    )
+       Perl_warner(aTHX_
+           packWARN(WARN_MISC), "Useless assignment to a temporary"
+       );
     SvSetMagicSV(right, left);
     SETs(right);
     RETURN;