1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 require './test.pl'; 6 set_up_inc('../lib'); 7} 8 9use strict; 10 11my (@ary, %ary, %hash); 12 13plan 74; 14 15ok !defined($a); 16 17$a = 1+1; 18ok defined($a); 19 20undef $a; 21ok !defined($a); 22 23$a = "hi"; 24ok defined($a); 25 26$a = $b; 27ok !defined($a); 28 29@ary = ("1arg"); 30$a = pop(@ary); 31ok defined($a); 32$a = pop(@ary); 33ok !defined($a); 34 35@ary = ("1arg"); 36$a = shift(@ary); 37ok defined($a); 38$a = shift(@ary); 39ok !defined($a); 40 41$ary{'foo'} = 'hi'; 42ok defined($ary{'foo'}); 43ok !defined($ary{'bar'}); 44undef $ary{'foo'}; 45ok !defined($ary{'foo'}); 46 47sub foo { pass; 1 } 48 49&foo || fail; 50 51ok defined &foo; 52undef &foo; 53ok !defined(&foo); 54 55eval { undef $1 }; 56like $@, qr/^Modification of a read/; 57 58eval { $1 = undef }; 59like $@, qr/^Modification of a read/; 60 61{ 62 # [perl #17753] segfault when undef'ing unquoted string constant 63 eval 'undef tcp'; 64 like $@, qr/^Can't modify constant item/; 65} 66 67# bugid 3096 68# undefing a hash may free objects with destructors that then try to 69# modify the hash. Ensure that the hash remains consistent 70 71{ 72 my (%hash, %mirror); 73 74 my $iters = 5; 75 76 for (1..$iters) { 77 $hash{"k$_"} = bless ["k$_"], 'X'; 78 $mirror{"k$_"} = "k$_"; 79 } 80 81 82 my $c = $iters; 83 my $events; 84 85 sub X::DESTROY { 86 my $key = $_[0][0]; 87 $events .= 'D'; 88 note("----- DELETE($key) ------"); 89 delete $mirror{$key}; 90 91 is join('-', sort keys %hash), join('-', sort keys %mirror), 92 "$key: keys"; 93 is join('-', sort map $_->[0], values %hash), 94 join('-', sort values %mirror), "$key: values"; 95 96 # don't know exactly what we'll get from the iterator, but 97 # it must be a sensible value 98 my ($k, $v) = each %hash; 99 ok defined $k ? exists($mirror{$k}) : (keys(%mirror) == 0), 100 "$key: each 1"; 101 102 is delete $hash{$key}, undef, "$key: delete"; 103 ($k, $v) = each %hash; 104 ok defined $k ? exists($mirror{$k}) : (keys(%mirror) <= 1), 105 "$key: each 2"; 106 107 $c++; 108 if ($c <= $iters * 2) { 109 $hash{"k$c"} = bless ["k$c"], 'X'; 110 $mirror{"k$c"} = "k$c"; 111 } 112 $events .= 'E'; 113 } 114 115 each %hash; # set eiter 116 undef %hash; 117 118 is scalar keys %hash, 0, "hash empty at end"; 119 is $events, ('DE' x ($iters*2)), "events"; 120 my ($k, $v) = each %hash; 121 is $k, undef, 'each undef at end'; 122} 123 124# part of #105906: inlined undef constant getting copied 125BEGIN { $::{z} = \undef } 126for (z,z) { 127 push @_, \$_; 128} 129is $_[0], $_[1], 'undef constants preserve identity'; 130 131# [perl #122556] 132my $messages; 133package Thingie; 134DESTROY { $messages .= 'destroyed ' } 135package main; 136sub body { 137 sub { 138 my $t = bless [], 'Thingie'; 139 undef $t; 140 }->(), $messages .= 'after '; 141 142 return; 143} 144body(); 145is $messages, 'destroyed after ', 'undef $scalar frees refs immediately'; 146 147 148# this will segfault if it fails 149 150sub PVBM () { 'foo' } 151{ my $dummy = index 'foo', PVBM } 152 153my $pvbm = PVBM; 154undef $pvbm; 155ok !defined $pvbm; 156