#!./perl -w
#
# Check that utf8.pm and its dependencies only use the subset of the
# $1..$n capture vars that Perl_save_re_context() is hard-coded to
# localise, because that function has no efficient way of determining at
# runtime what vars to localise.
#
# Note that this script tests for the existence of symbol table entries in
# %::, so @4 etc would trigger a failure as well as $4.
#
# If tests start to fail, either (in order of descending preference):
#
# * fix utf8.pm or its dependencies so that any recent change no longer
# uses more special vars (ideally it would use no vars);
#
# * fix Perl_save_re_context() so that it localises more vars, then
# update this test script with the new relaxed var list.
use
warnings;
use
strict;
# trigger the dependency loading
my
$x
=
lc
"\x{411}"
;
# determine which relevant vars those dependencies accessed
my
@vars
=
grep
!/^[0123]$/,
# $0, and $1, ..$3 allowed
grep
/^(?:\d+|[`
'&])$/, # numeric and $`, $&, $'
vars
sort
keys
%::;
# load any other modules *after* calculating @vars
require
'./test.pl'
;
plan(1);
is(
scalar
@vars
, 0,
"extraneous vars"
)
or diag(
"extra vars seen: "
.
join
(
", "
,
map
"*$_"
,
@vars
));
exit
0;