This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Really get t/uni/labels.t working under miniperl
[perl5.git] / t / op / smartkve.t
CommitLineData
cba5a3b0
DG
1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
cba5a3b0 5 require './test.pl';
43011852
FC
6 @INC = () unless is_miniperl();
7 unshift @INC, '../lib';
cba5a3b0
DG
8}
9use strict;
10use warnings;
d401967c 11no warnings 'deprecated', 'experimental::autoderef';
7ac5715b 12use vars qw($data $array $values $hash $errpat);
cba5a3b0
DG
13
14plan 'no_plan';
15
16sub j { join(":",@_) }
17
0b3fe645
YO
18# NOTE
19#
20# Hash insertion is currently unstable, in that
21# %hash= %otherhash will not necessarily result in
22# the same internal ordering of the data in the hash.
23# For instance when keys collide the copy may not
24# match the inserted order. So we declare one hash
25# and then make all our copies from that, which should
26# mean all the copies have the same internal structure.
0e0ab621
YO
27#
28# And these days, even if all that weren't true, we now
29# per-hash randomize keys/values. So, we cant expect two
30# hashes with the same internal structure to return the
31# same thing at all. All we *can* expect is that keys()
32# and values() use the same ordering.
0b3fe645
YO
33our %base_hash;
34
cba5a3b0 35BEGIN { # in BEGIN for "use constant ..." later
0e0ab621
YO
36 # values match keys here so we can easily check that keys(%hash) == values(%hash)
37 %base_hash= ( pi => 'pi', e => 'e', i => 'i' );
cba5a3b0 38 $array = [ qw(pi e i) ];
0e0ab621 39 $values = [ qw(pi e i) ];
0b3fe645 40 $hash = { %base_hash } ;
cba5a3b0 41 $data = {
0b3fe645 42 hash => { %base_hash },
cba5a3b0
DG
43 array => [ @$array ],
44 };
45}
46
47package Foo;
48sub new {
49 my $self = {
0b3fe645 50 hash => { %base_hash },
cba5a3b0
DG
51 array => [@{$main::array}]
52 };
53 bless $self, shift;
54}
55sub hash { no overloading; $_[0]->{hash} };
56sub array { no overloading; $_[0]->{array} };
57
58package Foo::Overload::Array;
59sub new { return bless [ qw/foo bar/ ], shift }
60use overload '@{}' => sub { $main::array }, fallback => 1;
61
62package Foo::Overload::Hash;
63sub new { return bless { qw/foo bar/ }, shift }
64use overload '%{}' => sub { $main::hash }, fallback => 1;
65
66package Foo::Overload::Both;
67sub new { return bless { qw/foo bar/ }, shift }
68use overload '%{}' => sub { $main::hash },
69 '@{}' => sub { $main::array }, fallback => 1;
70
71package Foo::Overload::HashOnArray;
72sub new { return bless [ qw/foo bar/ ], shift }
73use overload '%{}' => sub { $main::hash }, fallback => 1;
74
75package Foo::Overload::ArrayOnHash;
76sub new { return bless { qw/foo bar/ }, shift }
77use overload '@{}' => sub { $main::array }, fallback => 1;
78
79package main;
80
0b3fe645 81use constant CONST_HASH => { %base_hash };
cba5a3b0
DG
82use constant CONST_ARRAY => [ @$array ];
83
0b3fe645 84my %a_hash = %base_hash;
cba5a3b0
DG
85my @an_array = @$array;
86sub hash_sub { return \%a_hash; }
87sub array_sub { return \@an_array; }
88
89my $obj = Foo->new;
90
91my ($empty, $h_expect, $a_expect, @tmp, @tmp2, $k, $v);
92
93# Keys -- void
94
95keys $hash; pass('Void: keys $hash;');
96keys $data->{hash}; pass('Void: keys $data->{hash};');
97keys CONST_HASH; pass('Void: keys CONST_HASH;');
98keys CONST_HASH(); pass('Void: keys CONST_HASH();');
99keys hash_sub(); pass('Void: keys hash_sub();');
100keys hash_sub; pass('Void: keys hash_sub;');
101keys $obj->hash; pass('Void: keys $obj->hash;');
102keys $array; pass('Void: keys $array;');
103keys $data->{array}; pass('Void: keys $data->{array};');
104keys CONST_ARRAY; pass('Void: keys CONST_ARRAY;');
105keys CONST_ARRAY(); pass('Void: keys CONST_ARRAY();');
106keys array_sub; pass('Void: keys array_sub;');
107keys array_sub(); pass('Void: keys array_sub();');
108keys $obj->array; pass('Void: keys $obj->array;');
109
110# Keys -- scalar
111
112is(keys $hash ,3, 'Scalar: keys $hash');
113is(keys $data->{hash} ,3, 'Scalar: keys $data->{hash}');
114is(keys CONST_HASH ,3, 'Scalar: keys CONST_HASH');
115is(keys CONST_HASH() ,3, 'Scalar: keys CONST_HASH()');
116is(keys hash_sub ,3, 'Scalar: keys hash_sub');
117is(keys hash_sub() ,3, 'Scalar: keys hash_sub()');
118is(keys $obj->hash ,3, 'Scalar: keys $obj->hash');
119is(keys $array ,3, 'Scalar: keys $array');
120is(keys $data->{array} ,3, 'Scalar: keys $data->{array}');
121is(keys CONST_ARRAY ,3, 'Scalar: keys CONST_ARRAY');
122is(keys CONST_ARRAY() ,3, 'Scalar: keys CONST_ARRAY()');
123is(keys array_sub ,3, 'Scalar: keys array_sub');
124is(keys array_sub() ,3, 'Scalar: keys array_sub()');
125is(keys $obj->array ,3, 'Scalar: keys $obj->array');
126
127# Keys -- list
128
0e0ab621 129$h_expect = j(sort keys %base_hash);
cba5a3b0
DG
130$a_expect = j(keys @$array);
131
0e0ab621
YO
132is(j(sort keys $hash) ,$h_expect, 'List: sort keys $hash');
133is(j(sort keys $data->{hash}) ,$h_expect, 'List: sort keys $data->{hash}');
134is(j(sort keys CONST_HASH) ,$h_expect, 'List: sort keys CONST_HASH');
135is(j(sort keys CONST_HASH()) ,$h_expect, 'List: sort keys CONST_HASH()');
136is(j(sort keys hash_sub) ,$h_expect, 'List: sort keys hash_sub');
137is(j(sort keys hash_sub()) ,$h_expect, 'List: sort keys hash_sub()');
138is(j(sort keys $obj->hash) ,$h_expect, 'List: sort keys $obj->hash');
139
140is(j(keys $hash) ,j(values $hash), 'List: keys $hash == values $hash');
141is(j(keys $data->{hash}) ,j(values $data->{hash}), 'List: keys $data->{hash} == values $data->{hash}');
142is(j(keys CONST_HASH) ,j(values CONST_HASH), 'List: keys CONST_HASH == values CONST_HASH');
143is(j(keys CONST_HASH()) ,j(values CONST_HASH()), 'List: keys CONST_HASH() == values CONST_HASH()');
144is(j(keys hash_sub) ,j(values hash_sub), 'List: keys hash_sub == values hash_sub');
145is(j(keys hash_sub()) ,j(values hash_sub()), 'List: keys hash_sub() == values hash_sub()');
146is(j(keys $obj->hash) ,j(values $obj->hash), 'List: keys $obj->hash == values obj->hash');
147
cba5a3b0
DG
148is(j(keys $array) ,$a_expect, 'List: keys $array');
149is(j(keys $data->{array}) ,$a_expect, 'List: keys $data->{array}');
150is(j(keys CONST_ARRAY) ,$a_expect, 'List: keys CONST_ARRAY');
151is(j(keys CONST_ARRAY()) ,$a_expect, 'List: keys CONST_ARRAY()');
152is(j(keys array_sub) ,$a_expect, 'List: keys array_sub');
153is(j(keys array_sub()) ,$a_expect, 'List: keys array_sub()');
154is(j(keys $obj->array) ,$a_expect, 'List: keys $obj->array');
155
cba5a3b0 156# Keys -- vivification
7ac5715b
FC
157undef $empty;
158eval { keys $empty->{hash} };
159ok(defined $empty,
160 'Vivify: $empty (after keys $empty->{hash}) is HASHREF');
cba5a3b0
DG
161ok(!defined $empty->{hash} , 'Vivify: $empty->{hash} is undef');
162
d8065907
FC
163# Keys -- lvalue
164$_{foo} = "bar";
165keys \%_ = 65;
166is scalar %_, '1/128', 'keys $hashref as lvalue';
167eval 'keys \@_ = 65';
168like $@, qr/Can't modify keys on reference in scalar assignment/,
169 'keys $arrayref as lvalue dies';
170
cba5a3b0 171# Keys -- errors
7ac5715b
FC
172$errpat = qr/
173 (?-x:Type of argument to keys on reference must be unblessed hashref or)
174 (?-x: arrayref)
175/x;
176
177eval "keys undef";
178ok($@ =~ $errpat,
179 'Errors: keys undef throws error'
180);
181
182undef $empty;
183eval q"keys $empty";
184ok($@ =~ $errpat,
185 'Errors: keys $undef throws error'
186);
187
188is($empty, undef, 'keys $undef does not vivify $undef');
189
cba5a3b0 190eval "keys 3";
7ac5715b 191ok($@ =~ qr/Type of arg 1 to keys must be hash/,
cba5a3b0
DG
192 'Errors: keys CONSTANT throws error'
193);
194
195eval "keys qr/foo/";
7ac5715b 196ok($@ =~ $errpat,
cba5a3b0
DG
197 'Errors: keys qr/foo/ throws error'
198);
199
feff7485 200eval q"keys $hash qw/fo bar/";
cba5a3b0
DG
201ok($@ =~ qr/syntax error/,
202 'Errors: keys $hash, @stuff throws error'
203) or print "# Got: $@";
204
205# Values -- void
206
207values $hash; pass('Void: values $hash;');
208values $data->{hash}; pass('Void: values $data->{hash};');
209values CONST_HASH; pass('Void: values CONST_HASH;');
210values CONST_HASH(); pass('Void: values CONST_HASH();');
211values hash_sub(); pass('Void: values hash_sub();');
212values hash_sub; pass('Void: values hash_sub;');
213values $obj->hash; pass('Void: values $obj->hash;');
214values $array; pass('Void: values $array;');
215values $data->{array}; pass('Void: values $data->{array};');
216values CONST_ARRAY; pass('Void: values CONST_ARRAY;');
217values CONST_ARRAY(); pass('Void: values CONST_ARRAY();');
218values array_sub; pass('Void: values array_sub;');
219values array_sub(); pass('Void: values array_sub();');
220values $obj->array; pass('Void: values $obj->array;');
221
222# Values -- scalar
223
224is(values $hash ,3, 'Scalar: values $hash');
225is(values $data->{hash} ,3, 'Scalar: values $data->{hash}');
226is(values CONST_HASH ,3, 'Scalar: values CONST_HASH');
227is(values CONST_HASH() ,3, 'Scalar: values CONST_HASH()');
228is(values hash_sub ,3, 'Scalar: values hash_sub');
229is(values hash_sub() ,3, 'Scalar: values hash_sub()');
230is(values $obj->hash ,3, 'Scalar: values $obj->hash');
231is(values $array ,3, 'Scalar: values $array');
232is(values $data->{array} ,3, 'Scalar: values $data->{array}');
233is(values CONST_ARRAY ,3, 'Scalar: values CONST_ARRAY');
234is(values CONST_ARRAY() ,3, 'Scalar: values CONST_ARRAY()');
235is(values array_sub ,3, 'Scalar: values array_sub');
236is(values array_sub() ,3, 'Scalar: values array_sub()');
237is(values $obj->array ,3, 'Scalar: values $obj->array');
238
239# Values -- list
240
0e0ab621 241$h_expect = j(sort values %base_hash);
cba5a3b0
DG
242$a_expect = j(values @$array);
243
0e0ab621
YO
244is(j(sort values $hash) ,$h_expect, 'List: sort values $hash');
245is(j(sort values $data->{hash}) ,$h_expect, 'List: sort values $data->{hash}');
246is(j(sort values CONST_HASH) ,$h_expect, 'List: sort values CONST_HASH');
247is(j(sort values CONST_HASH()) ,$h_expect, 'List: sort values CONST_HASH()');
248is(j(sort values hash_sub) ,$h_expect, 'List: sort values hash_sub');
249is(j(sort values hash_sub()) ,$h_expect, 'List: sort values hash_sub()');
250is(j(sort values $obj->hash) ,$h_expect, 'List: sort values $obj->hash');
251
252is(j(values $hash) ,j(keys $hash), 'List: values $hash == keys $hash');
253is(j(values $data->{hash}) ,j(keys $data->{hash}), 'List: values $data->{hash} == keys $data->{hash}');
254is(j(values CONST_HASH) ,j(keys CONST_HASH), 'List: values CONST_HASH == keys CONST_HASH');
255is(j(values CONST_HASH()) ,j(keys CONST_HASH()), 'List: values CONST_HASH() == keys CONST_HASH()');
256is(j(values hash_sub) ,j(keys hash_sub), 'List: values hash_sub == keys hash_sub');
257is(j(values hash_sub()) ,j(keys hash_sub()), 'List: values hash_sub() == keys hash_sub()');
258is(j(values $obj->hash) ,j(keys $obj->hash), 'List: values $obj->hash == keys $obj->hash');
259
cba5a3b0
DG
260is(j(values $array) ,$a_expect, 'List: values $array');
261is(j(values $data->{array}) ,$a_expect, 'List: values $data->{array}');
262is(j(values CONST_ARRAY) ,$a_expect, 'List: values CONST_ARRAY');
263is(j(values CONST_ARRAY()) ,$a_expect, 'List: values CONST_ARRAY()');
264is(j(values array_sub) ,$a_expect, 'List: values array_sub');
265is(j(values array_sub()) ,$a_expect, 'List: values array_sub()');
266is(j(values $obj->array) ,$a_expect, 'List: values $obj->array');
267
cba5a3b0 268# Values -- vivification
7ac5715b
FC
269undef $empty;
270eval { values $empty->{hash} };
271ok(defined $empty,
272 'Vivify: $empty (after values $empty->{hash}) is HASHREF');
cba5a3b0
DG
273ok(!defined $empty->{hash} , 'Vivify: $empty->{hash} is undef');
274
275# Values -- errors
7ac5715b
FC
276$errpat = qr/
277 (?-x:Type of argument to values on reference must be unblessed hashref or)
278 (?-x: arrayref)
279/x;
280
281eval "values undef";
282ok($@ =~ $errpat,
283 'Errors: values undef throws error'
284);
285
286undef $empty;
287eval q"values $empty";
288ok($@ =~ $errpat,
289 'Errors: values $undef throws error'
290);
291
292is($empty, undef, 'values $undef does not vivify $undef');
293
cba5a3b0 294eval "values 3";
7ac5715b 295ok($@ =~ qr/Type of arg 1 to values must be hash/,
cba5a3b0
DG
296 'Errors: values CONSTANT throws error'
297);
298
299eval "values qr/foo/";
7ac5715b 300ok($@ =~ $errpat,
cba5a3b0
DG
301 'Errors: values qr/foo/ throws error'
302);
303
feff7485 304eval q"values $hash qw/fo bar/";
cba5a3b0
DG
305ok($@ =~ qr/syntax error/,
306 'Errors: values $hash, @stuff throws error'
307) or print "# Got: $@";
308
309# Each -- void
310
311each $hash; pass('Void: each $hash');
312each $data->{hash}; pass('Void: each $data->{hash}');
313each CONST_HASH; pass('Void: each CONST_HASH');
314each CONST_HASH(); pass('Void: each CONST_HASH()');
315each hash_sub(); pass('Void: each hash_sub()');
316each hash_sub; pass('Void: each hash_sub');
317each $obj->hash; pass('Void: each $obj->hash');
318each $array; pass('Void: each $array');
319each $data->{array}; pass('Void: each $data->{array}');
320each CONST_ARRAY; pass('Void: each CONST_ARRAY');
321each CONST_ARRAY(); pass('Void: each CONST_ARRAY()');
322each array_sub; pass('Void: each array_sub');
323each array_sub(); pass('Void: each array_sub()');
324each $obj->array; pass('Void: each $obj->array');
325
326# Reset iterators
327
328keys $hash;
329keys $data->{hash};
330keys CONST_HASH;
331keys CONST_HASH();
332keys hash_sub();
333keys hash_sub;
334keys $obj->hash;
335keys $array;
336keys $data->{array};
337keys CONST_ARRAY;
338keys CONST_ARRAY();
339keys array_sub;
340keys array_sub();
341keys $obj->array;
342
343# Each -- scalar
344
345@tmp=(); while(defined( $k = each $hash)) {push @tmp,$k}; is(j(@tmp),j(keys $hash), 'Scalar: each $hash');
346@tmp=(); while(defined( $k = each $data->{hash})){push @tmp,$k}; is(j(@tmp),j(keys $data->{hash}), 'Scalar: each $data->{hash}');
347@tmp=(); while(defined( $k = each CONST_HASH)){push @tmp,$k}; is(j(@tmp),j(keys CONST_HASH), 'Scalar: each CONST_HASH');
348@tmp=(); while(defined( $k = each CONST_HASH())){push @tmp,$k}; is(j(@tmp),j(keys CONST_HASH()), 'Scalar: each CONST_HASH()');
349@tmp=(); while(defined( $k = each hash_sub())){push @tmp,$k}; is(j(@tmp),j(keys hash_sub()), 'Scalar: each hash_sub()');
350@tmp=(); while(defined( $k = each hash_sub)){push @tmp,$k}; is(j(@tmp),j(keys hash_sub), 'Scalar: each hash_sub');
351@tmp=(); while(defined( $k = each $obj->hash)){push @tmp,$k}; is(j(@tmp),j(keys $obj->hash), 'Scalar: each $obj->hash');
352@tmp=(); while(defined( $k = each $array)){push @tmp,$k}; is(j(@tmp),j(keys $array), 'Scalar: each $array');
353@tmp=(); while(defined( $k = each $data->{array})){push @tmp,$k}; is(j(@tmp),j(keys $data->{array}), 'Scalar: each $data->{array}');
354@tmp=(); while(defined( $k = each CONST_ARRAY)){push @tmp,$k}; is(j(@tmp),j(keys CONST_ARRAY), 'Scalar: each CONST_ARRAY');
355@tmp=(); while(defined( $k = each CONST_ARRAY())){push @tmp,$k}; is(j(@tmp),j(keys CONST_ARRAY()), 'Scalar: each CONST_ARRAY()');
356@tmp=(); while(defined( $k = each array_sub)){push @tmp,$k}; is(j(@tmp),j(keys array_sub), 'Scalar: each array_sub');
357@tmp=(); while(defined( $k = each array_sub())){push @tmp,$k}; is(j(@tmp),j(keys array_sub()), 'Scalar: each array_sub()');
358@tmp=(); while(defined( $k = each $obj->array)){push @tmp,$k}; is(j(@tmp),j(keys $obj->array), 'Scalar: each $obj->array');
359
360# Each -- list
361
362@tmp=@tmp2=(); while(($k,$v) = each $hash) {push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys $hash, values $hash), 'List: each $hash');
363@tmp=@tmp2=(); while(($k,$v) = each $data->{hash}){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys $data->{hash}, values $data->{hash}), 'List: each $data->{hash}');
364@tmp=@tmp2=(); while(($k,$v) = each CONST_HASH){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys CONST_HASH, values CONST_HASH), 'List: each CONST_HASH');
365@tmp=@tmp2=(); while(($k,$v) = each CONST_HASH()){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys CONST_HASH(), values CONST_HASH()), 'List: each CONST_HASH()');
366@tmp=@tmp2=(); while(($k,$v) = each hash_sub()){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys hash_sub(), values hash_sub()), 'List: each hash_sub()');
367@tmp=@tmp2=(); while(($k,$v) = each hash_sub){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys hash_sub, values hash_sub), 'List: each hash_sub');
368@tmp=@tmp2=(); while(($k,$v) = each $obj->hash){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys $obj->hash, values $obj->hash), 'List: each $obj->hash');
369@tmp=@tmp2=(); while(($k,$v) = each $array){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys $array, values $array), 'List: each $array');
370@tmp=@tmp2=(); while(($k,$v) = each $data->{array}){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys $data->{array}, values $data->{array}), 'List: each $data->{array}');
371@tmp=@tmp2=(); while(($k,$v) = each CONST_ARRAY){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys CONST_ARRAY, values CONST_ARRAY), 'List: each CONST_ARRAY');
372@tmp=@tmp2=(); while(($k,$v) = each CONST_ARRAY()){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys CONST_ARRAY(), values CONST_ARRAY()), 'List: each CONST_ARRAY()');
373@tmp=@tmp2=(); while(($k,$v) = each array_sub){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys array_sub, values array_sub), 'List: each array_sub');
374@tmp=@tmp2=(); while(($k,$v) = each array_sub()){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys array_sub(), values array_sub()), 'List: each array_sub()');
375@tmp=@tmp2=(); while(($k,$v) = each $obj->array){push @tmp,$k; push @tmp2,$v}; is(j(@tmp,@tmp2),j(keys $obj->array, values $obj->array), 'List: each $obj->array');
376
7ac5715b
FC
377# Each -- vivification
378undef $empty;
379eval { each $empty->{hash} };
380ok(defined $empty,
381 'Vivify: $empty (after each $empty->{hash}) is HASHREF');
382ok(!defined $empty->{hash} , 'Vivify: $empty->{hash} is undef');
383
384# Each -- errors
385$errpat = qr/
386 (?-x:Type of argument to each on reference must be unblessed hashref or)
387 (?-x: arrayref)
388/x;
389
390eval "each undef";
391ok($@ =~ $errpat,
392 'Errors: each undef throws error'
393);
cba5a3b0
DG
394
395undef $empty;
7ac5715b
FC
396eval q"each $empty";
397ok($@ =~ $errpat,
398 'Errors: each $undef throws error'
399);
cba5a3b0 400
7ac5715b 401is($empty, undef, 'each $undef does not vivify $undef');
cba5a3b0 402
cba5a3b0 403eval "each 3";
7ac5715b 404ok($@ =~ qr/Type of arg 1 to each must be hash/,
cba5a3b0
DG
405 'Errors: each CONSTANT throws error'
406);
407
408eval "each qr/foo/";
7ac5715b 409ok($@ =~ $errpat,
cba5a3b0
DG
410 'Errors: each qr/foo/ throws error'
411);
412
feff7485 413eval q"each $hash qw/foo bar/";
cba5a3b0
DG
414ok($@ =~ qr/syntax error/,
415 'Errors: each $hash, @stuff throws error'
416) or print "# Got: $@";
417
418# Overloaded objects
419my $over_a = Foo::Overload::Array->new;
420my $over_h = Foo::Overload::Hash->new;
421my $over_b = Foo::Overload::Both->new;
422my $over_h_a = Foo::Overload::HashOnArray->new;
423my $over_a_h = Foo::Overload::ArrayOnHash->new;
424
cba5a3b0
DG
425{
426 my $warn = '';
427 local $SIG{__WARN__} = sub { $warn = shift };
428
7ac5715b
FC
429 $errpat = qr/
430 (?-x:Type of argument to keys on reference must be unblessed hashref or)
431 (?-x: arrayref)
432 /x;
433
434 eval { keys $over_a };
435 like($@, $errpat, "Overload: array dereference");
cba5a3b0
DG
436 is($warn, '', "no warning issued"); $warn = '';
437
7ac5715b
FC
438 eval { keys $over_h };
439 like($@, $errpat, "Overload: hash dereference");
cba5a3b0
DG
440 is($warn, '', "no warning issued"); $warn = '';
441
7ac5715b
FC
442 eval { keys $over_b };
443 like($@, $errpat, "Overload: ambiguous dereference (both)");
444 is($warn, '', "no warning issued"); $warn = '';
cba5a3b0 445
7ac5715b
FC
446 eval { keys $over_h_a };
447 like($@, $errpat, "Overload: ambiguous dereference");
448 is($warn, '', "no warning issued"); $warn = '';
cba5a3b0 449
7ac5715b
FC
450 eval { keys $over_a_h };
451 like($@, $errpat, "Overload: ambiguous dereference");
452 is($warn, '', "no warning issued"); $warn = '';
cba5a3b0 453}