summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-06-01 14:11:37 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-06-01 14:38:52 -0700
commit1c70fb82f95ad11a9d4a425652926cdbd9db23f4 (patch)
treeb07ea83ed961d9b7bf2fd34d0c97e3f4765820f4
parentfba8e77b3f4dc252953255811ead49d6391b30f3 (diff)
downloadperl-1c70fb82f95ad11a9d4a425652926cdbd9db23f4.tar.gz
Warn when list-assigning to TEMP
-rw-r--r--ext/XS-APItest/t/lvalue.t6
-rw-r--r--pp_hot.c8
2 files changed, 13 insertions, 1 deletions
diff --git a/ext/XS-APItest/t/lvalue.t b/ext/XS-APItest/t/lvalue.t
index 718507a402..d348ea6bbc 100644
--- a/ext/XS-APItest/t/lvalue.t
+++ b/ext/XS-APItest/t/lvalue.t
@@ -3,7 +3,7 @@
use warnings;
use strict;
-use Test::More tests => 3;
+use Test::More tests => 4;
use XS::APItest 'lv_temp_object';
@@ -16,6 +16,10 @@ use XS::APItest 'lv_temp_object';
lv_temp_object() = 75;
like $w, qr/Useless assignment to a temporary at/,
'warning when assigning to temp returned from XS lv sub';
+ undef $w;
+ (lv_temp_object()) = 75;
+ like $w, qr/Useless assignment to a temporary at/,
+ 'warning when list-assigning to temp returned from XS lv sub';
$w = undef;
{
diff --git a/pp_hot.c b/pp_hot.c
index bb0f20517b..9dffb988ff 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1112,6 +1112,14 @@ PP(pp_aassign)
break;
}
if (relem <= lastrelem) {
+ if (
+ SvTEMP(sv) && !SvSMAGICAL(sv) && SvREFCNT(sv) == 1 &&
+ (!isGV_with_GP(sv) || SvFAKE(sv)) && ckWARN(WARN_MISC)
+ )
+ Perl_warner(aTHX_
+ packWARN(WARN_MISC),
+ "Useless assignment to a temporary"
+ );
sv_setsv(sv, *relem);
*(relem++) = sv;
}