summaryrefslogtreecommitdiff
path: root/t/op/gv.t
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2010-01-12 00:14:41 +0000
committerDavid Mitchell <davem@iabyn.com>2010-01-12 00:26:59 +0000
commit1809c940bf4737dd262fc0c026e063316c466a28 (patch)
tree5f96ecc22b872c5f31e662bccc2de73d88cb1821 /t/op/gv.t
parent0097b436152452e403cc71b4f1a1cfd30ec0ba1a (diff)
downloadperl-1809c940bf4737dd262fc0c026e063316c466a28.tar.gz
fix for [perl #65582] anon globs segfaulting
The following code has had differing behaviours: my $io_ref = *STDOUT{IO}; my $glob = *$io_ref; defined($glob) "$glob" -------------- ------- 5.8.8 false "" with uninit warning 5.10.0 true (coredump) this commit true "" $glob is essentially an anonymous typeglob (no NAME, EGV or GvSTASH). It shouldn't register as undefined since it's clearly a valid GV with a valid IO slot; Stringifying to "" seems to be the right thing, and not warning seems right too, since its not undef.
Diffstat (limited to 't/op/gv.t')
-rw-r--r--t/op/gv.t23
1 files changed, 22 insertions, 1 deletions
diff --git a/t/op/gv.t b/t/op/gv.t
index 1b705ef809..72787c4595 100644
--- a/t/op/gv.t
+++ b/t/op/gv.t
@@ -12,7 +12,7 @@ BEGIN {
use warnings;
require './test.pl';
-plan( tests => 178 );
+plan( tests => 181 );
# type coersion on assignment
$foo = 'foo';
@@ -560,6 +560,27 @@ foreach my $type (qw(integer number string)) {
"with the correct error message");
}
+# RT #60954 anonymous glob should be defined, and not coredump when
+# stringified. The behaviours are:
+#
+# defined($glob) "$glob"
+# 5.8.8 false "" with uninit warning
+# 5.10.0 true (coredump)
+# 5.12.0 true ""
+
+{
+ my $io_ref = *STDOUT{IO};
+ my $glob = *$io_ref;
+ ok(defined $glob, "RT #60954 anon glob should be defined");
+
+ my $warn = '';
+ local $SIG{__WARN__} = sub { $warn = $_[0] };
+ use warnings;
+ my $str = "$glob";
+ is($warn, '', "RT #60954 anon glob stringification shouln't warn");
+ is($str, '', "RT #60954 anon glob stringification should be empty");
+}
+
__END__
Perl
Rules