summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gv.c2
-rw-r--r--t/op/stash.t10
2 files changed, 10 insertions, 2 deletions
diff --git a/gv.c b/gv.c
index 95d4d36c67..41feaa20d4 100644
--- a/gv.c
+++ b/gv.c
@@ -1156,7 +1156,7 @@ Perl_gv_check(pTHX_ HV *stash)
for (i = 0; i <= (I32) HvMAX(stash); i++) {
for (entry = HvARRAY(stash)[i]; entry; entry = HeNEXT(entry)) {
if (HeKEY(entry)[HeKLEN(entry)-1] == ':' &&
- (gv = (GV*)HeVAL(entry)) && (hv = GvHV(gv)))
+ (gv = (GV*)HeVAL(entry)) && isGV(gv) && (hv = GvHV(gv)))
{
if (hv != PL_defstash && hv != stash)
gv_check(hv); /* nested package */
diff --git a/t/op/stash.t b/t/op/stash.t
index c8fe0ae14a..0cd7ebf5e7 100644
--- a/t/op/stash.t
+++ b/t/op/stash.t
@@ -7,7 +7,7 @@ BEGIN {
require "./test.pl";
-plan( tests => 1 );
+plan( tests => 2 );
# Used to segfault (bug #15479)
fresh_perl_is(
@@ -16,3 +16,11 @@ fresh_perl_is(
{ switches => [ '-w' ] },
'delete $::{STDERR} and print a warning',
);
+
+# Used to segfault
+fresh_perl_is(
+ 'BEGIN { $::{"X::"} = 2 }',
+ '',
+ { switches => [ '-w' ] },
+ q(Insert a non-GV in a stash, under warnings 'once'),
+);