require 'test.pl';
use strict qw(refs subs);
-plan (89);
+plan(102);
# Test glob operations.
$BAZ = "hit";
is ($$$FOO, 'hit');
+# test that ref(vstring) makes sense
+my $vstref = \v1;
+is (ref($vstref), "VSTRING", "ref(vstr) eq VSTRING");
+like ( $vstref, qr/VSTRING\(0x[0-9a-f]+\)/, '\vstr is also VSTRING');
+
# Test references to real arrays.
my $test = curr_test();
is ($$name1, undef, 'Nothing before we start');
is ($$name2, undef, 'Nothing before we start');
- $$name2 = "Yummy";
+ $$name1 = "Yummy";
is ($$name1, "Yummy", 'Accessing via the correct name works');
- local $TODO = "NUL bytes truncate in symrefs";
is ($$name2, undef,
'Accessing via a different NUL-containing name gives nothing');
}
+# test derefs after list slice
+
+is ( ({foo => "bar"})[0]{foo}, "bar", 'hash deref from list slice w/o ->' );
+is ( ({foo => "bar"})[0]->{foo}, "bar", 'hash deref from list slice w/ ->' );
+is ( ([qw/foo bar/])[0][1], "bar", 'array deref from list slice w/o ->' );
+is ( ([qw/foo bar/])[0]->[1], "bar", 'array deref from list slice w/ ->' );
+is ( (sub {"bar"})[0](), "bar", 'code deref from list slice w/o ->' );
+is ( (sub {"bar"})[0]->(), "bar", 'code deref from list slice w/ ->' );
+
+# deref on empty list shouldn't autovivify
+{
+ local $@;
+ eval { ()[0]{foo} };
+ like ( "$@", "Can't use an undefined value as a HASH reference",
+ "deref of undef from list slice fails" );
+}
+
+# test dereferencing errors
+{
+ eval q/ ${*STDOUT{IO}} /;
+ like($@, qr/Not a SCALAR reference/);
+ eval q/ @{*STDOUT{IO}} /;
+ like($@, qr/Not an ARRAY reference/);
+ eval q/ %{*STDOUT{IO}} /;
+ like($@, qr/Not a HASH reference/);
+ eval q/ &{*STDOUT{IO}} /;
+ like($@, qr/Not a CODE reference/);
+}
+
# Bit of a hack to make test.pl happy. There are 3 more tests after it leaves.
$test = curr_test();
curr_test($test + 3);