This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
do $file; won't propagate errors from die, as do is an implicit eval.
[perl5.git] / t / op / undef.t
index 8ab2ec4..04cac52 100755 (executable)
@@ -1,8 +1,11 @@
 #!./perl
 
-# $RCSfile: undef.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:34 $
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
 
-print "1..21\n";
+print "1..36\n";
 
 print defined($a) ? "not ok 1\n" : "ok 1\n";
 
@@ -54,3 +57,48 @@ sub foo { print "ok 19\n"; }
 print defined &foo ? "ok 20\n" : "not ok 20\n";
 undef &foo;
 print defined(&foo) ? "not ok 21\n" : "ok 21\n";
+
+eval { undef $1 };
+print $@ =~ /^Modification of a read/ ? "ok 22\n" : "not ok 22\n";
+
+eval { $1 = undef };
+print $@ =~ /^Modification of a read/ ? "ok 23\n" : "not ok 23\n";
+
+{
+    require Tie::Hash;
+    tie my %foo, 'Tie::StdHash';
+    print defined %foo ? "ok 24\n" : "not ok 24\n";
+    %foo = ( a => 1 );
+    print defined %foo ? "ok 25\n" : "not ok 25\n";
+}
+
+{
+    require Tie::Array;
+    tie my @foo, 'Tie::StdArray';
+    print defined @foo ? "ok 26\n" : "not ok 26\n";
+    @foo = ( a => 1 );
+    print defined @foo ? "ok 27\n" : "not ok 27\n";
+}
+
+{
+    # [perl #17753] segfault when undef'ing unquoted string constant
+    eval 'undef tcp';
+    print $@ =~ /^Can't modify constant item/ ? "ok 28\n" : "not ok 28\n";
+}
+
+# bugid 3096
+# undefing a hash may free objects with destructors that then try to
+# modify the hash. To them, the hash should appear empty.
+
+$test = 29;
+%hash = (
+    key1 => bless({}, 'X'),
+    key2 => bless({}, 'X'),
+);
+undef %hash;
+sub X::DESTROY {
+    print "not " if keys   %hash; print "ok $test\n"; $test++;
+    print "not " if values %hash; print "ok $test\n"; $test++;
+    print "not " if each   %hash; print "ok $test\n"; $test++;
+    print "not " if defined delete $hash{'key2'}; print "ok $test\n"; $test++;
+}