summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pod/perldelta.pod7
-rw-r--r--pod/perldiag.pod7
-rw-r--r--pp.c3
-rw-r--r--pp_hot.c2
4 files changed, 19 insertions, 0 deletions
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index d3fbae5b87..621368520b 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -492,6 +492,13 @@ only with arrays that have a hash reference at index 0.
(F) The "goto subroutine" call can't be used to jump out of an eval "string".
(You can use it to jump out of an eval {BLOCK}, but you probably don't want to.)
+=item Can't localize pseudo-hash element
+
+(F) You said something like C<local $ar-E<gt>{'key'}>, where $ar is
+a reference to a pseudo-hash. That hasn't been implemented yet, but
+you can get a similar effect by localizing the corresponding array
+element directly -- C<local $ar-E<gt>[$ar-E<gt>[0]{'key'}]>.
+
=item Can't use %%! because Errno.pm is not available
(F) The first time the %! hash is used, perl automatically loads the
diff --git a/pod/perldiag.pod b/pod/perldiag.pod
index 43226e076d..5fdeb70ab8 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -697,6 +697,13 @@ lexical variable using "my". This is not allowed. If you want to
localize a package variable of the same name, qualify it with the
package name.
+=item Can't localize pseudo-hash element
+
+(F) You said something like C<local $ar-E<gt>{'key'}>, where $ar is
+a reference to a pseudo-hash. That hasn't been implemented yet, but
+you can get a similar effect by localizing the corresponding array
+element directly -- C<local $ar-E<gt>[$ar-E<gt>[0]{'key'}]>.
+
=item Can't locate auto/%s.al in @INC
(F) A function (or method) was called in a package which allows autoload,
diff --git a/pp.c b/pp.c
index 702806d476..5e32613ce7 100644
--- a/pp.c
+++ b/pp.c
@@ -2414,6 +2414,9 @@ PP(pp_hslice)
register I32 lval = PL_op->op_flags & OPf_MOD;
I32 realhv = (SvTYPE(hv) == SVt_PVHV);
+ if (!realhv && PL_op->op_private & OPpLVAL_INTRO)
+ DIE("Can't localize pseudo-hash element");
+
if (realhv || SvTYPE(hv) == SVt_PVAV) {
while (++MARK <= SP) {
SV *keysv = *MARK;
diff --git a/pp_hot.c b/pp_hot.c
index 823da4446a..dd4f82b6bb 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1337,6 +1337,8 @@ PP(pp_helem)
svp = he ? &HeVAL(he) : 0;
}
else if (SvTYPE(hv) == SVt_PVAV) {
+ if (PL_op->op_private & OPpLVAL_INTRO)
+ DIE("Can't localize pseudo-hash element");
svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0);
}
else {