xref: /openbsd-src/gnu/usr.bin/perl/t/perf/benchmarks (revision 3d61058aa5c692477b6d18acfbbdb653a9930ff9)
1b8851fccSafresh1#!perl
2b8851fccSafresh1
3b8851fccSafresh1# This file specifies an array-of-hashes that define snippets of code that
4b8851fccSafresh1# can be run by various measurement and profiling tools.
5b8851fccSafresh1#
6b8851fccSafresh1# The basic idea is that any time you add an optimisation that is intended
7b8851fccSafresh1# to make a particular construct faster, then you should add that construct
8b8851fccSafresh1# to this file.
9b8851fccSafresh1#
10b8851fccSafresh1# Under the normal test suite, the test file benchmarks.t does a basic
11b8851fccSafresh1# compile and run of each of these snippets; not to test performance,
12b8851fccSafresh1# but just to ensure that the code doesn't have errors.
13b8851fccSafresh1#
14b8851fccSafresh1# Over time, it is intended that various measurement and profiling tools
15b8851fccSafresh1# will be written that can run selected (or all) snippets in various
16b8851fccSafresh1# environments. These will not be run as part of a normal test suite run.
17b8851fccSafresh1#
18b8851fccSafresh1# It is intended that the tests in this file will be lightweight; e.g.
19b8851fccSafresh1# a hash access, an empty function call, or a single regex match etc.
20b8851fccSafresh1#
21b8851fccSafresh1# This file is designed to be read in by 'do' (and in such a way that
22b8851fccSafresh1# multiple versions of this file from different releases can be read in
23b8851fccSafresh1# by a single process).
24b8851fccSafresh1#
25b8851fccSafresh1# The top-level array has name/hash pairs (we use an array rather than a
26b8851fccSafresh1# hash so that duplicate keys can be spotted) Each name is a token that
27b8851fccSafresh1# describes a particular test. Code will be compiled in the package named
28b8851fccSafresh1# after the token, so it should match /^(\w|::)+$/a. It is intended that
29b8851fccSafresh1# this can be used on the command line of tools to select particular
30b8851fccSafresh1# tests.
31b8851fccSafresh1# In addition, the package names are arranged into an informal hierarchy
32b8851fccSafresh1# whose top members are (this is subject to change):
33b8851fccSafresh1#
34b8851fccSafresh1#     call::     subroutine and method handling
35b8851fccSafresh1#     expr::     expressions: e.g. $x=1, $foo{bar}[0]
365759b3d2Safresh1#     func::     perl functions, e.g. func::sort::...
37b8851fccSafresh1#     loop::     structural code like for, while(), etc
38b8851fccSafresh1#     regex::    regular expressions
39b8851fccSafresh1#     string::   string handling
40b8851fccSafresh1#
41b8851fccSafresh1#
425759b3d2Safresh1# Each hash has up to five fields:
43b8851fccSafresh1#
445759b3d2Safresh1#   desc  is a description of the test; if not present, it defaults
455759b3d2Safresh1#           to the same value as the 'code' field
465759b3d2Safresh1#
475759b3d2Safresh1#   setup is an optional string containing setup code that is run once
485759b3d2Safresh1#
49b8851fccSafresh1#   code  is a string containing the code to run in a loop
50b8851fccSafresh1#
515759b3d2Safresh1#   pre   is an optional string containing setup code which is executed
525759b3d2Safresh1#         just before 'code' for every iteration, but whose execution
535759b3d2Safresh1#         time is not included in the result
54b8851fccSafresh1#
555759b3d2Safresh1#   post  like pre, but executed just after 'code'.
565759b3d2Safresh1#
575759b3d2Safresh1# So typically a benchmark tool might execute variations on something like
585759b3d2Safresh1#
595759b3d2Safresh1#   eval "package $name; $setup; for (1..1000000) { $pre; $code; $post }"
60b8851fccSafresh1#
61b8851fccSafresh1# Currently the only tool that uses this file is Porting/bench.pl;
62b8851fccSafresh1# try C<perl Porting/bench.pl --help> for more info
635759b3d2Safresh1#
645759b3d2Safresh1# ------
655759b3d2Safresh1#
665759b3d2Safresh1# Note: for the cachegrind variant, an entry like
675759b3d2Safresh1#    'foo::bar' => {
685759b3d2Safresh1#     setup   => 'SETUP',
695759b3d2Safresh1#     pre     => 'PRE',
705759b3d2Safresh1#     code    => 'CODE',
715759b3d2Safresh1#     post    => 'POST',
725759b3d2Safresh1#   }
735759b3d2Safresh1# creates two temporary perl sources looking like:
745759b3d2Safresh1#
755759b3d2Safresh1#        package foo::bar;
765759b3d2Safresh1#        BEGIN { srand(0) }
775759b3d2Safresh1#        SETUP;
785759b3d2Safresh1#        for my $__loop__ (1..$ARGV[0]) {
795759b3d2Safresh1#            PRE; 1; POST;
805759b3d2Safresh1#        }
815759b3d2Safresh1#
825759b3d2Safresh1# and as above, but with the loop body replaced with:
835759b3d2Safresh1#
845759b3d2Safresh1#            PRE; CODE; POST;
855759b3d2Safresh1#
865759b3d2Safresh1# It then pipes each of the two sources into
875759b3d2Safresh1#
885759b3d2Safresh1#     PERL_HASH_SEED=0 valgrind [options] someperl [options] - N
895759b3d2Safresh1#
905759b3d2Safresh1# where N is set to 10 and then 20.
915759b3d2Safresh1#
925759b3d2Safresh1# It then uses the result of those four cachegrind runs to subtract out
935759b3d2Safresh1# the perl startup and loop overheads (including SETUP, PRE and POST), leaving
945759b3d2Safresh1# (in theory only CODE);
955759b3d2Safresh1#
965759b3d2Safresh1# Note that misleading results may be obtained if each iteration is
975759b3d2Safresh1# not identical. For example with
985759b3d2Safresh1#
995759b3d2Safresh1#     code => '$x .= "foo"',
1005759b3d2Safresh1#
1015759b3d2Safresh1# the string $x gets longer on each iteration. Similarly, a hash might be
1025759b3d2Safresh1# empty on the first iteration, but have entries on subsequent iterations.
1035759b3d2Safresh1#
1045759b3d2Safresh1# To avoid this, use 'pre' or 'post', e.g.
1055759b3d2Safresh1#
1065759b3d2Safresh1#     pre  => '$x  = ""',
1075759b3d2Safresh1#     code => '$x .= "foo"',
1085759b3d2Safresh1#
1095759b3d2Safresh1# Finally, the optional 'compile' key causes the code body to be wrapped
1105759b3d2Safresh1# in eval qw{ sub { ... }}, so that compile time rather than execution
1115759b3d2Safresh1# time is measured.
112b8851fccSafresh1
113b8851fccSafresh1
114b8851fccSafresh1[
115b8851fccSafresh1    'call::sub::empty' => {
116b8851fccSafresh1        desc    => 'function call with no args or body',
117b8851fccSafresh1        setup   => 'sub f { }',
118b8851fccSafresh1        code    => 'f()',
119b8851fccSafresh1    },
120b8851fccSafresh1    'call::sub::amp_empty' => {
121b8851fccSafresh1        desc    => '&foo function call with no args or body',
122b8851fccSafresh1        setup   => 'sub f { }; @_ = ();',
123b8851fccSafresh1        code    => '&f',
124b8851fccSafresh1    },
125b8851fccSafresh1    'call::sub::args3' => {
126b8851fccSafresh1        desc    => 'function call with 3 local lexical vars',
127b8851fccSafresh1        setup   => 'sub f { my ($a, $b, $c) = @_; 1 }',
128b8851fccSafresh1        code    => 'f(1,2,3)',
129b8851fccSafresh1    },
130b8851fccSafresh1    'call::sub::args2_ret1' => {
131b8851fccSafresh1        desc    => 'function call with 2 local lex vars and 1 return value',
132b8851fccSafresh1        setup   => 'my $x; sub f { my ($a, $b) = @_; $a+$b }',
133b8851fccSafresh1        code    => '$x = f(1,2)',
134b8851fccSafresh1    },
135b8851fccSafresh1    'call::sub::args2_ret1temp' => {
136b8851fccSafresh1        desc    => 'function call with 2 local lex vars and 1 return TEMP value',
137b8851fccSafresh1        setup   => 'my $x; sub f { my ($a, $b) = @_; \$a }',
138b8851fccSafresh1        code    => '$x = f(1,2)',
139b8851fccSafresh1    },
140b8851fccSafresh1    'call::sub::args3_ret3' => {
141b8851fccSafresh1        desc    => 'function call with 3 local lex vars and 3 return values',
142b8851fccSafresh1        setup   => 'my @a; sub f { my ($a, $b, $c) = @_; $a+$b, $c, 1 }',
143b8851fccSafresh1        code    => '@a = f(1,2,3)',
144b8851fccSafresh1    },
145b8851fccSafresh1    'call::sub::args3_ret3str' => {
146b8851fccSafresh1        desc    => 'function call with 3 local lex vars and 3 string return values',
147b8851fccSafresh1        setup   => 'my @a; sub f { my ($a, $b, $c) = @_; my @s = ("aa","bb","cc"); @s }',
148b8851fccSafresh1        code    => '@a = f(1,2,3)',
149b8851fccSafresh1    },
150b8851fccSafresh1    'call::sub::args3_ret3temp' => {
151b8851fccSafresh1        desc    => 'function call with 3 local lex vars and 3 TEMP return values',
152b8851fccSafresh1        setup   => 'my @a; sub f { my ($a, $b, $c) = @_; 1..3 }',
153b8851fccSafresh1        code    => '@a = f(1,2,3)',
154b8851fccSafresh1    },
155b8851fccSafresh1    'call::sub::recursive' => {
156b8851fccSafresh1        desc    => 'basic recursive function call',
157b8851fccSafresh1        setup   => 'my $x; sub f { my ($i) = @_; $i > 0 ? $i + f($i-1) : 0 }',
158b8851fccSafresh1        code    => '$x = f(1)',
159b8851fccSafresh1    },
160b8851fccSafresh1
16156d68f1eSafresh1    'call::sub::scalar' => {
16256d68f1eSafresh1        desc    => 'sub called in scalar context',
16356d68f1eSafresh1        setup   => 'my $x; my @a = 1..4; sub f { @a }',
16456d68f1eSafresh1        code    => '$x = f()',
16556d68f1eSafresh1    },
16656d68f1eSafresh1
167b8851fccSafresh1    'call::goto::empty' => {
168b8851fccSafresh1        desc    => 'goto &funtion with no args or body',
169b8851fccSafresh1        setup   => 'sub f { goto &g } sub g {}',
170b8851fccSafresh1        code    => 'f()',
171b8851fccSafresh1    },
172b8851fccSafresh1    'call::goto::args3' => {
173b8851fccSafresh1        desc    => 'goto &funtion with 3 local lexical vars',
174b8851fccSafresh1        setup   => 'sub f { goto &g } sub g { my ($a, $b, $c) = @_ }',
175b8851fccSafresh1        code    => 'f(1,2,3)',
176b8851fccSafresh1    },
177b8851fccSafresh1
178b8851fccSafresh1
179b8851fccSafresh1    'expr::array::lex_1const_0' => {
180b8851fccSafresh1        desc    => 'lexical $array[0]',
181b8851fccSafresh1        setup   => 'my @a = (1)',
182b8851fccSafresh1        code    => '$a[0]',
183b8851fccSafresh1    },
184b8851fccSafresh1    'expr::array::lex_1const_m1' => {
185b8851fccSafresh1        desc    => 'lexical $array[-1]',
186b8851fccSafresh1        setup   => 'my @a = (1)',
187b8851fccSafresh1        code    => '$a[-1]',
188b8851fccSafresh1    },
189b8851fccSafresh1    'expr::array::lex_2const' => {
190b8851fccSafresh1        desc    => 'lexical $array[const][const]',
191b8851fccSafresh1        setup   => 'my @a = ([1,2])',
192b8851fccSafresh1        code    => '$a[0][1]',
193b8851fccSafresh1    },
194b8851fccSafresh1    'expr::array::lex_2var' => {
195b8851fccSafresh1        desc    => 'lexical $array[$i1][$i2]',
196b8851fccSafresh1        setup   => 'my ($i1,$i2) = (0,1); my @a = ([1,2])',
197b8851fccSafresh1        code    => '$a[$i1][$i2]',
198b8851fccSafresh1    },
199b8851fccSafresh1    'expr::array::ref_lex_2var' => {
200b8851fccSafresh1        desc    => 'lexical $arrayref->[$i1][$i2]',
201b8851fccSafresh1        setup   => 'my ($i1,$i2) = (0,1); my $r = [[1,2]]',
202b8851fccSafresh1        code    => '$r->[$i1][$i2]',
203b8851fccSafresh1    },
204b8851fccSafresh1    'expr::array::ref_lex_3const' => {
205b8851fccSafresh1        desc    => 'lexical $arrayref->[const][const][const]',
206b8851fccSafresh1        setup   => 'my $r = [[[1,2]]]',
207b8851fccSafresh1        code    => '$r->[0][0][0]',
208b8851fccSafresh1    },
209b8851fccSafresh1    'expr::array::ref_expr_lex_3const' => {
210b8851fccSafresh1        desc    => '(lexical expr)->[const][const][const]',
211b8851fccSafresh1        setup   => 'my $r = [[[1,2]]]',
212b8851fccSafresh1        code    => '($r||0)->[0][0][0]',
213b8851fccSafresh1    },
214b8851fccSafresh1
215b8851fccSafresh1
216b8851fccSafresh1    'expr::array::pkg_1const_0' => {
217b8851fccSafresh1        desc    => 'package $array[0]',
218b8851fccSafresh1        setup   => '@a = (1)',
219b8851fccSafresh1        code    => '$a[0]',
220b8851fccSafresh1    },
221b8851fccSafresh1    'expr::array::pkg_1const_m1' => {
222b8851fccSafresh1        desc    => 'package $array[-1]',
223b8851fccSafresh1        setup   => '@a = (1)',
224b8851fccSafresh1        code    => '$a[-1]',
225b8851fccSafresh1    },
226b8851fccSafresh1    'expr::array::pkg_2const' => {
227b8851fccSafresh1        desc    => 'package $array[const][const]',
228b8851fccSafresh1        setup   => '@a = ([1,2])',
229b8851fccSafresh1        code    => '$a[0][1]',
230b8851fccSafresh1    },
231b8851fccSafresh1    'expr::array::pkg_2var' => {
232b8851fccSafresh1        desc    => 'package $array[$i1][$i2]',
233b8851fccSafresh1        setup   => '($i1,$i2) = (0,1); @a = ([1,2])',
234b8851fccSafresh1        code    => '$a[$i1][$i2]',
235b8851fccSafresh1    },
236b8851fccSafresh1    'expr::array::ref_pkg_2var' => {
237b8851fccSafresh1        desc    => 'package $arrayref->[$i1][$i2]',
238b8851fccSafresh1        setup   => '($i1,$i2) = (0,1); $r = [[1,2]]',
239b8851fccSafresh1        code    => '$r->[$i1][$i2]',
240b8851fccSafresh1    },
241b8851fccSafresh1    'expr::array::ref_pkg_3const' => {
242b8851fccSafresh1        desc    => 'package $arrayref->[const][const][const]',
243b8851fccSafresh1        setup   => '$r = [[[1,2]]]',
244b8851fccSafresh1        code    => '$r->[0][0][0]',
245b8851fccSafresh1    },
246b8851fccSafresh1    'expr::array::ref_expr_pkg_3const' => {
247b8851fccSafresh1        desc    => '(package expr)->[const][const][const]',
248b8851fccSafresh1        setup   => '$r = [[[1,2]]]',
249b8851fccSafresh1        code    => '($r||0)->[0][0][0]',
250b8851fccSafresh1    },
251b8851fccSafresh1
2525759b3d2Safresh1    'expr::array::lex_bool_empty' => {
2535759b3d2Safresh1        desc    => 'empty lexical array in boolean context',
2545759b3d2Safresh1        setup   => 'my @a;',
2555759b3d2Safresh1        code    => '!@a',
2565759b3d2Safresh1    },
2575759b3d2Safresh1    'expr::array::lex_bool_full' => {
2585759b3d2Safresh1        desc    => 'non-empty lexical array in boolean context',
2595759b3d2Safresh1        setup   => 'my @a = 1..10;',
2605759b3d2Safresh1        code    => '!@a',
2615759b3d2Safresh1    },
2625759b3d2Safresh1    'expr::array::lex_scalar_empty' => {
2635759b3d2Safresh1        desc    => 'empty lexical array in scalar context',
2645759b3d2Safresh1        setup   => 'my (@a, $i);',
2655759b3d2Safresh1        code    => '$i = @a',
2665759b3d2Safresh1    },
2675759b3d2Safresh1    'expr::array::lex_scalar_full' => {
2685759b3d2Safresh1        desc    => 'non-empty lexical array in scalar context',
2695759b3d2Safresh1        setup   => 'my @a = 1..10; my $i',
2705759b3d2Safresh1        code    => '$i = @a',
2715759b3d2Safresh1    },
2725759b3d2Safresh1    'expr::array::pkg_bool_empty' => {
2735759b3d2Safresh1        desc    => 'empty lexical array in boolean context',
2745759b3d2Safresh1        setup   => 'our @a;',
2755759b3d2Safresh1        code    => '!@a',
2765759b3d2Safresh1    },
2775759b3d2Safresh1    'expr::array::pkg_bool_full' => {
2785759b3d2Safresh1        desc    => 'non-empty lexical array in boolean context',
2795759b3d2Safresh1        setup   => 'our @a = 1..10;',
2805759b3d2Safresh1        code    => '!@a',
2815759b3d2Safresh1    },
2825759b3d2Safresh1    'expr::array::pkg_scalar_empty' => {
2835759b3d2Safresh1        desc    => 'empty lexical array in scalar context',
2845759b3d2Safresh1        setup   => 'our @a; my $i;',
2855759b3d2Safresh1        code    => '$i = @a',
2865759b3d2Safresh1    },
2875759b3d2Safresh1    'expr::array::pkg_scalar_full' => {
2885759b3d2Safresh1        desc    => 'non-empty lexical array in scalar context',
2895759b3d2Safresh1        setup   => 'our @a = 1..10; my $i',
2905759b3d2Safresh1        code    => '$i = @a',
2915759b3d2Safresh1    },
292b8851fccSafresh1
293b8851fccSafresh1    'expr::arrayhash::lex_3var' => {
294b8851fccSafresh1        desc    => 'lexical $h{$k1}[$i]{$k2}',
295b8851fccSafresh1        setup   => 'my ($i, $k1, $k2) = (0,"foo","bar");'
296b8851fccSafresh1                    . 'my %h = (foo => [ { bar => 1 } ])',
297b8851fccSafresh1        code    => '$h{$k1}[$i]{$k2}',
298b8851fccSafresh1    },
299b8851fccSafresh1    'expr::arrayhash::pkg_3var' => {
300b8851fccSafresh1        desc    => 'package $h{$k1}[$i]{$k2}',
301b8851fccSafresh1        setup   => '($i, $k1, $k2) = (0,"foo","bar");'
302b8851fccSafresh1                    . '%h = (foo => [ { bar => 1 } ])',
303b8851fccSafresh1        code    => '$h{$k1}[$i]{$k2}',
304b8851fccSafresh1    },
305b8851fccSafresh1
306b8851fccSafresh1    'expr::hash::lex_1const' => {
307b8851fccSafresh1        desc    => 'lexical $hash{const}',
308b8851fccSafresh1        setup   => 'my %h = ("foo" => 1)',
309b8851fccSafresh1        code    => '$h{foo}',
310b8851fccSafresh1    },
311b8851fccSafresh1    'expr::hash::lex_2const' => {
312b8851fccSafresh1        desc    => 'lexical $hash{const}{const}',
313b8851fccSafresh1        setup   => 'my %h = (foo => { bar => 1 })',
314b8851fccSafresh1        code    => '$h{foo}{bar}',
315b8851fccSafresh1    },
316b8851fccSafresh1    'expr::hash::lex_2var' => {
317b8851fccSafresh1        desc    => 'lexical $hash{$k1}{$k2}',
318b8851fccSafresh1        setup   => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 })',
319b8851fccSafresh1        code    => '$h{$k1}{$k2}',
320b8851fccSafresh1    },
321b8851fccSafresh1    'expr::hash::ref_lex_2var' => {
322b8851fccSafresh1        desc    => 'lexical $hashref->{$k1}{$k2}',
323b8851fccSafresh1        setup   => 'my ($k1,$k2) = qw(foo bar); my $r = {$k1 => { $k2 => 1 }}',
324b8851fccSafresh1        code    => '$r->{$k1}{$k2}',
325b8851fccSafresh1    },
326b8851fccSafresh1    'expr::hash::ref_lex_3const' => {
327b8851fccSafresh1        desc    => 'lexical $hashref->{const}{const}{const}',
328b8851fccSafresh1        setup   => 'my $r = {foo => { bar => { baz => 1 }}}',
329b8851fccSafresh1        code    => '$r->{foo}{bar}{baz}',
330b8851fccSafresh1    },
331b8851fccSafresh1    'expr::hash::ref_expr_lex_3const' => {
332b8851fccSafresh1        desc    => '(lexical expr)->{const}{const}{const}',
333b8851fccSafresh1        setup   => 'my $r = {foo => { bar => { baz => 1 }}}',
334b8851fccSafresh1        code    => '($r||0)->{foo}{bar}{baz}',
335b8851fccSafresh1    },
336b8851fccSafresh1
337b8851fccSafresh1    'expr::hash::pkg_1const' => {
338b8851fccSafresh1        desc    => 'package $hash{const}',
339b8851fccSafresh1        setup   => '%h = ("foo" => 1)',
340b8851fccSafresh1        code    => '$h{foo}',
341b8851fccSafresh1    },
342b8851fccSafresh1    'expr::hash::pkg_2const' => {
343b8851fccSafresh1        desc    => 'package $hash{const}{const}',
344b8851fccSafresh1        setup   => '%h = (foo => { bar => 1 })',
345b8851fccSafresh1        code    => '$h{foo}{bar}',
346b8851fccSafresh1    },
347b8851fccSafresh1    'expr::hash::pkg_2var' => {
348b8851fccSafresh1        desc    => 'package $hash{$k1}{$k2}',
349b8851fccSafresh1        setup   => '($k1,$k2) = qw(foo bar); %h = ($k1 => { $k2 => 1 })',
350b8851fccSafresh1        code    => '$h{$k1}{$k2}',
351b8851fccSafresh1    },
352b8851fccSafresh1    'expr::hash::ref_pkg_2var' => {
353b8851fccSafresh1        desc    => 'package $hashref->{$k1}{$k2}',
354b8851fccSafresh1        setup   => '($k1,$k2) = qw(foo bar); $r = {$k1 => { $k2 => 1 }}',
355b8851fccSafresh1        code    => '$r->{$k1}{$k2}',
356b8851fccSafresh1    },
357b8851fccSafresh1    'expr::hash::ref_pkg_3const' => {
358b8851fccSafresh1        desc    => 'package $hashref->{const}{const}{const}',
359b8851fccSafresh1        setup   => '$r = {foo => { bar => { baz => 1 }}}',
360b8851fccSafresh1        code    => '$r->{foo}{bar}{baz}',
361b8851fccSafresh1    },
362b8851fccSafresh1    'expr::hash::ref_expr_pkg_3const' => {
363b8851fccSafresh1        desc    => '(package expr)->{const}{const}{const}',
364b8851fccSafresh1        setup   => '$r = {foo => { bar => { baz => 1 }}}',
365b8851fccSafresh1        code    => '($r||0)->{foo}{bar}{baz}',
366b8851fccSafresh1    },
367b8851fccSafresh1
368b8851fccSafresh1
369b8851fccSafresh1    'expr::hash::exists_lex_2var' => {
370b8851fccSafresh1        desc    => 'lexical exists $hash{$k1}{$k2}',
371b8851fccSafresh1        setup   => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 });',
372b8851fccSafresh1        code    => 'exists $h{$k1}{$k2}',
373b8851fccSafresh1    },
3745759b3d2Safresh1
3755759b3d2Safresh1    'expr::hash::bool_empty' => {
3765759b3d2Safresh1        desc    => 'empty lexical hash in boolean context',
3775759b3d2Safresh1        setup   => 'my %h;',
3785759b3d2Safresh1        code    => '!%h',
3795759b3d2Safresh1    },
3805759b3d2Safresh1    'expr::hash::bool_empty_unknown' => {
3815759b3d2Safresh1        desc    => 'empty lexical hash in unknown context',
3825759b3d2Safresh1        setup   => 'my ($i, %h); sub f { if (%h) { $i++ }}',
3835759b3d2Safresh1        code    => 'f()',
3845759b3d2Safresh1    },
3855759b3d2Safresh1    'expr::hash::bool_full' => {
3865759b3d2Safresh1        desc    => 'non-empty lexical hash in boolean context',
3875759b3d2Safresh1        setup   => 'my %h = 1..10;',
3885759b3d2Safresh1        code    => '!%h',
3895759b3d2Safresh1    },
3905759b3d2Safresh1
3915759b3d2Safresh1
3925759b3d2Safresh1    (
3935759b3d2Safresh1        map {
3945759b3d2Safresh1            sprintf('expr::hash::notexists_lex_keylen%04d',$_) => {
3955759b3d2Safresh1                desc    => 'exists on non-key of length '. $_,
3965759b3d2Safresh1                setup   => 'my %h; my $key = "A" x ' . $_ . '; $h{$key."x"} = 1;',
3975759b3d2Safresh1                code    => 'exists $h{$key}',
3985759b3d2Safresh1            },
3995759b3d2Safresh1        } (
4005759b3d2Safresh1            1 .. 24,
4015759b3d2Safresh1            # 1,2,3,7,8,9,14,15,16,20,24,
4025759b3d2Safresh1            50,
4035759b3d2Safresh1            100,
4045759b3d2Safresh1            1000,
4055759b3d2Safresh1        )
4065759b3d2Safresh1    ),
4075759b3d2Safresh1    (
4085759b3d2Safresh1        map {
4095759b3d2Safresh1            sprintf('expr::hash::exists_lex_keylen%04d',$_) => {
4105759b3d2Safresh1                desc    => 'exists on existing key of length '. $_,
4115759b3d2Safresh1                setup   => 'my %h; my $key = "A" x ' . $_ . '; $h{$key} = 1;',
4125759b3d2Safresh1                code    => 'exists $h{$key}',
4135759b3d2Safresh1            },
4145759b3d2Safresh1        } (
4155759b3d2Safresh1            1 .. 24,
4165759b3d2Safresh1            # 1,2,3,7,8,9,14,15,16,20,24,
4175759b3d2Safresh1            50,
4185759b3d2Safresh1            100,
4195759b3d2Safresh1            1000,
4205759b3d2Safresh1        )
4215759b3d2Safresh1    ),
4225759b3d2Safresh1
423b8851fccSafresh1    'expr::hash::delete_lex_2var' => {
424b8851fccSafresh1        desc    => 'lexical delete $hash{$k1}{$k2}',
425b8851fccSafresh1        setup   => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 });',
426b8851fccSafresh1        code    => 'delete $h{$k1}{$k2}',
427b8851fccSafresh1    },
428b8851fccSafresh1
429b8851fccSafresh1
430b8851fccSafresh1    # list assign, OP_AASSIGN
431b8851fccSafresh1
432b8851fccSafresh1
433b8851fccSafresh1    # (....) = ()
434b8851fccSafresh1
435b8851fccSafresh1    'expr::aassign::ma_empty' => {
436b8851fccSafresh1        desc    => 'my array assigned empty',
437b8851fccSafresh1        setup   => '',
438b8851fccSafresh1        code    => 'my @a = ()',
439b8851fccSafresh1    },
440b8851fccSafresh1    'expr::aassign::lax_empty' => {
441b8851fccSafresh1        desc    => 'non-empty lexical array assigned empty',
442b8851fccSafresh1        setup   => 'my @a = 1..3;',
443b8851fccSafresh1        code    => '@a = ()',
444b8851fccSafresh1    },
445b8851fccSafresh1    'expr::aassign::llax_empty' => {
446b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned empty',
447b8851fccSafresh1        setup   => 'my ($x, @a) = 1..4;',
448b8851fccSafresh1        code    => '($x, @a) = ()',
449b8851fccSafresh1    },
4505759b3d2Safresh1    'expr::aassign::mh_empty' => {
4515759b3d2Safresh1        desc    => 'my hash assigned empty',
4525759b3d2Safresh1        setup   => '',
4535759b3d2Safresh1        code    => 'my %h = ()',
4545759b3d2Safresh1    },
4555759b3d2Safresh1    'expr::aassign::lhx_empty' => {
4565759b3d2Safresh1        desc    => 'non-empty lexical hash assigned empty',
4575759b3d2Safresh1        setup   => 'my %h = 1..4;',
4585759b3d2Safresh1        code    => '%h = ()',
4595759b3d2Safresh1    },
4605759b3d2Safresh1    'expr::aassign::llhx_empty' => {
4615759b3d2Safresh1        desc    => 'non-empty lexical var and hash assigned empty',
4625759b3d2Safresh1        setup   => 'my ($x, %h) = 1..5;',
4635759b3d2Safresh1        code    => '($x, %h) = ()',
4645759b3d2Safresh1    },
465b8851fccSafresh1    'expr::aassign::3m_empty' => {
466b8851fccSafresh1        desc    => 'three my vars assigned empty',
467b8851fccSafresh1        setup   => '',
468b8851fccSafresh1        code    => 'my ($x,$y,$z) = ()',
469b8851fccSafresh1    },
470b8851fccSafresh1    'expr::aassign::3l_empty' => {
471b8851fccSafresh1        desc    => 'three lexical vars assigned empty',
472b8851fccSafresh1        setup   => 'my ($x,$y,$z)',
473b8851fccSafresh1        code    => '($x,$y,$z) = ()',
474b8851fccSafresh1    },
4755759b3d2Safresh1    'expr::aassign::3lref_empty' => {
4765759b3d2Safresh1        desc    => 'three lexical ref vars assigned empty',
4775759b3d2Safresh1        setup   => 'my ($x,$y,$z); my $r = []; ',
4785759b3d2Safresh1        code    => '($x,$y,$z) = ($r,$r,$r); ($x,$y,$z) = ()',
4795759b3d2Safresh1    },
480b8851fccSafresh1    'expr::aassign::pa_empty' => {
481b8851fccSafresh1        desc    => 'package array assigned empty',
482b8851fccSafresh1        setup   => '',
483b8851fccSafresh1        code    => '@a = ()',
484b8851fccSafresh1    },
485b8851fccSafresh1    'expr::aassign::pax_empty' => {
486b8851fccSafresh1        desc    => 'non-empty package array assigned empty',
487b8851fccSafresh1        setup   => '@a = (1,2,3)',
488b8851fccSafresh1        code    => '@a = ()',
489b8851fccSafresh1    },
490b8851fccSafresh1    'expr::aassign::3p_empty' => {
491b8851fccSafresh1        desc    => 'three package vars assigned empty',
492b8851fccSafresh1        setup   => '($x,$y,$z) = 1..3;',
493b8851fccSafresh1        code    => '($x,$y,$z) = ()',
494b8851fccSafresh1    },
495b8851fccSafresh1
496b8851fccSafresh1    # (....) = (1,2,3)
497b8851fccSafresh1
498b8851fccSafresh1    'expr::aassign::ma_3c' => {
499b8851fccSafresh1        desc    => 'my array assigned 3 consts',
500b8851fccSafresh1        setup   => '',
501b8851fccSafresh1        code    => 'my @a = (1,2,3)',
502b8851fccSafresh1    },
503b8851fccSafresh1    'expr::aassign::lax_3c' => {
504b8851fccSafresh1        desc    => 'non-empty lexical array assigned 3 consts',
505b8851fccSafresh1        setup   => 'my @a = 1..3;',
506b8851fccSafresh1        code    => '@a = (1,2,3)',
507b8851fccSafresh1    },
508b8851fccSafresh1    'expr::aassign::llax_3c' => {
509b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned 3 consts',
510b8851fccSafresh1        setup   => 'my ($x, @a) = 1..4;',
511b8851fccSafresh1        code    => '($x, @a) = (1,2,3)',
512b8851fccSafresh1    },
5135759b3d2Safresh1    'expr::aassign::mh_4c' => {
5145759b3d2Safresh1        desc    => 'my hash assigned 4 consts',
5155759b3d2Safresh1        setup   => '',
5165759b3d2Safresh1        code    => 'my %h = qw(a 1 b 2)',
5175759b3d2Safresh1    },
5185759b3d2Safresh1    'expr::aassign::lhx_4c' => {
5195759b3d2Safresh1        desc    => 'non-empty lexical hash assigned 4 consts',
5205759b3d2Safresh1        setup   => 'my %h = qw(a 1 b 2);',
5215759b3d2Safresh1        code    => '%h = qw(c 3 d 4)',
5225759b3d2Safresh1    },
5235759b3d2Safresh1    'expr::aassign::llhx_5c' => {
5245759b3d2Safresh1        desc    => 'non-empty lexical var and array assigned 5 consts',
5255759b3d2Safresh1        setup   => 'my ($x, %h) = (1, qw(a 1 b 2));',
5265759b3d2Safresh1        code    => '($x, %h) = (10, qw(c 3 d 4))',
5275759b3d2Safresh1    },
528b8851fccSafresh1    'expr::aassign::3m_3c' => {
529b8851fccSafresh1        desc    => 'three my vars assigned 3 consts',
530b8851fccSafresh1        setup   => '',
531b8851fccSafresh1        code    => 'my ($x,$y,$z) = (1,2,3)',
532b8851fccSafresh1    },
533b8851fccSafresh1    'expr::aassign::3l_3c' => {
534b8851fccSafresh1        desc    => 'three lexical vars assigned 3 consts',
535b8851fccSafresh1        setup   => 'my ($x,$y,$z)',
536b8851fccSafresh1        code    => '($x,$y,$z) = (1,2,3)',
537b8851fccSafresh1    },
538b8851fccSafresh1    'expr::aassign::pa_3c' => {
539b8851fccSafresh1        desc    => 'package array assigned 3 consts',
540b8851fccSafresh1        setup   => '',
541b8851fccSafresh1        code    => '@a = (1,2,3)',
542b8851fccSafresh1    },
543b8851fccSafresh1    'expr::aassign::pax_3c' => {
544b8851fccSafresh1        desc    => 'non-empty package array assigned 3 consts',
545b8851fccSafresh1        setup   => '@a = (1,2,3)',
546b8851fccSafresh1        code    => '@a = (1,2,3)',
547b8851fccSafresh1    },
548b8851fccSafresh1    'expr::aassign::3p_3c' => {
549b8851fccSafresh1        desc    => 'three package vars assigned 3 consts',
550b8851fccSafresh1        setup   => '($x,$y,$z) = 1..3;',
551b8851fccSafresh1        code    => '($x,$y,$z) = (1,2,3)',
552b8851fccSafresh1    },
553b8851fccSafresh1
554b8851fccSafresh1    # (....) = @lexical
555b8851fccSafresh1
556b8851fccSafresh1    'expr::aassign::ma_la' => {
557b8851fccSafresh1        desc    => 'my array assigned lexical array',
558b8851fccSafresh1        setup   => 'my @init = 1..3;',
559b8851fccSafresh1        code    => 'my @a = @init',
560b8851fccSafresh1    },
561b8851fccSafresh1    'expr::aassign::lax_la' => {
562b8851fccSafresh1        desc    => 'non-empty lexical array assigned lexical array',
563b8851fccSafresh1        setup   => 'my @init = 1..3; my @a = 1..3;',
564b8851fccSafresh1        code    => '@a = @init',
565b8851fccSafresh1    },
566b8851fccSafresh1    'expr::aassign::llax_la' => {
567b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned lexical array',
568b8851fccSafresh1        setup   => 'my @init = 1..3; my ($x, @a) = 1..4;',
569b8851fccSafresh1        code    => '($x, @a) = @init',
570b8851fccSafresh1    },
571b8851fccSafresh1    'expr::aassign::3m_la' => {
572b8851fccSafresh1        desc    => 'three my vars assigned lexical array',
573b8851fccSafresh1        setup   => 'my @init = 1..3;',
574b8851fccSafresh1        code    => 'my ($x,$y,$z) = @init',
575b8851fccSafresh1    },
576b8851fccSafresh1    'expr::aassign::3l_la' => {
577b8851fccSafresh1        desc    => 'three lexical vars assigned lexical array',
578b8851fccSafresh1        setup   => 'my @init = 1..3; my ($x,$y,$z)',
579b8851fccSafresh1        code    => '($x,$y,$z) = @init',
580b8851fccSafresh1    },
581b8851fccSafresh1    'expr::aassign::pa_la' => {
582b8851fccSafresh1        desc    => 'package array assigned lexical array',
583b8851fccSafresh1        setup   => 'my @init = 1..3;',
584b8851fccSafresh1        code    => '@a = @init',
585b8851fccSafresh1    },
586b8851fccSafresh1    'expr::aassign::pax_la' => {
587b8851fccSafresh1        desc    => 'non-empty package array assigned lexical array',
588b8851fccSafresh1        setup   => 'my @init = 1..3; @a = @init',
589b8851fccSafresh1        code    => '@a = @init',
590b8851fccSafresh1    },
591b8851fccSafresh1    'expr::aassign::3p_la' => {
592b8851fccSafresh1        desc    => 'three package vars assigned lexical array',
593b8851fccSafresh1        setup   => 'my @init = 1..3; ($x,$y,$z) = 1..3;',
594b8851fccSafresh1        code    => '($x,$y,$z) = @init',
595b8851fccSafresh1    },
596b8851fccSafresh1
597b8851fccSafresh1    # (....) = @package
598b8851fccSafresh1
599b8851fccSafresh1    'expr::aassign::ma_pa' => {
600b8851fccSafresh1        desc    => 'my array assigned package array',
601b8851fccSafresh1        setup   => '@init = 1..3;',
602b8851fccSafresh1        code    => 'my @a = @init',
603b8851fccSafresh1    },
604b8851fccSafresh1    'expr::aassign::lax_pa' => {
605b8851fccSafresh1        desc    => 'non-empty lexical array assigned package array',
606b8851fccSafresh1        setup   => '@init = 1..3; my @a = 1..3;',
607b8851fccSafresh1        code    => '@a = @init',
608b8851fccSafresh1    },
609b8851fccSafresh1    'expr::aassign::llax_pa' => {
610b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned package array',
611b8851fccSafresh1        setup   => '@init = 1..3; my ($x, @a) = 1..4;',
612b8851fccSafresh1        code    => '($x, @a) = @init',
613b8851fccSafresh1    },
614b8851fccSafresh1    'expr::aassign::3m_pa' => {
615b8851fccSafresh1        desc    => 'three my vars assigned package array',
616b8851fccSafresh1        setup   => '@init = 1..3;',
617b8851fccSafresh1        code    => 'my ($x,$y,$z) = @init',
618b8851fccSafresh1    },
619b8851fccSafresh1    'expr::aassign::3l_pa' => {
620b8851fccSafresh1        desc    => 'three lexical vars assigned package array',
621b8851fccSafresh1        setup   => '@init = 1..3; my ($x,$y,$z)',
622b8851fccSafresh1        code    => '($x,$y,$z) = @init',
623b8851fccSafresh1    },
624b8851fccSafresh1    'expr::aassign::pa_pa' => {
625b8851fccSafresh1        desc    => 'package array assigned package array',
626b8851fccSafresh1        setup   => '@init = 1..3;',
627b8851fccSafresh1        code    => '@a = @init',
628b8851fccSafresh1    },
629b8851fccSafresh1    'expr::aassign::pax_pa' => {
630b8851fccSafresh1        desc    => 'non-empty package array assigned package array',
631b8851fccSafresh1        setup   => '@init = 1..3; @a = @init',
632b8851fccSafresh1        code    => '@a = @init',
633b8851fccSafresh1    },
634b8851fccSafresh1    'expr::aassign::3p_pa' => {
635b8851fccSafresh1        desc    => 'three package vars assigned package array',
636b8851fccSafresh1        setup   => '@init = 1..3; ($x,$y,$z) = 1..3;',
637b8851fccSafresh1        code    => '($x,$y,$z) = @init',
638b8851fccSafresh1    },
639b8851fccSafresh1
640b8851fccSafresh1    # (....) = @_;
641b8851fccSafresh1
642b8851fccSafresh1    'expr::aassign::ma_defary' => {
643b8851fccSafresh1        desc    => 'my array assigned @_',
644b8851fccSafresh1        setup   => '@_ = 1..3;',
645b8851fccSafresh1        code    => 'my @a = @_',
646b8851fccSafresh1    },
647b8851fccSafresh1    'expr::aassign::lax_defary' => {
648b8851fccSafresh1        desc    => 'non-empty lexical array assigned @_',
649b8851fccSafresh1        setup   => '@_ = 1..3; my @a = 1..3;',
650b8851fccSafresh1        code    => '@a = @_',
651b8851fccSafresh1    },
652b8851fccSafresh1    'expr::aassign::llax_defary' => {
653b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned @_',
654b8851fccSafresh1        setup   => '@_ = 1..3; my ($x, @a) = 1..4;',
655b8851fccSafresh1        code    => '($x, @a) = @_',
656b8851fccSafresh1    },
657b8851fccSafresh1    'expr::aassign::3m_defary' => {
658b8851fccSafresh1        desc    => 'three my vars assigned @_',
659b8851fccSafresh1        setup   => '@_ = 1..3;',
660b8851fccSafresh1        code    => 'my ($x,$y,$z) = @_',
661b8851fccSafresh1    },
662b8851fccSafresh1    'expr::aassign::3l_defary' => {
663b8851fccSafresh1        desc    => 'three lexical vars assigned @_',
664b8851fccSafresh1        setup   => '@_ = 1..3; my ($x,$y,$z)',
665b8851fccSafresh1        code    => '($x,$y,$z) = @_',
666b8851fccSafresh1    },
667b8851fccSafresh1    'expr::aassign::pa_defary' => {
668b8851fccSafresh1        desc    => 'package array assigned @_',
669b8851fccSafresh1        setup   => '@_ = 1..3;',
670b8851fccSafresh1        code    => '@a = @_',
671b8851fccSafresh1    },
672b8851fccSafresh1    'expr::aassign::pax_defary' => {
673b8851fccSafresh1        desc    => 'non-empty package array assigned @_',
674b8851fccSafresh1        setup   => '@_ = 1..3; @a = @_',
675b8851fccSafresh1        code    => '@a = @_',
676b8851fccSafresh1    },
677b8851fccSafresh1    'expr::aassign::3p_defary' => {
678b8851fccSafresh1        desc    => 'three package vars assigned @_',
679b8851fccSafresh1        setup   => '@_ = 1..3; ($x,$y,$z) = 1..3;',
680b8851fccSafresh1        code    => '($x,$y,$z) = @_',
681b8851fccSafresh1    },
682b8851fccSafresh1
6835759b3d2Safresh1    # (....) = %lexical
6845759b3d2Safresh1
6855759b3d2Safresh1    'expr::aassign::ma_lh' => {
6865759b3d2Safresh1        desc    => 'my array assigned lexical hash',
6875759b3d2Safresh1        setup   => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
6885759b3d2Safresh1        code    => 'my @a = %h',
6895759b3d2Safresh1    },
6905759b3d2Safresh1
691b8851fccSafresh1
692b8851fccSafresh1    # (....) = ($lex1,$lex2,$lex3);
693b8851fccSafresh1
694b8851fccSafresh1    'expr::aassign::ma_3l' => {
695b8851fccSafresh1        desc    => 'my array assigned lexicals',
696b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3;',
697b8851fccSafresh1        code    => 'my @a = ($v1,$v2,$v3)',
698b8851fccSafresh1    },
699b8851fccSafresh1    'expr::aassign::lax_3l' => {
700b8851fccSafresh1        desc    => 'non-empty lexical array assigned lexicals',
701b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3; my @a = 1..3;',
702b8851fccSafresh1        code    => '@a = ($v1,$v2,$v3)',
703b8851fccSafresh1    },
704b8851fccSafresh1    'expr::aassign::llax_3l' => {
705b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned lexicals',
706b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3; my ($x, @a) = 1..4;',
707b8851fccSafresh1        code    => '($x, @a) = ($v1,$v2,$v3)',
708b8851fccSafresh1    },
709b8851fccSafresh1    'expr::aassign::3m_3l' => {
710b8851fccSafresh1        desc    => 'three my vars assigned lexicals',
711b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3;',
712b8851fccSafresh1        code    => 'my ($x,$y,$z) = ($v1,$v2,$v3)',
713b8851fccSafresh1    },
714b8851fccSafresh1    'expr::aassign::3l_3l' => {
715b8851fccSafresh1        desc    => 'three lexical vars assigned lexicals',
716b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3; my ($x,$y,$z)',
717b8851fccSafresh1        code    => '($x,$y,$z) = ($v1,$v2,$v3)',
718b8851fccSafresh1    },
719b8851fccSafresh1    'expr::aassign::pa_3l' => {
720b8851fccSafresh1        desc    => 'package array assigned lexicals',
721b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3;',
722b8851fccSafresh1        code    => '@a = ($v1,$v2,$v3)',
723b8851fccSafresh1    },
724b8851fccSafresh1    'expr::aassign::pax_3l' => {
725b8851fccSafresh1        desc    => 'non-empty package array assigned lexicals',
726b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3; @a = @_',
727b8851fccSafresh1        code    => '@a = ($v1,$v2,$v3)',
728b8851fccSafresh1    },
729b8851fccSafresh1    'expr::aassign::3p_3l' => {
730b8851fccSafresh1        desc    => 'three package vars assigned lexicals',
731b8851fccSafresh1        setup   => 'my ($v1,$v2,$v3) = 1..3; ($x,$y,$z) = 1..3;',
732b8851fccSafresh1        code    => '($x,$y,$z) = ($v1,$v2,$v3)',
733b8851fccSafresh1    },
734b8851fccSafresh1
735b8851fccSafresh1
736b8851fccSafresh1    # (....) = ($pkg1,$pkg2,$pkg3);
737b8851fccSafresh1
738b8851fccSafresh1    'expr::aassign::ma_3p' => {
739b8851fccSafresh1        desc    => 'my array assigned 3 package vars',
740b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3;',
741b8851fccSafresh1        code    => 'my @a = ($v1,$v2,$v3)',
742b8851fccSafresh1    },
743b8851fccSafresh1    'expr::aassign::lax_3p' => {
744b8851fccSafresh1        desc    => 'non-empty lexical array assigned 3 package vars',
745b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3; my @a = 1..3;',
746b8851fccSafresh1        code    => '@a = ($v1,$v2,$v3)',
747b8851fccSafresh1    },
748b8851fccSafresh1    'expr::aassign::llax_3p' => {
749b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned 3 package vars',
750b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3; my ($x, @a) = 1..4;',
751b8851fccSafresh1        code    => '($x, @a) = ($v1,$v2,$v3)',
752b8851fccSafresh1    },
753b8851fccSafresh1    'expr::aassign::3m_3p' => {
754b8851fccSafresh1        desc    => 'three my vars assigned 3 package vars',
755b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3;',
756b8851fccSafresh1        code    => 'my ($x,$y,$z) = ($v1,$v2,$v3)',
757b8851fccSafresh1    },
758b8851fccSafresh1    'expr::aassign::3l_3p' => {
759b8851fccSafresh1        desc    => 'three lexical vars assigned 3 package vars',
760b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3; my ($x,$y,$z)',
761b8851fccSafresh1        code    => '($x,$y,$z) = ($v1,$v2,$v3)',
762b8851fccSafresh1    },
763b8851fccSafresh1    'expr::aassign::pa_3p' => {
764b8851fccSafresh1        desc    => 'package array assigned 3 package vars',
765b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3;',
766b8851fccSafresh1        code    => '@a = ($v1,$v2,$v3)',
767b8851fccSafresh1    },
768b8851fccSafresh1    'expr::aassign::pax_3p' => {
769b8851fccSafresh1        desc    => 'non-empty package array assigned 3 package vars',
770b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3; @a = @_',
771b8851fccSafresh1        code    => '@a = ($v1,$v2,$v3)',
772b8851fccSafresh1    },
773b8851fccSafresh1    'expr::aassign::3p_3p' => {
774b8851fccSafresh1        desc    => 'three package vars assigned 3 package vars',
775b8851fccSafresh1        setup   => '($v1,$v2,$v3) = 1..3; ($x,$y,$z) = 1..3;',
776b8851fccSafresh1        code    => '($x,$y,$z) = ($v1,$v2,$v3)',
777b8851fccSafresh1    },
778b8851fccSafresh1
779b8851fccSafresh1
780b8851fccSafresh1    # (....) = (1,2,$shared);
781b8851fccSafresh1
782b8851fccSafresh1    'expr::aassign::llax_2c1s' => {
783b8851fccSafresh1        desc    => 'non-empty lexical var and array assigned 2 consts and 1 shared var',
784b8851fccSafresh1        setup   => 'my ($x, @a) = 1..4;',
785b8851fccSafresh1        code    => '($x, @a) = (1,2,$x)',
786b8851fccSafresh1    },
787b8851fccSafresh1    'expr::aassign::3l_2c1s' => {
788b8851fccSafresh1        desc    => 'three lexical vars assigned 2 consts and 1 shared var',
789b8851fccSafresh1        setup   => 'my ($x,$y,$z) = 1..3;',
790b8851fccSafresh1        code    => '($x,$y,$z) = (1,2,$x)',
791b8851fccSafresh1    },
792b8851fccSafresh1    'expr::aassign::3p_2c1s' => {
793b8851fccSafresh1        desc    => 'three package vars assigned 2 consts and 1 shared var',
794b8851fccSafresh1        setup   => '($x,$y,$z) = 1..3;',
795b8851fccSafresh1        code    => '($x,$y,$z) = (1,2,$x)',
796b8851fccSafresh1    },
797b8851fccSafresh1
798b8851fccSafresh1
799b8851fccSafresh1    # ($a,$b) = ($b,$a);
800b8851fccSafresh1
801b8851fccSafresh1    'expr::aassign::2l_swap' => {
802b8851fccSafresh1        desc    => 'swap two lexical vars',
803b8851fccSafresh1        setup   => 'my ($a,$b) = (1,2)',
804b8851fccSafresh1        code    => '($a,$b) = ($b,$a)',
805b8851fccSafresh1    },
806b8851fccSafresh1    'expr::aassign::2p_swap' => {
807b8851fccSafresh1        desc    => 'swap two package vars',
808b8851fccSafresh1        setup   => '($a,$b) = (1,2)',
809b8851fccSafresh1        code    => '($a,$b) = ($b,$a)',
810b8851fccSafresh1    },
811b8851fccSafresh1    'expr::aassign::2laelem_swap' => {
812b8851fccSafresh1        desc    => 'swap two lexical vars',
813b8851fccSafresh1        setup   => 'my @a = (1,2)',
814b8851fccSafresh1        code    => '($a[0],$a[1]) = ($a[1],$a[0])',
815b8851fccSafresh1    },
816b8851fccSafresh1
817b8851fccSafresh1    # misc list assign
818b8851fccSafresh1
819b8851fccSafresh1    'expr::aassign::5l_4l1s' => {
820b8851fccSafresh1        desc    => 'long list of lexical vars, 1 shared',
821b8851fccSafresh1        setup   => 'my ($a,$b,$c,$d,$e) = 1..5',
822b8851fccSafresh1        code    => '($a,$b,$c,$d,$e) = ($a,$a,$c,$d,$e)',
823b8851fccSafresh1    },
824b8851fccSafresh1
825b8851fccSafresh1    'expr::aassign::5p_4p1s' => {
826b8851fccSafresh1        desc    => 'long list of package vars, 1 shared',
827b8851fccSafresh1        setup   => '($a,$b,$c,$d,$e) = 1..5',
828b8851fccSafresh1        code    => '($a,$b,$c,$d,$e) = ($a,$a,$c,$d,$e)',
829b8851fccSafresh1    },
830b8851fccSafresh1    'expr::aassign::5l_defary' => {
831b8851fccSafresh1        desc    => 'long list of lexical vars to assign @_ to',
832b8851fccSafresh1        setup   => '@_ = 1..5',
833b8851fccSafresh1        code    => 'my ($a,$b,$c,$d,$e) = @_',
834b8851fccSafresh1    },
835b8851fccSafresh1    'expr::aassign::5l1la_defary' => {
836b8851fccSafresh1        desc    => 'long list of lexical vars plus long slurp to assign @_ to',
837b8851fccSafresh1        setup   => '@_ = 1..20',
838b8851fccSafresh1        code    => 'my ($a,$b,$c,$d,$e,@rest) = @_',
839b8851fccSafresh1    },
840b8851fccSafresh1    'expr::aassign::1l_2l' => {
841b8851fccSafresh1        desc    => 'single lexical LHS',
842b8851fccSafresh1        setup   => 'my $x = 1;',
843b8851fccSafresh1        code    => '(undef,$x) = ($x,$x)',
844b8851fccSafresh1    },
845b8851fccSafresh1    'expr::aassign::2l_1l' => {
846b8851fccSafresh1        desc    => 'single lexical RHS',
847b8851fccSafresh1        setup   => 'my $x = 1;',
848b8851fccSafresh1        code    => '($x,$x) = ($x)',
849b8851fccSafresh1    },
850b8851fccSafresh1    'expr::aassign::2l_1ul' => {
851b8851fccSafresh1        desc    => 'undef and single lexical RHS',
852b8851fccSafresh1        setup   => 'my $x = 1;',
853b8851fccSafresh1        code    => '($x,$x) = (undef, $x)',
854b8851fccSafresh1    },
855b8851fccSafresh1
8565759b3d2Safresh1    'expr::aassign::2list_lex' => {
8575759b3d2Safresh1        desc    => 'lexical ($x, $y) = (1, 2)',
8585759b3d2Safresh1        setup   => 'my ($x, $y)',
8595759b3d2Safresh1        code    => '($x, $y) = (1, 2)',
8605759b3d2Safresh1    },
8615759b3d2Safresh1
8625759b3d2Safresh1    'expr::aassign::lex_rv' => {
8635759b3d2Safresh1        desc    => 'lexical ($ref1, $ref2) = ($ref3, $ref4)',
8645759b3d2Safresh1        setup   => 'my ($r1, $r2, $r3, $r4);
8655759b3d2Safresh1                    ($r1, $r2) = (($r3, $r4) = ([],  []));',
8665759b3d2Safresh1        code    => '($r1, $r2) = ($r3, $r4)',
8675759b3d2Safresh1    },
8685759b3d2Safresh1
8695759b3d2Safresh1    'expr::aassign::lex_rv1' => {
8705759b3d2Safresh1        desc    => 'lexical ($ref1, $ref2) = ($ref3, $ref4) where ref1,2 are freed',
8715759b3d2Safresh1        setup   => 'my ($r1, $r2);',
8725759b3d2Safresh1        code    => '($r1, $r2) = ([], []);',
8735759b3d2Safresh1    },
8745759b3d2Safresh1
8755759b3d2Safresh1    'expr::aassign::boolean' => {
8765759b3d2Safresh1        desc    => '!(@a = @b)',
8775759b3d2Safresh1        setup   => 'my ($s,@a, @b); @b = (1,2)',
8785759b3d2Safresh1        code    => '!(@a = @b);',
8795759b3d2Safresh1    },
8805759b3d2Safresh1    'expr::aassign::scalar' => {
8815759b3d2Safresh1        desc    => '$scalar = (@a = @b)',
8825759b3d2Safresh1        setup   => 'my ($s, @a, @b); @b = (1,2)',
8835759b3d2Safresh1        code    => '$s = (@a = @b);',
8845759b3d2Safresh1    },
8855759b3d2Safresh1
8865759b3d2Safresh1    # array assign of strings
8875759b3d2Safresh1
8885759b3d2Safresh1    'expr::aassign::la_3s' => {
8895759b3d2Safresh1        desc    => 'assign 3 strings to empty lexical array',
8905759b3d2Safresh1        setup   => 'my @a',
8915759b3d2Safresh1        code    => '@a = (); @a = qw(abc defg hijkl);',
8925759b3d2Safresh1    },
8935759b3d2Safresh1    'expr::aassign::la_3ts' => {
8945759b3d2Safresh1        desc    => 'assign 3 temp strings to empty lexical array',
8955759b3d2Safresh1        setup   => 'my @a',
8965759b3d2Safresh1        code    => '@a = (); @a = map $_, qw(abc defg hijkl);',
8975759b3d2Safresh1    },
8985759b3d2Safresh1    'expr::aassign::lan_3s' => {
8995759b3d2Safresh1        desc    => 'assign 3 strings to non-empty lexical array',
9005759b3d2Safresh1        setup   => 'my @a = qw(abc defg hijkl)',
9015759b3d2Safresh1        code    => '@a = qw(abc defg hijkl);',
9025759b3d2Safresh1    },
9035759b3d2Safresh1    'expr::aassign::lan_3ts' => {
9045759b3d2Safresh1        desc    => 'assign 3 temp strings to non-empty lexical array',
9055759b3d2Safresh1        setup   => 'my @a = qw(abc defg hijkl)',
9065759b3d2Safresh1        code    => '@a = map $_, qw(abc defg hijkl);',
9075759b3d2Safresh1    },
9085759b3d2Safresh1
9095759b3d2Safresh1    # hash assign of strings
9105759b3d2Safresh1
9115759b3d2Safresh1    'expr::aassign::lh_2s' => {
9125759b3d2Safresh1        desc    => 'assign 2 strings to empty lexical hash',
9135759b3d2Safresh1        setup   => 'my %h',
9145759b3d2Safresh1        code    => '%h = (); %h = qw(k1 abc k2 defg);',
9155759b3d2Safresh1    },
9165759b3d2Safresh1    'expr::aassign::lh_2ts' => {
9175759b3d2Safresh1        desc    => 'assign 2 temp strings to empty lexical hash',
9185759b3d2Safresh1        setup   => 'my %h',
9195759b3d2Safresh1        code    => '%h = (); %h = map $_, qw(k1 abc k2 defg);',
9205759b3d2Safresh1    },
9215759b3d2Safresh1    'expr::aassign::lhn_2s' => {
9225759b3d2Safresh1        desc    => 'assign 2 strings to non-empty lexical hash',
9235759b3d2Safresh1        setup   => 'my %h = qw(k1 abc k2 defg);',
9245759b3d2Safresh1        code    => '%h = qw(k1 abc k2 defg);',
9255759b3d2Safresh1    },
9265759b3d2Safresh1    'expr::aassign::lhn_2ts' => {
9275759b3d2Safresh1        desc    => 'assign 2 temp strings to non-empty lexical hash',
9285759b3d2Safresh1        setup   => 'my %h = qw(k1 abc k2 defg);',
9295759b3d2Safresh1        code    => '%h = map $_, qw(k1 abc k2 defg);',
9305759b3d2Safresh1    },
9315759b3d2Safresh1
932b8851fccSafresh1
933b8851fccSafresh1    'expr::arith::add_lex_ii' => {
934b8851fccSafresh1        desc    => 'add two integers and assign to a lexical var',
935b8851fccSafresh1        setup   => 'my ($x,$y,$z) = 1..3;',
936b8851fccSafresh1        code    => '$z = $x + $y',
937b8851fccSafresh1    },
938b8851fccSafresh1    'expr::arith::add_pkg_ii' => {
939b8851fccSafresh1        desc    => 'add two integers and assign to a package var',
940b8851fccSafresh1        setup   => 'my ($x,$y) = 1..2; $z = 3;',
941b8851fccSafresh1        code    => '$z = $x + $y',
942b8851fccSafresh1    },
943b8851fccSafresh1    'expr::arith::add_lex_nn' => {
944b8851fccSafresh1        desc    => 'add two NVs and assign to a lexical var',
945b8851fccSafresh1        setup   => 'my ($x,$y,$z) = (1.1, 2.2, 3.3);',
946b8851fccSafresh1        code    => '$z = $x + $y',
947b8851fccSafresh1    },
948b8851fccSafresh1    'expr::arith::add_pkg_nn' => {
949b8851fccSafresh1        desc    => 'add two NVs and assign to a package var',
950b8851fccSafresh1        setup   => 'my ($x,$y); ($x,$y,$z) = (1.1, 2.2, 3.3);',
951b8851fccSafresh1        code    => '$z = $x + $y',
952b8851fccSafresh1    },
953b8851fccSafresh1    'expr::arith::add_lex_ni' => {
954b8851fccSafresh1        desc    => 'add an int and an NV and assign to a lexical var',
955eac174f2Safresh1        setup   => 'my ($y,$z) = (2.2, 3.3);',
956eac174f2Safresh1        pre     => 'my $x = 1', # after 1st iter gets upgraded to PVNV
957b8851fccSafresh1        code    => '$z = $x + $y',
958b8851fccSafresh1    },
959b8851fccSafresh1    'expr::arith::add_pkg_ni' => {
960b8851fccSafresh1        desc    => 'add an int and an NV and assign to a package var',
961eac174f2Safresh1        setup   => 'my ($y); ($y,$z) = (2.2, 3.3);',
962eac174f2Safresh1        pre     => 'my $x = 1', # after 1st iter gets upgraded to PVNV
963b8851fccSafresh1        code    => '$z = $x + $y',
964b8851fccSafresh1    },
9655759b3d2Safresh1    'expr::arith::add_lex_ss' => {
9665759b3d2Safresh1        desc    => 'add two short strings and assign to a lexical var',
9675759b3d2Safresh1        setup   => 'my ($x,$y,$z) = ("1", "2", 1);',
9685759b3d2Safresh1        code    => '$z = $x + $y; $x = "1"; ',
9695759b3d2Safresh1    },
9705759b3d2Safresh1
9715759b3d2Safresh1    'expr::arith::add_lex_ll' => {
9725759b3d2Safresh1        desc    => 'add two long strings and assign to a lexical var',
9735759b3d2Safresh1        setup   => 'my ($x,$y,$z) = ("12345", "23456", 1);',
9745759b3d2Safresh1        code    => '$z = $x + $y; $x = "12345"; ',
9755759b3d2Safresh1    },
976b8851fccSafresh1
977b8851fccSafresh1    'expr::arith::sub_lex_ii' => {
978b8851fccSafresh1        desc    => 'subtract two integers and assign to a lexical var',
979b8851fccSafresh1        setup   => 'my ($x,$y,$z) = 1..3;',
980b8851fccSafresh1        code    => '$z = $x - $y',
981b8851fccSafresh1    },
982b8851fccSafresh1    'expr::arith::sub_pkg_ii' => {
983b8851fccSafresh1        desc    => 'subtract two integers and assign to a package var',
984b8851fccSafresh1        setup   => 'my ($x,$y) = 1..2; $z = 3;',
985b8851fccSafresh1        code    => '$z = $x - $y',
986b8851fccSafresh1    },
987b8851fccSafresh1    'expr::arith::sub_lex_nn' => {
988b8851fccSafresh1        desc    => 'subtract two NVs and assign to a lexical var',
989b8851fccSafresh1        setup   => 'my ($x,$y,$z) = (1.1, 2.2, 3.3);',
990b8851fccSafresh1        code    => '$z = $x - $y',
991b8851fccSafresh1    },
992b8851fccSafresh1    'expr::arith::sub_pkg_nn' => {
993b8851fccSafresh1        desc    => 'subtract two NVs and assign to a package var',
994b8851fccSafresh1        setup   => 'my ($x,$y); ($x,$y,$z) = (1.1, 2.2, 3.3);',
995b8851fccSafresh1        code    => '$z = $x - $y',
996b8851fccSafresh1    },
997b8851fccSafresh1    'expr::arith::sub_lex_ni' => {
998b8851fccSafresh1        desc    => 'subtract an int and an NV and assign to a lexical var',
999b8851fccSafresh1        setup   => 'my ($x,$y,$z) = (1, 2.2, 3.3);',
1000b8851fccSafresh1        code    => '$z = $x - $y',
1001b8851fccSafresh1    },
1002b8851fccSafresh1    'expr::arith::sub_pkg_ni' => {
1003b8851fccSafresh1        desc    => 'subtract an int and an NV and assign to a package var',
1004b8851fccSafresh1        setup   => 'my ($x,$y); ($x,$y,$z) = (1, 2.2, 3.3);',
1005b8851fccSafresh1        code    => '$z = $x - $y',
1006b8851fccSafresh1    },
1007b8851fccSafresh1
1008b8851fccSafresh1    'expr::arith::mult_lex_ii' => {
1009b8851fccSafresh1        desc    => 'multiply two integers and assign to a lexical var',
1010b8851fccSafresh1        setup   => 'my ($x,$y,$z) = 1..3;',
1011b8851fccSafresh1        code    => '$z = $x * $y',
1012b8851fccSafresh1    },
1013b8851fccSafresh1    'expr::arith::mult_pkg_ii' => {
1014b8851fccSafresh1        desc    => 'multiply two integers and assign to a package var',
1015b8851fccSafresh1        setup   => 'my ($x,$y) = 1..2; $z = 3;',
1016b8851fccSafresh1        code    => '$z = $x * $y',
1017b8851fccSafresh1    },
1018b8851fccSafresh1    'expr::arith::mult_lex_nn' => {
1019b8851fccSafresh1        desc    => 'multiply two NVs and assign to a lexical var',
1020b8851fccSafresh1        setup   => 'my ($x,$y,$z) = (1.1, 2.2, 3.3);',
1021b8851fccSafresh1        code    => '$z = $x * $y',
1022b8851fccSafresh1    },
1023b8851fccSafresh1    'expr::arith::mult_pkg_nn' => {
1024b8851fccSafresh1        desc    => 'multiply two NVs and assign to a package var',
1025b8851fccSafresh1        setup   => 'my ($x,$y); ($x,$y,$z) = (1.1, 2.2, 3.3);',
1026b8851fccSafresh1        code    => '$z = $x * $y',
1027b8851fccSafresh1    },
1028b8851fccSafresh1    'expr::arith::mult_lex_ni' => {
1029b8851fccSafresh1        desc    => 'multiply an int and an NV and assign to a lexical var',
1030b8851fccSafresh1        setup   => 'my ($x,$y,$z) = (1, 2.2, 3.3);',
1031b8851fccSafresh1        code    => '$z = $x * $y',
1032b8851fccSafresh1    },
1033b8851fccSafresh1    'expr::arith::mult_pkg_ni' => {
1034b8851fccSafresh1        desc    => 'multiply an int and an NV and assign to a package var',
1035b8851fccSafresh1        setup   => 'my ($x,$y); ($x,$y,$z) = (1, 2.2, 3.3);',
1036b8851fccSafresh1        code    => '$z = $x * $y',
1037b8851fccSafresh1    },
1038b8851fccSafresh1
10395759b3d2Safresh1    # use '!' to test SvTRUE on various classes of value
10405759b3d2Safresh1
10415759b3d2Safresh1    'expr::arith::not_PL_undef' => {
10425759b3d2Safresh1        desc    => '!undef (using PL_sv_undef)',
10435759b3d2Safresh1        setup   => 'my $x',
10445759b3d2Safresh1        code    => '$x = !undef',
10455759b3d2Safresh1    },
10465759b3d2Safresh1    'expr::arith::not_PL_no' => {
10475759b3d2Safresh1        desc    => '!($x == $y) (using PL_sv_no)',
10485759b3d2Safresh1        setup   => 'my ($x, $y) = (1,2); my $z;',
10495759b3d2Safresh1        code    => '$z = !($x == $y)',
10505759b3d2Safresh1    },
10515759b3d2Safresh1    'expr::arith::not_PL_zero' => {
10525759b3d2Safresh1        desc    => '!%h (using PL_sv_zero)',
10535759b3d2Safresh1        setup   => 'my ($x, %h)',
10545759b3d2Safresh1        code    => '$x = !%h',
10555759b3d2Safresh1    },
10565759b3d2Safresh1    'expr::arith::not_PL_yes' => {
10575759b3d2Safresh1        desc    => '!($x == $y) (using PL_sv_yes)',
10585759b3d2Safresh1        setup   => 'my ($x, $y) = (1,1); my $z;',
10595759b3d2Safresh1        code    => '$z = !($x == $y)',
10605759b3d2Safresh1    },
10615759b3d2Safresh1    'expr::arith::not_undef' => {
10625759b3d2Safresh1        desc    => '!$y where $y is undef',
10635759b3d2Safresh1        setup   => 'my ($x, $y)',
10645759b3d2Safresh1        code    => '$x = !$y',
10655759b3d2Safresh1    },
10665759b3d2Safresh1    'expr::arith::not_0' => {
10675759b3d2Safresh1        desc    => '!$x where $x is 0',
10685759b3d2Safresh1        setup   => 'my ($x, $y) = (0, 0)',
10695759b3d2Safresh1        code    => '$y = !$x',
10705759b3d2Safresh1    },
10715759b3d2Safresh1    'expr::arith::not_1' => {
10725759b3d2Safresh1        desc    => '!$x where $x is 1',
10735759b3d2Safresh1        setup   => 'my ($x, $y) = (1, 0)',
10745759b3d2Safresh1        code    => '$y = !$x',
10755759b3d2Safresh1    },
10765759b3d2Safresh1    'expr::arith::not_string' => {
10775759b3d2Safresh1        desc    => '!$x where $x is "foo"',
10785759b3d2Safresh1        setup   => 'my ($x, $y) = ("foo", 0)',
10795759b3d2Safresh1        code    => '$y = !$x',
10805759b3d2Safresh1    },
10815759b3d2Safresh1    'expr::arith::not_ref' => {
10825759b3d2Safresh1        desc    => '!$x where $s is an array ref',
10835759b3d2Safresh1        setup   => 'my ($x, $y) = ([], 0)',
10845759b3d2Safresh1        code    => '$y = !$x',
10855759b3d2Safresh1    },
10865759b3d2Safresh1
1087b8851fccSafresh1    'expr::arith::preinc' => {
1088b8851fccSafresh1        setup   => 'my $x = 1;',
1089b8851fccSafresh1        code    => '++$x',
1090b8851fccSafresh1    },
1091b8851fccSafresh1    'expr::arith::predec' => {
1092b8851fccSafresh1        setup   => 'my $x = 1;',
1093b8851fccSafresh1        code    => '--$x',
1094b8851fccSafresh1    },
1095b8851fccSafresh1    'expr::arith::postinc' => {
1096b8851fccSafresh1        desc    => '$x++',
1097b8851fccSafresh1        setup   => 'my $x = 1; my $y',
1098b8851fccSafresh1        code    => '$y = $x++', # scalar context so not optimised to ++$x
1099b8851fccSafresh1    },
1100b8851fccSafresh1    'expr::arith::postdec' => {
1101b8851fccSafresh1        desc    => '$x--',
1102b8851fccSafresh1        setup   => 'my $x = 1; my $y',
1103b8851fccSafresh1        code    => '$y = $x--', # scalar context so not optimised to --$x
1104b8851fccSafresh1    },
1105b8851fccSafresh1
11065759b3d2Safresh1
11075759b3d2Safresh1    # concatenation; quite possibly optimised to OP_MULTICONCAT
11085759b3d2Safresh1
11095759b3d2Safresh1    'expr::concat::cl' => {
11105759b3d2Safresh1        setup   => 'my $lex = "abcd"',
11115759b3d2Safresh1        code    => '"foo" . $lex',
11125759b3d2Safresh1    },
11135759b3d2Safresh1    'expr::concat::lc' => {
11145759b3d2Safresh1        setup   => 'my $lex = "abcd"',
11155759b3d2Safresh1        code    => '$lex . "foo"',
11165759b3d2Safresh1    },
11175759b3d2Safresh1    'expr::concat::ll' => {
11185759b3d2Safresh1        setup   => 'my $lex1 = "abcd";  my $lex2 = "wxyz"',
11195759b3d2Safresh1        code    => '$lex1 . $lex2',
11205759b3d2Safresh1    },
11215759b3d2Safresh1
11225759b3d2Safresh1    'expr::concat::l_append_c' => {
11235759b3d2Safresh1        setup   => 'my $lex',
11245759b3d2Safresh1        pre     => '$lex = "abcd"',
11255759b3d2Safresh1        code    => '$lex .= "foo"',
11265759b3d2Safresh1    },
11275759b3d2Safresh1    'expr::concat::l_append_l' => {
11285759b3d2Safresh1        setup   => 'my $lex1;  my $lex2 = "wxyz"',
11295759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11305759b3d2Safresh1        code    => '$lex1 .= $lex2',
11315759b3d2Safresh1    },
11325759b3d2Safresh1    'expr::concat::l_append_ll' => {
11335759b3d2Safresh1        setup   => 'my $lex1; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
11345759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11355759b3d2Safresh1        code    => '$lex1 .= $lex2 . $lex3',
11365759b3d2Safresh1    },
11375759b3d2Safresh1    'expr::concat::l_append_clclc' => {
11385759b3d2Safresh1        setup   => 'my $lex1; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
11395759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11405759b3d2Safresh1        code    => '$lex1 .= "-foo-$lex2-foo-$lex3-foo"',
11415759b3d2Safresh1    },
11425759b3d2Safresh1    'expr::concat::l_append_lll' => {
11435759b3d2Safresh1        setup   => 'my $lex1; my ($lex2, $lex3, $lex4) = qw(pqrs wxyz 1234)',
11445759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11455759b3d2Safresh1        code    => '$lex1 .= $lex2 . $lex3 . $lex4',
11465759b3d2Safresh1    },
11475759b3d2Safresh1
11485759b3d2Safresh1    'expr::concat::m_ll' => {
11495759b3d2Safresh1        setup   => 'my $lex1 = "abcd";  my $lex2 = "wxyz"',
11505759b3d2Safresh1        code    => 'my $lex = $lex1 . $lex2',
11515759b3d2Safresh1    },
11525759b3d2Safresh1    'expr::concat::m_lll' => {
11535759b3d2Safresh1        setup   => 'my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
11545759b3d2Safresh1        code    => 'my $lex = $lex1 . $lex2 . $lex3',
11555759b3d2Safresh1    },
11565759b3d2Safresh1    'expr::concat::m_cl' => {
11575759b3d2Safresh1        setup   => 'my $lex1 = "abcd"',
11585759b3d2Safresh1        code    => 'my $lex = "const$lex1"',
11595759b3d2Safresh1    },
11605759b3d2Safresh1    'expr::concat::m_clclc' => {
11615759b3d2Safresh1        setup   => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
11625759b3d2Safresh1        code    => 'my $lex = "foo=$lex1 bar=$lex2\n"',
11635759b3d2Safresh1    },
11645759b3d2Safresh1    'expr::concat::m_clclc_long' => {
11655759b3d2Safresh1        desc    => 'my $lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars',
11665759b3d2Safresh1        setup   => 'my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100',
11675759b3d2Safresh1        code    => 'my $lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"',
11685759b3d2Safresh1    },
11695759b3d2Safresh1
11705759b3d2Safresh1    'expr::concat::l_ll' => {
11715759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd";  my $lex2 = "wxyz"',
11725759b3d2Safresh1        code    => '$lex = $lex1 . $lex2',
11735759b3d2Safresh1    },
11745759b3d2Safresh1    'expr::concat::l_ll_ldup' => {
11755759b3d2Safresh1        setup   => 'my $lex1; my $lex2 = "wxyz"',
11765759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11775759b3d2Safresh1        code    => '$lex1 = $lex1 . $lex2',
11785759b3d2Safresh1    },
11795759b3d2Safresh1    'expr::concat::l_ll_rdup' => {
11805759b3d2Safresh1        setup   => 'my $lex1; my $lex2 = "wxyz"',
11815759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11825759b3d2Safresh1        code    => '$lex1 = $lex2 . $lex1',
11835759b3d2Safresh1    },
11845759b3d2Safresh1    'expr::concat::l_ll_lrdup' => {
11855759b3d2Safresh1        setup   => 'my $lex1',
11865759b3d2Safresh1        pre     => '$lex1 = "abcd"',
11875759b3d2Safresh1        code    => '$lex1 = $lex1 . $lex1',
11885759b3d2Safresh1    },
11895759b3d2Safresh1    'expr::concat::l_lll' => {
11905759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
11915759b3d2Safresh1        code    => '$lex = $lex1 . $lex2 . $lex3',
11925759b3d2Safresh1    },
11935759b3d2Safresh1    'expr::concat::l_lllll' => {
11945759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"; my $lex4 = "the quick brown fox"; my $lex5 = "to be, or not to be..."',
11955759b3d2Safresh1        code    => '$lex = $lex1 . $lex2 . $lex3 . $lex4 . $lex5',
11965759b3d2Safresh1    },
11975759b3d2Safresh1    'expr::concat::l_cl' => {
11985759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"',
11995759b3d2Safresh1        code    => '$lex = "const$lex1"',
12005759b3d2Safresh1    },
12015759b3d2Safresh1    'expr::concat::l_clclc' => {
12025759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
12035759b3d2Safresh1        code    => '$lex = "foo=$lex1 bar=$lex2\n"',
12045759b3d2Safresh1    },
12055759b3d2Safresh1    'expr::concat::l_clclc_long' => {
12065759b3d2Safresh1        desc    => '$lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars',
12075759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100',
12085759b3d2Safresh1        code    => '$lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"',
12095759b3d2Safresh1    },
12105759b3d2Safresh1    'expr::concat::l_clclclclclc' => {
12115759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "the quick brown fox"; my $lex4 = "to be, or not to be..."',
12125759b3d2Safresh1        code    => '$lex = "foo1=$lex1 foo2=$lex2 foo3=$lex3 foo4=$lex4\n"',
12135759b3d2Safresh1    },
12145759b3d2Safresh1
12155759b3d2Safresh1    'expr::concat::g_append_c' => {
12165759b3d2Safresh1        setup   => 'our $pkg',
12175759b3d2Safresh1        pre     => '$pkg = "abcd"',
12185759b3d2Safresh1        code    => '$pkg .= "foo"',
12195759b3d2Safresh1    },
12205759b3d2Safresh1    'expr::concat::g_append_l' => {
12215759b3d2Safresh1        setup   => 'our $pkg;  my $lex1 = "wxyz"',
12225759b3d2Safresh1        pre     => '$pkg = "abcd"',
12235759b3d2Safresh1        code    => '$pkg .= $lex1',
12245759b3d2Safresh1    },
12255759b3d2Safresh1    'expr::concat::g_append_ll' => {
12265759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "pqrs"; my $lex2 = "wxyz"',
12275759b3d2Safresh1        pre     => '$pkg = "abcd"',
12285759b3d2Safresh1        code    => '$pkg .= $lex1 . $lex2',
12295759b3d2Safresh1    },
12305759b3d2Safresh1    'expr::concat::g_append_clclc' => {
12315759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "pqrs"; my $lex2 = "wxyz"',
12325759b3d2Safresh1        pre     => '$pkg = "abcd"',
12335759b3d2Safresh1        code    => '$pkg .= "-foo-$lex1-foo-$lex2-foo-"',
12345759b3d2Safresh1    },
12355759b3d2Safresh1
12365759b3d2Safresh1    'expr::concat::g_ll' => {
12375759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd";  my $lex2 = "wxyz"',
12385759b3d2Safresh1        code    => '$pkg = $lex1 . $lex2',
12395759b3d2Safresh1    },
12405759b3d2Safresh1    'expr::concat::g_gl_ldup' => {
12415759b3d2Safresh1        setup   => 'our $pkg;  my $lex2 = "wxyz"',
12425759b3d2Safresh1        pre     => '$pkg = "abcd"',
12435759b3d2Safresh1        code    => '$pkg = $pkg . $lex2',
12445759b3d2Safresh1    },
12455759b3d2Safresh1    'expr::concat::g_lg_rdup' => {
12465759b3d2Safresh1        setup   => 'our $pkg;  my $lex1 = "wxyz"',
12475759b3d2Safresh1        pre     => '$pkg = "abcd"',
12485759b3d2Safresh1        code    => '$pkg = $lex1 . $pkg',
12495759b3d2Safresh1    },
12505759b3d2Safresh1    'expr::concat::g_gg_lrdup' => {
12515759b3d2Safresh1        setup   => 'our $pkg',
12525759b3d2Safresh1        pre     => '$pkg = "abcd"',
12535759b3d2Safresh1        code    => '$pkg = $pkg . $pkg',
12545759b3d2Safresh1    },
12555759b3d2Safresh1    'expr::concat::g_lll' => {
12565759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"',
12575759b3d2Safresh1        code    => '$pkg = $lex1 . $lex2 . $lex3',
12585759b3d2Safresh1    },
12595759b3d2Safresh1    'expr::concat::g_cl' => {
12605759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"',
12615759b3d2Safresh1        code    => '$pkg = "const$lex1"',
12625759b3d2Safresh1    },
12635759b3d2Safresh1    'expr::concat::g_clclc' => {
12645759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
12655759b3d2Safresh1        code    => '$pkg = "foo=$lex1 bar=$lex2\n"',
12665759b3d2Safresh1    },
12675759b3d2Safresh1    'expr::concat::g_clclc_long' => {
12685759b3d2Safresh1        desc    => '$pkg = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars',
12695759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100',
12705759b3d2Safresh1        code    => '$pkg = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"',
12715759b3d2Safresh1    },
12725759b3d2Safresh1
12735759b3d2Safresh1    'expr::concat::utf8_uuu' => {
12745759b3d2Safresh1        desc    => 'my $s = $a.$b.$c where all args are utf8',
12755759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"',
12765759b3d2Safresh1        code    => '$s = $a.$b.$c',
12775759b3d2Safresh1    },
12785759b3d2Safresh1    'expr::concat::utf8_suu' => {
12795759b3d2Safresh1        desc    => 'my $s = "foo=$a bar=$b baz=$c" where $b,$c are utf8',
12805759b3d2Safresh1        setup   => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"',
12815759b3d2Safresh1        code    => '$s = "foo=$a bar=$b baz=$c"',
12825759b3d2Safresh1    },
12835759b3d2Safresh1    'expr::concat::utf8_usu' => {
12845759b3d2Safresh1        desc    => 'my $s = "foo=$a bar=$b baz=$c" where $a,$c are utf8',
12855759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
12865759b3d2Safresh1        code    => '$s = "foo=$a bar=$b baz=$c"',
12875759b3d2Safresh1    },
12885759b3d2Safresh1    'expr::concat::utf8_usx' => {
12895759b3d2Safresh1        desc    => 'my $s = "foo=$a bar=$b baz=$c" where $a is utf8, $c has 0x80',
12905759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"',
12915759b3d2Safresh1        code    => '$s = "foo=$a bar=$b baz=$c"',
12925759b3d2Safresh1    },
12935759b3d2Safresh1
12945759b3d2Safresh1    'expr::concat::utf8_s_append_uuu' => {
12955759b3d2Safresh1        desc    => '$s .= $a.$b.$c where all RH args are utf8',
12965759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"',
12975759b3d2Safresh1        pre     => '$s = "abcd"',
12985759b3d2Safresh1        code    => '$s .= $a.$b.$c',
12995759b3d2Safresh1    },
13005759b3d2Safresh1    'expr::concat::utf8_s_append_suu' => {
13015759b3d2Safresh1        desc    => '$s .= "foo=$a bar=$b baz=$c" where $b,$c are utf8',
13025759b3d2Safresh1        setup   => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"',
13035759b3d2Safresh1        pre     => '$s = "abcd"',
13045759b3d2Safresh1        code    => '$s .= "foo=$a bar=$b baz=$c"',
13055759b3d2Safresh1    },
13065759b3d2Safresh1    'expr::concat::utf8_s_append_usu' => {
13075759b3d2Safresh1        desc    => '$s .= "foo=$a bar=$b baz=$c" where $a,$c are utf8',
13085759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
13095759b3d2Safresh1        pre     => '$s = "abcd"',
13105759b3d2Safresh1        code    => '$s .= "foo=$a bar=$b baz=$c"',
13115759b3d2Safresh1    },
13125759b3d2Safresh1    'expr::concat::utf8_s_append_usx' => {
13135759b3d2Safresh1        desc    => '$s .= "foo=$a bar=$b baz=$c" where $a is utf8, $c has 0x80',
13145759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"',
13155759b3d2Safresh1        pre     => '$s = "abcd"',
13165759b3d2Safresh1        code    => '$s .= "foo=$a bar=$b baz=$c"',
13175759b3d2Safresh1    },
13185759b3d2Safresh1
13195759b3d2Safresh1    'expr::concat::utf8_u_append_uuu' => {
13205759b3d2Safresh1        desc    => '$s .= $a.$b.$c where all args are utf8',
13215759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"',
13225759b3d2Safresh1        pre     => '$s = "\x{100}wxyz"',
13235759b3d2Safresh1        code    => '$s .= $a.$b.$c',
13245759b3d2Safresh1    },
13255759b3d2Safresh1    'expr::concat::utf8_u_append_suu' => {
13265759b3d2Safresh1        desc    => '$s .= "foo=$a bar=$b baz=$c" where $s,$b,$c are utf8',
13275759b3d2Safresh1        setup   => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"',
13285759b3d2Safresh1        pre     => '$s = "\x{100}wxyz"',
13295759b3d2Safresh1        code    => '$s .= "foo=$a bar=$b baz=$c"',
13305759b3d2Safresh1    },
13315759b3d2Safresh1    'expr::concat::utf8_u_append_usu' => {
13325759b3d2Safresh1        desc    => '$s .= "foo=$a bar=$b baz=$c" where $s,$a,$c are utf8',
13335759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
13345759b3d2Safresh1        pre     => '$s = "\x{100}wxyz"',
13355759b3d2Safresh1        code    => '$s .= "foo=$a bar=$b baz=$c"',
13365759b3d2Safresh1    },
13375759b3d2Safresh1    'expr::concat::utf8_u_append_usx' => {
13385759b3d2Safresh1        desc    => '$s .= "foo=$a bar=$b baz=$c" where $s,$a are utf8, $c has 0x80',
13395759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"',
13405759b3d2Safresh1        pre     => '$s = "\x{100}wxyz"',
13415759b3d2Safresh1        code    => '$s .= "foo=$a bar=$b baz=$c"',
13425759b3d2Safresh1    },
13435759b3d2Safresh1
13445759b3d2Safresh1    'expr::concat::nested_mutator' => {
13455759b3d2Safresh1        setup   => 'my $lex1; my ($lex2, $lex3, $lex4) = qw(abcd pqrs wxyz)',
13465759b3d2Safresh1        pre     => '$lex1 = "QPR"',
13475759b3d2Safresh1        code    => '(($lex1 .= $lex2) .= $lex3) .= $lex4',
13485759b3d2Safresh1    },
13495759b3d2Safresh1
13505759b3d2Safresh1
1351*3d61058aSafresh1    # concatenation with magic vars;
1352*3d61058aSafresh1    # quite possibly optimised to OP_MULTICONCAT
1353*3d61058aSafresh1
1354*3d61058aSafresh1    'expr::concat::mg::cM' => {
1355*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/',
1356*3d61058aSafresh1        code    => '"foo" . $1',
1357*3d61058aSafresh1    },
1358*3d61058aSafresh1    'expr::concat::mg::Mc' => {
1359*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/',
1360*3d61058aSafresh1        code    => '$1 . "foo"',
1361*3d61058aSafresh1    },
1362*3d61058aSafresh1    'expr::concat::mg::MM' => {
1363*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/',
1364*3d61058aSafresh1        code    => '$1 . $1',
1365*3d61058aSafresh1    },
1366*3d61058aSafresh1
1367*3d61058aSafresh1    'expr::concat::mg::l_append_M' => {
1368*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1369*3d61058aSafresh1        pre     => '$lex = "abcd"',
1370*3d61058aSafresh1        code    => '$lex .= $1',
1371*3d61058aSafresh1    },
1372*3d61058aSafresh1    'expr::concat::mg::l_append_MM' => {
1373*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1374*3d61058aSafresh1        pre     => '$lex = "abcd"',
1375*3d61058aSafresh1        code    => '$lex .= $1 .$1',
1376*3d61058aSafresh1    },
1377*3d61058aSafresh1    'expr::concat::mg::l_append_cMcMc' => {
1378*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1379*3d61058aSafresh1        pre     => '$lex = "abcd"',
1380*3d61058aSafresh1        code    => '$lex .= "-foo-$1-foo-$1-foo"',
1381*3d61058aSafresh1    },
1382*3d61058aSafresh1    'expr::concat::mg::l_append_MMM' => {
1383*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1384*3d61058aSafresh1        pre     => '$lex = "abcd"',
1385*3d61058aSafresh1        code    => '$lex .= $1 .$1 . $1',
1386*3d61058aSafresh1    },
1387*3d61058aSafresh1
1388*3d61058aSafresh1    'expr::concat::mg::m_MM' => {
1389*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/;',
1390*3d61058aSafresh1        code    => 'my $lex = $1 . $1',
1391*3d61058aSafresh1    },
1392*3d61058aSafresh1    'expr::concat::mg::m_MMM' => {
1393*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/;',
1394*3d61058aSafresh1        code    => 'my $lex = $1 . $1 . $1',
1395*3d61058aSafresh1    },
1396*3d61058aSafresh1    'expr::concat::mg::m_cL' => {
1397*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/;',
1398*3d61058aSafresh1        code    => 'my $lex = "const$1"',
1399*3d61058aSafresh1    },
1400*3d61058aSafresh1    'expr::concat::mg::m_cMcMc' => {
1401*3d61058aSafresh1        setup   => '"abcd" =~ /(.*)/;',
1402*3d61058aSafresh1        code    => 'my $lex = "foo=$1 bar=$1\n"',
1403*3d61058aSafresh1    },
1404*3d61058aSafresh1    'expr::concat::mg::m_cMcMc_long' => {
1405*3d61058aSafresh1        desc    => 'my $lex = "foooooooooo=$1 baaaaaaaaar=$1\n" where $1 is 400 chars',
1406*3d61058aSafresh1        setup   => 'my $s = "abcd" x 100; $s =~ /(.*)/;',
1407*3d61058aSafresh1        code    => 'my $lex = "foooooooooo=$1 baaaaaaaaar=$1\n"',
1408*3d61058aSafresh1    },
1409*3d61058aSafresh1
1410*3d61058aSafresh1    'expr::concat::mg::l_MM' => {
1411*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1412*3d61058aSafresh1        code    => '$lex = $1 . $1',
1413*3d61058aSafresh1    },
1414*3d61058aSafresh1    'expr::concat::mg::l_lM_ldup' => {
1415*3d61058aSafresh1        setup   => 'my $lex1; "abcd" =~ /(.*)/;',
1416*3d61058aSafresh1        pre     => '$lex1 = "abcd"',
1417*3d61058aSafresh1        code    => '$lex1 = $lex1 . $1',
1418*3d61058aSafresh1    },
1419*3d61058aSafresh1    'expr::concat::mg::l_Ml_rdup' => {
1420*3d61058aSafresh1        setup   => 'my $lex1; "abcd" =~ /(.*)/;',
1421*3d61058aSafresh1        pre     => '$lex1 = "abcd"',
1422*3d61058aSafresh1        code    => '$lex1 = $1 . $lex1',
1423*3d61058aSafresh1    },
1424*3d61058aSafresh1    'expr::concat::mg::l_MMM' => {
1425*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1426*3d61058aSafresh1        code    => '$lex = $1 . $1 . $1',
1427*3d61058aSafresh1    },
1428*3d61058aSafresh1    'expr::concat::mg::l_MMMMM' => {
1429*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1430*3d61058aSafresh1        code    => '$lex = $1 . $1 . $1 . $1 . $1',
1431*3d61058aSafresh1    },
1432*3d61058aSafresh1    'expr::concat::mg::l_cM' => {
1433*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1434*3d61058aSafresh1        code    => '$lex = "const$1"',
1435*3d61058aSafresh1    },
1436*3d61058aSafresh1    'expr::concat::mg::l_cMcMc' => {
1437*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1438*3d61058aSafresh1        code    => '$lex = "foo=$1 bar=$1\n"',
1439*3d61058aSafresh1    },
1440*3d61058aSafresh1    'expr::concat::mg::l_cMcMc_long' => {
1441*3d61058aSafresh1        desc    => '$lex = "foooooooooo=$1 baaaaaaaaar=$1\n" where $1 is 400 chars',
1442*3d61058aSafresh1        setup   => 'my $s = "abcd" x 100; $s =~ /(.*)/;',
1443*3d61058aSafresh1        code    => '$lex = "foooooooooo=$1 baaaaaaaaar=$1\n"',
1444*3d61058aSafresh1    },
1445*3d61058aSafresh1    'expr::concat::mg::l_cMcMcMcMcMc' => {
1446*3d61058aSafresh1        setup   => 'my $lex; "abcd" =~ /(.*)/;',
1447*3d61058aSafresh1        code    => '$lex = "foo1=$1 foo2=$1 foo3=$1 foo4=$1\n"',
1448*3d61058aSafresh1    },
1449*3d61058aSafresh1
1450*3d61058aSafresh1    'expr::concat::mg::g_append_M' => {
1451*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1452*3d61058aSafresh1        pre     => '$pkg = "abcd"',
1453*3d61058aSafresh1        code    => '$pkg .= $1',
1454*3d61058aSafresh1    },
1455*3d61058aSafresh1    'expr::concat::mg::g_append_MM' => {
1456*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1457*3d61058aSafresh1        pre     => '$pkg = "abcd"',
1458*3d61058aSafresh1        code    => '$pkg .= $1',
1459*3d61058aSafresh1        code    => '$pkg .= $1 . $1',
1460*3d61058aSafresh1    },
1461*3d61058aSafresh1    'expr::concat::mg::g_append_cMcMc' => {
1462*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1463*3d61058aSafresh1        pre     => '$pkg = "abcd"',
1464*3d61058aSafresh1        code    => '$pkg .= "-foo-$1-foo-$1-foo-"',
1465*3d61058aSafresh1    },
1466*3d61058aSafresh1
1467*3d61058aSafresh1    'expr::concat::mg::g_MM' => {
1468*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1469*3d61058aSafresh1        code    => '$pkg = $1 . $1',
1470*3d61058aSafresh1    },
1471*3d61058aSafresh1    'expr::concat::mg::g_gM_ldup' => {
1472*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1473*3d61058aSafresh1        pre     => '$pkg = "abcd"',
1474*3d61058aSafresh1        code    => '$pkg = $pkg . $1',
1475*3d61058aSafresh1    },
1476*3d61058aSafresh1    'expr::concat::mg::g_Mg_rdup' => {
1477*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1478*3d61058aSafresh1        pre     => '$pkg = "abcd"',
1479*3d61058aSafresh1        code    => '$pkg = $1 . $pkg',
1480*3d61058aSafresh1    },
1481*3d61058aSafresh1    'expr::concat::mg::g_MMM' => {
1482*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1483*3d61058aSafresh1        code    => '$pkg = $1 . $1 . $1',
1484*3d61058aSafresh1    },
1485*3d61058aSafresh1    'expr::concat::mg::g_cM' => {
1486*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1487*3d61058aSafresh1        code    => '$pkg = "const$1"',
1488*3d61058aSafresh1    },
1489*3d61058aSafresh1    'expr::concat::mg::g_cMcMc' => {
1490*3d61058aSafresh1        setup   => 'our $pkg; "abcd" =~ /(.*)/;',
1491*3d61058aSafresh1        code    => '$pkg = "foo=$1 bar=$1\n"',
1492*3d61058aSafresh1    },
1493*3d61058aSafresh1    'expr::concat::mg::g_cMcMc_long' => {
1494*3d61058aSafresh1        desc    => '$lex = "foooooooooo=$1 baaaaaaaaar=$1\n" where $1 is 400 chars',
1495*3d61058aSafresh1        setup   => 'our $pkg; my $s = "abcd" x 100; $s =~ /(.*)/;',
1496*3d61058aSafresh1        code    => '$pkg = "foooooooooo=$1 baaaaaaaaar=$1\n"',
1497*3d61058aSafresh1    },
1498*3d61058aSafresh1
1499*3d61058aSafresh1    'expr::concat::mg::utf8_uuu' => {
1500*3d61058aSafresh1        desc    => 'my $s = $1.$1.$1 where $1 utf8',
1501*3d61058aSafresh1        setup   => 'my $s; "ab\x{100}cde" =~ /(.*)/;',
1502*3d61058aSafresh1        code    => '$s = $1.$1.$1',
1503*3d61058aSafresh1    },
1504*3d61058aSafresh1    'expr::concat::mg::utf8_suu' => {
1505*3d61058aSafresh1        desc    => 'my $s = "foo=$a bar=$1 baz=$1" where $1 is utf8',
1506*3d61058aSafresh1        setup   => 'my $s; my $a = "abcde"; "ab\x{100}cde" =~ /(.*)/;',
1507*3d61058aSafresh1        code    => '$s = "foo=$a bar=$1 baz=$1"',
1508*3d61058aSafresh1    },
1509*3d61058aSafresh1
1510*3d61058aSafresh1    # OP_MULTICONCAT with magic within s///g - see GH #21360
1511*3d61058aSafresh1
1512*3d61058aSafresh1    'expr::concat::mg::subst1_1' => {
1513*3d61058aSafresh1        desc    => 's/(.)/$1-/g, 1 iteration',
1514*3d61058aSafresh1        pre     => '$_  = "a"',
1515*3d61058aSafresh1        code    => 's/(.)/$1-/g',
1516*3d61058aSafresh1    },
1517*3d61058aSafresh1
1518*3d61058aSafresh1    'expr::concat::mg::subst1_2' => {
1519*3d61058aSafresh1        desc    => 's/(.)/$1-/g, 2 iterations',
1520*3d61058aSafresh1        pre     => '$_  = "aa"',
1521*3d61058aSafresh1        code    => 's/(.)/$1-/g',
1522*3d61058aSafresh1    },
1523*3d61058aSafresh1
1524*3d61058aSafresh1    'expr::concat::mg::subst1_5' => {
1525*3d61058aSafresh1        desc    => 's/(.)/$1-/g, 5 iterations',
1526*3d61058aSafresh1        pre     => '$_  = "aaaaa"',
1527*3d61058aSafresh1        code    => 's/(.)/$1-/g',
1528*3d61058aSafresh1    },
1529*3d61058aSafresh1
1530*3d61058aSafresh1    'expr::concat::mg::subst2_1' => {
1531*3d61058aSafresh1        desc    => 's/(.)/$1-$1/g, 1 iteration',
1532*3d61058aSafresh1        pre     => '$_  = "a"',
1533*3d61058aSafresh1        code    => 's/(.)/$1-/g',
1534*3d61058aSafresh1    },
1535*3d61058aSafresh1
1536*3d61058aSafresh1    'expr::concat::mg::subst3_1' => {
1537*3d61058aSafresh1        desc    => 's/(.)/$1-$1-$1/g, 1 iteration',
1538*3d61058aSafresh1        pre     => '$_  = "a"',
1539*3d61058aSafresh1        code    => 's/(.)/$1-$1-$1/g',
1540*3d61058aSafresh1    },
1541*3d61058aSafresh1
1542*3d61058aSafresh1
1543*3d61058aSafresh1
15445759b3d2Safresh1    # scalar assign, OP_SASSIGN
15455759b3d2Safresh1
1546e0680481Safresh1    'expr::sassign::undef_lex' => {
1547e0680481Safresh1        setup   => 'my $x',
1548e0680481Safresh1        code    => '$x = undef',
1549e0680481Safresh1    },
1550e0680481Safresh1    'expr::sassign::undef_lex_direc' => {
1551e0680481Safresh1        setup   => 'my $x',
1552e0680481Safresh1        code    => 'undef $x',
1553e0680481Safresh1    },
1554e0680481Safresh1    'expr::sassign::undef_my_lex' => {
1555e0680481Safresh1        setup   => '',
1556e0680481Safresh1        code    => 'my $x = undef',
1557e0680481Safresh1    },
1558e0680481Safresh1    'expr::sassign::undef_my_lex_direc' => {
1559e0680481Safresh1        setup   => '',
1560e0680481Safresh1        code    => 'undef my $x',
1561e0680481Safresh1    },
1562e0680481Safresh1
1563e0680481Safresh1    'expr::sassign::anonlist' => {
1564e0680481Safresh1        setup   => '',
1565e0680481Safresh1        code => '$x = []'
1566e0680481Safresh1    },
1567e0680481Safresh1    'expr::sassign::anonlist_lex' => {
1568e0680481Safresh1        setup   => 'my $x',
1569e0680481Safresh1        code => '$x = []'
1570e0680481Safresh1    },
1571e0680481Safresh1    'expr::sassign::my_anonlist_lex' => {
1572e0680481Safresh1        setup   => '',
1573e0680481Safresh1        code => 'my $x = []'
1574e0680481Safresh1    },
1575e0680481Safresh1    'expr::sassign::anonhash' => {
1576e0680481Safresh1        setup   => '',
1577e0680481Safresh1        code => '$x = {}'
1578e0680481Safresh1    },
1579e0680481Safresh1    'expr::sassign::anonhash_lex' => {
1580e0680481Safresh1        setup   => 'my $x',
1581e0680481Safresh1        code => '$x = {}'
1582e0680481Safresh1    },
1583e0680481Safresh1    'expr::sassign::my_anonhash_lex' => {
1584e0680481Safresh1        setup   => '',
1585e0680481Safresh1        code => 'my $x = {}'
1586e0680481Safresh1    },
15875759b3d2Safresh1
15885759b3d2Safresh1    'expr::sassign::my_conststr' => {
15895759b3d2Safresh1        setup   => '',
15905759b3d2Safresh1        code    => 'my $x = "abc"',
15915759b3d2Safresh1    },
15925759b3d2Safresh1    'expr::sassign::scalar_lex_int' => {
15935759b3d2Safresh1        desc    => 'lexical $x = 1',
15945759b3d2Safresh1        setup   => 'my $x',
15955759b3d2Safresh1        code    => '$x = 1',
15965759b3d2Safresh1    },
15975759b3d2Safresh1    'expr::sassign::scalar_lex_str' => {
15985759b3d2Safresh1        desc    => 'lexical $x = "abc"',
15995759b3d2Safresh1        setup   => 'my $x',
16005759b3d2Safresh1        code    => '$x = "abc"',
16015759b3d2Safresh1    },
16025759b3d2Safresh1    'expr::sassign::scalar_lex_strint' => {
16035759b3d2Safresh1        desc    => 'lexical $x = 1 where $x was previously a string',
16045759b3d2Safresh1        setup   => 'my $x = "abc"',
16055759b3d2Safresh1        code    => '$x = 1',
16065759b3d2Safresh1    },
16075759b3d2Safresh1    'expr::sassign::scalar_lex_intstr' => {
16085759b3d2Safresh1        desc    => 'lexical $x = "abc" where $x was previously an int',
16095759b3d2Safresh1        setup   => 'my $x = 1;',
16105759b3d2Safresh1        code    => '$x = "abc"',
16115759b3d2Safresh1    },
16125759b3d2Safresh1    'expr::sassign::lex_rv' => {
16135759b3d2Safresh1        desc    => 'lexical $ref1 = $ref2;',
16145759b3d2Safresh1        setup   => 'my $r1 = []; my $r = $r1;',
16155759b3d2Safresh1        code    => '$r = $r1;',
16165759b3d2Safresh1    },
16175759b3d2Safresh1    'expr::sassign::lex_rv1' => {
16185759b3d2Safresh1        desc    => 'lexical $ref1 = $ref2; where $$ref1 gets freed',
16195759b3d2Safresh1        setup   => 'my $r1 = []; my $r',
16205759b3d2Safresh1        code    => '$r = []; $r = $r1;',
16215759b3d2Safresh1    },
16225759b3d2Safresh1
1623e0680481Safresh1    'expr::sassign::aelemfast_lex_assign' => {
1624e0680481Safresh1        desc    => 'lexical $x[0] = 1',
1625e0680481Safresh1        setup   => 'my @x',
1626e0680481Safresh1        code    => '$x[0] = 1',
1627e0680481Safresh1    },
1628e0680481Safresh1    'expr::sassign::aelemfast_lex_assign_ref' => {
1629e0680481Safresh1        desc    => 'lexical $x[0] = []',
1630e0680481Safresh1        setup   => 'my @x',
1631e0680481Safresh1        code    => '$x[0] = []',
1632e0680481Safresh1    },
1633e0680481Safresh1    'expr::sassign::aelemfast_lex_assign_deref' => {
1634e0680481Safresh1        desc    => 'lexical $x[0][1]',
1635e0680481Safresh1        setup   => 'my @x = ([1,2])',
1636e0680481Safresh1        code    => '$x[0][1] = 1',
1637e0680481Safresh1    },
1638e0680481Safresh1
1639e0680481Safresh1    'expr::sassign::bless_lex' => {
1640e0680481Safresh1        setup   => 'my $x',
1641e0680481Safresh1        code    => '$x = bless {}, "X"'
1642e0680481Safresh1    },
16435759b3d2Safresh1
16445759b3d2Safresh1    'func::grep::bool0' => {
16455759b3d2Safresh1        desc    => 'grep returning 0 items in boolean context',
16465759b3d2Safresh1        setup   => 'my @a;',
16475759b3d2Safresh1        code    => '!grep $_, @a;',
16485759b3d2Safresh1    },
16495759b3d2Safresh1    'func::grep::bool1' => {
16505759b3d2Safresh1        desc    => 'grep returning 1 item in boolean context',
16515759b3d2Safresh1        setup   => 'my @a =(1);',
16525759b3d2Safresh1        code    => '!grep $_, @a;',
16535759b3d2Safresh1    },
16545759b3d2Safresh1    'func::grep::scalar0' => {
16555759b3d2Safresh1        desc    => 'returning 0 items in scalar context',
16565759b3d2Safresh1        setup   => 'my $g; my @a;',
16575759b3d2Safresh1        code    => '$g = grep $_, @a;',
16585759b3d2Safresh1    },
16595759b3d2Safresh1    'func::grep::scalar1' => {
16605759b3d2Safresh1        desc    => 'returning 1 item in scalar context',
16615759b3d2Safresh1        setup   => 'my $g; my @a =(1);',
16625759b3d2Safresh1        code    => '$g = grep $_, @a;',
16635759b3d2Safresh1    },
16645759b3d2Safresh1
16655759b3d2Safresh1    # (index() == -1) and variants optimise away the op_const and op_eq
16665759b3d2Safresh1    # and any assignment to a lexical var
16675759b3d2Safresh1    'func::index::bool' => {
16685759b3d2Safresh1        desc    => '(index() == -1) for match',
16695759b3d2Safresh1        setup   => 'my $x = "aaaab"',
16705759b3d2Safresh1        code    => 'index($x, "b") == -1',
16715759b3d2Safresh1    },
16725759b3d2Safresh1    'func::index::bool_fail' => {
16735759b3d2Safresh1        desc    => '(index() == -1) for no match',
16745759b3d2Safresh1        setup   => 'my $x = "aaaab"',
16755759b3d2Safresh1        code    => 'index($x, "c") == -1',
16765759b3d2Safresh1    },
16775759b3d2Safresh1    'func::index::lex_bool' => {
16785759b3d2Safresh1        desc    => '$lex = (index() == -1) for match',
16795759b3d2Safresh1        setup   => 'my $r; my $x = "aaaab"',
16805759b3d2Safresh1        code    => '$r = index($x, "b") == -1',
16815759b3d2Safresh1    },
16825759b3d2Safresh1    'func::index::lex_bool_fail' => {
16835759b3d2Safresh1        desc    => '$lex = (index() == -1) for no match',
16845759b3d2Safresh1        setup   => 'my $r; my $x = "aaaab"',
16855759b3d2Safresh1        code    => '$r = index($x, "c") == -1',
16865759b3d2Safresh1    },
16875759b3d2Safresh1
16885759b3d2Safresh1    # using a const string as second arg to index triggers using FBM.
16895759b3d2Safresh1    # the FBM matcher special-cases 1,2-byte strings.
16905759b3d2Safresh1    #
16915759b3d2Safresh1    'func::index::short_const1' => {
16925759b3d2Safresh1        desc    => 'index of a short string against a 1 char const substr',
16935759b3d2Safresh1        setup   => 'my $x = "aaaab"',
16945759b3d2Safresh1        code    => 'index $x, "b"',
16955759b3d2Safresh1    },
16965759b3d2Safresh1    'func::index::long_const1' => {
16975759b3d2Safresh1        desc    => 'index of a long string against a 1 char const substr',
16985759b3d2Safresh1        setup   => 'my $x = "a" x 1000 . "b"',
16995759b3d2Safresh1        code    => 'index $x, "b"',
17005759b3d2Safresh1    },
17015759b3d2Safresh1    'func::index::short_const2aabc_bc' => {
17025759b3d2Safresh1        desc    => 'index of a short string against a 2 char const substr',
17035759b3d2Safresh1        setup   => 'my $x = "aaaabc"',
17045759b3d2Safresh1        code    => 'index $x, "bc"',
17055759b3d2Safresh1    },
17065759b3d2Safresh1    'func::index::long_const2aabc_bc' => {
17075759b3d2Safresh1        desc    => 'index of a long string against a 2 char const substr',
17085759b3d2Safresh1        setup   => 'my $x = "a" x 1000 . "bc"',
17095759b3d2Safresh1        code    => 'index $x, "bc"',
17105759b3d2Safresh1    },
17115759b3d2Safresh1    'func::index::long_const2aa_ab' => {
17125759b3d2Safresh1        desc    => 'index of a long string aaa.. against const substr "ab"',
17135759b3d2Safresh1        setup   => 'my $x = "a" x 1000',
17145759b3d2Safresh1        code    => 'index $x, "ab"',
17155759b3d2Safresh1    },
17165759b3d2Safresh1    'func::index::long_const2bb_ab' => {
17175759b3d2Safresh1        desc    => 'index of a long string bbb.. against const substr "ab"',
17185759b3d2Safresh1        setup   => 'my $x = "b" x 1000',
17195759b3d2Safresh1        code    => 'index $x, "ab"',
17205759b3d2Safresh1    },
17215759b3d2Safresh1    'func::index::long_const2aa_bb' => {
17225759b3d2Safresh1        desc    => 'index of a long string aaa.. against const substr "bb"',
17235759b3d2Safresh1        setup   => 'my $x = "a" x 1000',
17245759b3d2Safresh1        code    => 'index $x, "bb"',
17255759b3d2Safresh1    },
17265759b3d2Safresh1    # this one is designed to be pathological
17275759b3d2Safresh1    'func::index::long_const2ab_aa' => {
17285759b3d2Safresh1        desc    => 'index of a long string abab.. against const substr "aa"',
17295759b3d2Safresh1        setup   => 'my $x = "ab" x 500',
17305759b3d2Safresh1        code    => 'index $x, "aa"',
17315759b3d2Safresh1    },
17325759b3d2Safresh1    # near misses with gaps, 1st letter
17335759b3d2Safresh1    'func::index::long_const2aaxx_xy' => {
17345759b3d2Safresh1        desc    => 'index of a long string with "xx"s against const substr "xy"',
17355759b3d2Safresh1        setup   => 'my $x = "aaaaaaaaxx" x 100',
17365759b3d2Safresh1        code    => 'index $x, "xy"',
17375759b3d2Safresh1    },
17385759b3d2Safresh1    # near misses with gaps, 2nd letter
17395759b3d2Safresh1    'func::index::long_const2aayy_xy' => {
17405759b3d2Safresh1        desc    => 'index of a long string with "yy"s against const substr "xy"',
17415759b3d2Safresh1        setup   => 'my $x = "aaaaaaaayy" x 100',
17425759b3d2Safresh1        code    => 'index $x, "xy"',
17435759b3d2Safresh1    },
17445759b3d2Safresh1    # near misses with gaps, duplicate letter
17455759b3d2Safresh1    'func::index::long_const2aaxy_xx' => {
17465759b3d2Safresh1        desc    => 'index of a long string with "xy"s against const substr "xx"',
17475759b3d2Safresh1        setup   => 'my $x = "aaaaaaaaxy" x 100',
17485759b3d2Safresh1        code    => 'index $x, "xx"',
17495759b3d2Safresh1    },
17505759b3d2Safresh1    # alternating near misses with gaps
17515759b3d2Safresh1    'func::index::long_const2aaxxaayy_xy' => {
17525759b3d2Safresh1        desc    => 'index of a long string with "xx/yy"s against const substr "xy"',
17535759b3d2Safresh1        setup   => 'my $x = "aaaaaaaaxxbbbbbbbbyy" x 50',
17545759b3d2Safresh1        code    => 'index $x, "xy"',
17555759b3d2Safresh1    },
17565759b3d2Safresh1    'func::index::short_const3aabcd_bcd' => {
17575759b3d2Safresh1        desc    => 'index of a short string against a 3 char const substr',
17585759b3d2Safresh1        setup   => 'my $x = "aaaabcd"',
17595759b3d2Safresh1        code    => 'index $x, "bcd"',
17605759b3d2Safresh1    },
17615759b3d2Safresh1    'func::index::long_const3aabcd_bcd' => {
17625759b3d2Safresh1        desc    => 'index of a long string against a 3 char const substr',
17635759b3d2Safresh1        setup   => 'my $x = "a" x 1000 . "bcd"',
17645759b3d2Safresh1        code    => 'index $x, "bcd"',
17655759b3d2Safresh1    },
17665759b3d2Safresh1    'func::index::long_const3ab_abc' => {
17675759b3d2Safresh1        desc    => 'index of a long string of "ab"s against a 3 char const substr "abc"',
17685759b3d2Safresh1        setup   => 'my $x = "ab" x 500',
17695759b3d2Safresh1        code    => 'index $x, "abc"',
17705759b3d2Safresh1    },
17715759b3d2Safresh1    'func::index::long_const3bc_abc' => {
17725759b3d2Safresh1        desc    => 'index of a long string of "bc"s against a 3 char const substr "abc"',
17735759b3d2Safresh1        setup   => 'my $x = "bc" x 500',
17745759b3d2Safresh1        code    => 'index $x, "abc"',
17755759b3d2Safresh1    },
17765759b3d2Safresh1    'func::index::utf8_position_1' => {
17775759b3d2Safresh1        desc    => 'index of a utf8 string, matching at position 1',
17785759b3d2Safresh1        setup   => 'my $x = "abc". chr(0x100); chop $x',
17795759b3d2Safresh1        code    => 'index $x, "b"',
17805759b3d2Safresh1    },
17815759b3d2Safresh1
17825759b3d2Safresh1
17835759b3d2Safresh1    # JOIN
17845759b3d2Safresh1
17855759b3d2Safresh1
17865759b3d2Safresh1    'func::join::empty_l_ll' => {
17875759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
17885759b3d2Safresh1        code    => '$lex = join "", $lex1, $lex2',
17895759b3d2Safresh1    },
17905759b3d2Safresh1
17915759b3d2Safresh1
17925759b3d2Safresh1    # KEYS
17935759b3d2Safresh1
17945759b3d2Safresh1
17955759b3d2Safresh1    'func::keys::lex::void_cxt_empty' => {
17965759b3d2Safresh1        desc    => ' keys() on an empty lexical hash in void context',
17975759b3d2Safresh1        setup   => 'my %h = ()',
17985759b3d2Safresh1        code    => 'keys %h',
17995759b3d2Safresh1    },
18005759b3d2Safresh1    'func::keys::lex::void_cxt' => {
18015759b3d2Safresh1        desc    => ' keys() on a non-empty lexical hash in void context',
18025759b3d2Safresh1        setup   => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
18035759b3d2Safresh1        code    => 'keys %h',
18045759b3d2Safresh1    },
18055759b3d2Safresh1    'func::keys::lex::bool_cxt_empty' => {
18065759b3d2Safresh1        desc    => ' keys() on an empty lexical hash in bool context',
18075759b3d2Safresh1        setup   => 'my %h = ()',
18085759b3d2Safresh1        code    => '!keys %h',
18095759b3d2Safresh1    },
18105759b3d2Safresh1    'func::keys::lex::bool_cxt' => {
18115759b3d2Safresh1        desc    => ' keys() on a non-empty lexical hash in bool context',
18125759b3d2Safresh1        setup   => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
18135759b3d2Safresh1        code    => '!keys %h',
18145759b3d2Safresh1    },
18155759b3d2Safresh1    'func::keys::lex::scalar_cxt_empty' => {
18165759b3d2Safresh1        desc    => ' keys() on an empty lexical hash in scalar context',
18175759b3d2Safresh1        setup   => 'my $k; my %h = ()',
18185759b3d2Safresh1        code    => '$k = keys %h',
18195759b3d2Safresh1    },
18205759b3d2Safresh1    'func::keys::lex::scalar_cxt' => {
18215759b3d2Safresh1        desc    => ' keys() on a non-empty lexical hash in scalar context',
18225759b3d2Safresh1        setup   => 'my $k; my %h = qw(aardvark 1 banana 2 cucumber 3)',
18235759b3d2Safresh1        code    => '$k = keys %h',
18245759b3d2Safresh1    },
18255759b3d2Safresh1    'func::keys::lex::list_cxt_empty' => {
18265759b3d2Safresh1        desc    => ' keys() on an empty lexical hash in list context',
18275759b3d2Safresh1        setup   => 'my %h = ()',
18285759b3d2Safresh1        code    => '() = keys %h',
18295759b3d2Safresh1    },
18305759b3d2Safresh1    'func::keys::lex::list_cxt' => {
18315759b3d2Safresh1        desc    => ' keys() on a non-empty lexical hash in list context',
18325759b3d2Safresh1        setup   => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
18335759b3d2Safresh1        code    => '() = keys %h',
18345759b3d2Safresh1    },
18355759b3d2Safresh1
18365759b3d2Safresh1    'func::keys::pkg::void_cxt_empty' => {
18375759b3d2Safresh1        desc    => ' keys() on an empty package hash in void context',
18385759b3d2Safresh1        setup   => 'our %h = ()',
18395759b3d2Safresh1        code    => 'keys %h',
18405759b3d2Safresh1    },
18415759b3d2Safresh1    'func::keys::pkg::void_cxt' => {
18425759b3d2Safresh1        desc    => ' keys() on a non-empty package hash in void context',
18435759b3d2Safresh1        setup   => 'our %h = qw(aardvark 1 banana 2 cucumber 3)',
18445759b3d2Safresh1        code    => 'keys %h',
18455759b3d2Safresh1    },
18465759b3d2Safresh1    'func::keys::pkg::bool_cxt_empty' => {
18475759b3d2Safresh1        desc    => ' keys() on an empty package hash in bool context',
18485759b3d2Safresh1        setup   => 'our %h = ()',
18495759b3d2Safresh1        code    => '!keys %h',
18505759b3d2Safresh1    },
18515759b3d2Safresh1    'func::keys::pkg::bool_cxt' => {
18525759b3d2Safresh1        desc    => ' keys() on a non-empty package hash in bool context',
18535759b3d2Safresh1        setup   => 'our %h = qw(aardvark 1 banana 2 cucumber 3)',
18545759b3d2Safresh1        code    => '!keys %h',
18555759b3d2Safresh1    },
18565759b3d2Safresh1    'func::keys::pkg::scalar_cxt_empty' => {
18575759b3d2Safresh1        desc    => ' keys() on an empty package hash in scalar context',
18585759b3d2Safresh1        setup   => 'my $k; our %h = ()',
18595759b3d2Safresh1        code    => '$k = keys %h',
18605759b3d2Safresh1    },
18615759b3d2Safresh1    'func::keys::pkg::scalar_cxt' => {
18625759b3d2Safresh1        desc    => ' keys() on a non-empty package hash in scalar context',
18635759b3d2Safresh1        setup   => 'my $k; our %h = qw(aardvark 1 banana 2 cucumber 3)',
18645759b3d2Safresh1        code    => '$k = keys %h',
18655759b3d2Safresh1    },
18665759b3d2Safresh1    'func::keys::pkg::list_cxt_empty' => {
18675759b3d2Safresh1        desc    => ' keys() on an empty package hash in list context',
18685759b3d2Safresh1        setup   => 'our %h = ()',
18695759b3d2Safresh1        code    => '() = keys %h',
18705759b3d2Safresh1    },
18715759b3d2Safresh1    'func::keys::pkg::list_cxt' => {
18725759b3d2Safresh1        desc    => ' keys() on a non-empty package hash in list context',
18735759b3d2Safresh1        setup   => 'our %h = qw(aardvark 1 banana 2 cucumber 3)',
18745759b3d2Safresh1        code    => '() = keys %h',
18755759b3d2Safresh1    },
18765759b3d2Safresh1
18775759b3d2Safresh1
18785759b3d2Safresh1    'func::length::bool0' => {
18795759b3d2Safresh1        desc    => 'length==0 in boolean context',
18805759b3d2Safresh1        setup   => 'my $s = "";',
18815759b3d2Safresh1        code    => '!length($s);',
18825759b3d2Safresh1    },
18835759b3d2Safresh1    'func::length::bool10' => {
18845759b3d2Safresh1        desc    => 'length==10 in boolean context',
18855759b3d2Safresh1        setup   => 'my $s = "abcdefghijk";',
18865759b3d2Safresh1        code    => '!length($s);',
18875759b3d2Safresh1    },
18885759b3d2Safresh1    'func::length::scalar10' => {
18895759b3d2Safresh1        desc    => 'length==10 in scalar context',
18905759b3d2Safresh1        setup   => 'my $p; my $s = "abcdefghijk";',
18915759b3d2Safresh1        code    => '$p = length($s);',
18925759b3d2Safresh1    },
18935759b3d2Safresh1    'func::length::bool0_utf8' => {
18945759b3d2Safresh1        desc    => 'utf8 string length==0 in boolean context',
18955759b3d2Safresh1        setup   => 'my $s = "\x{100}"; chop $s;',
18965759b3d2Safresh1        code    => '!length($s);',
18975759b3d2Safresh1    },
18985759b3d2Safresh1    'func::length::bool10_utf8' => {
18995759b3d2Safresh1        desc    => 'utf8 string length==10 in boolean context',
19005759b3d2Safresh1        setup   => 'my $s = "abcdefghij\x{100}";',
19015759b3d2Safresh1        code    => '!length($s);',
19025759b3d2Safresh1    },
19035759b3d2Safresh1    'func::length::scalar10_utf8' => {
19045759b3d2Safresh1        desc    => 'utf8 string length==10 in scalar context',
19055759b3d2Safresh1        setup   => 'my $p; my $s = "abcdefghij\x{100}";',
19065759b3d2Safresh1        code    => '$p = length($s);',
19075759b3d2Safresh1    },
19085759b3d2Safresh1
19095759b3d2Safresh1    'func::pos::bool0' => {
19105759b3d2Safresh1        desc    => 'pos==0 in boolean context',
19115759b3d2Safresh1        setup   => 'my $s = "abc"; pos($s) = 0',
19125759b3d2Safresh1        code    => '!pos($s);',
19135759b3d2Safresh1    },
19145759b3d2Safresh1    'func::pos::bool10' => {
19155759b3d2Safresh1        desc    => 'pos==10 in boolean context',
19165759b3d2Safresh1        setup   => 'my $s = "abcdefghijk"; pos($s) = 10',
19175759b3d2Safresh1        code    => '!pos($s);',
19185759b3d2Safresh1    },
19195759b3d2Safresh1    'func::pos::scalar10' => {
19205759b3d2Safresh1        desc    => 'pos==10 in scalar context',
19215759b3d2Safresh1        setup   => 'my $p; my $s = "abcdefghijk"; pos($s) = 10',
19225759b3d2Safresh1        code    => '$p = pos($s);',
19235759b3d2Safresh1    },
19245759b3d2Safresh1
19255759b3d2Safresh1    'func::ref::notaref_bool' => {
19265759b3d2Safresh1        desc    => 'ref($notaref) in boolean context',
19275759b3d2Safresh1        setup   => 'my $r = "boo"',
19285759b3d2Safresh1        code    => '!ref $r',
19295759b3d2Safresh1    },
19305759b3d2Safresh1    'func::ref::ref_bool' => {
19315759b3d2Safresh1        desc    => 'ref($ref) in boolean context',
19325759b3d2Safresh1        setup   => 'my $r = []',
19335759b3d2Safresh1        code    => '!ref $r',
19345759b3d2Safresh1    },
19355759b3d2Safresh1    'func::ref::blessedref_bool' => {
19365759b3d2Safresh1        desc    => 'ref($blessed_ref) in boolean context',
19375759b3d2Safresh1        setup   => 'my $r = bless []',
19385759b3d2Safresh1        code    => '!ref $r',
19395759b3d2Safresh1    },
19405759b3d2Safresh1
19415759b3d2Safresh1    'func::ref::notaref' => {
19425759b3d2Safresh1        desc    => 'ref($notaref) in scalar context',
19435759b3d2Safresh1        setup   => 'my $x; my $r = "boo"',
19445759b3d2Safresh1        code    => '$x = ref $r',
19455759b3d2Safresh1    },
19465759b3d2Safresh1    'func::ref::ref' => {
19475759b3d2Safresh1        desc    => 'ref($ref) in scalar context',
19485759b3d2Safresh1        setup   => 'my $x; my $r = []',
19495759b3d2Safresh1        code    => '$x = ref $r',
19505759b3d2Safresh1    },
19515759b3d2Safresh1    'func::ref::blessedref' => {
19525759b3d2Safresh1        desc    => 'ref($blessed_ref) in scalar context',
19535759b3d2Safresh1        setup   => 'my $x; my $r = bless []',
19545759b3d2Safresh1        code    => '$x = ref $r',
19555759b3d2Safresh1    },
19565759b3d2Safresh1
19575759b3d2Safresh1
19585759b3d2Safresh1
19595759b3d2Safresh1    'func::sort::num' => {
19605759b3d2Safresh1        desc    => 'plain numeric sort',
19615759b3d2Safresh1        setup   => 'my (@a, @b); @a = reverse 1..10;',
19625759b3d2Safresh1        code    => '@b = sort { $a <=> $b } @a',
19635759b3d2Safresh1    },
19645759b3d2Safresh1    'func::sort::num_block' => {
19655759b3d2Safresh1        desc    => 'codeblock numeric sort',
19665759b3d2Safresh1        setup   => 'my (@a, @b); @a = reverse 1..10;',
19675759b3d2Safresh1        code    => '@b = sort { $a + 1 <=> $b + 1 } @a',
19685759b3d2Safresh1    },
19695759b3d2Safresh1    'func::sort::num_fn' => {
19705759b3d2Safresh1        desc    => 'function numeric sort',
19715759b3d2Safresh1        setup   => 'sub f { $a + 1 <=> $b + 1 } my (@a, @b); @a = reverse 1..10;',
19725759b3d2Safresh1        code    => '@b = sort f @a',
19735759b3d2Safresh1    },
19745759b3d2Safresh1    'func::sort::str' => {
19755759b3d2Safresh1        desc    => 'plain string sort',
19765759b3d2Safresh1        setup   => 'my (@a, @b); @a = reverse "a".."j";',
19775759b3d2Safresh1        code    => '@b = sort { $a cmp $b } @a',
19785759b3d2Safresh1    },
19795759b3d2Safresh1    'func::sort::str_block' => {
19805759b3d2Safresh1        desc    => 'codeblock string sort',
19815759b3d2Safresh1        setup   => 'my (@a, @b); @a = reverse "a".."j";',
19825759b3d2Safresh1        code    => '@b = sort { ($a . "") cmp ($b . "") } @a',
19835759b3d2Safresh1    },
19845759b3d2Safresh1    'func::sort::str_fn' => {
19855759b3d2Safresh1        desc    => 'function string sort',
19865759b3d2Safresh1        setup   => 'sub f { ($a . "") cmp ($b . "") } my (@a, @b); @a = reverse  "a".."j";',
19875759b3d2Safresh1        code    => '@b = sort f @a',
19885759b3d2Safresh1    },
19895759b3d2Safresh1
19905759b3d2Safresh1    'func::sort::num_inplace' => {
19915759b3d2Safresh1        desc    => 'plain numeric sort in-place',
19925759b3d2Safresh1        setup   => 'my @a = reverse 1..10;',
19935759b3d2Safresh1        code    => '@a = sort { $a <=> $b } @a',
19945759b3d2Safresh1    },
19955759b3d2Safresh1    'func::sort::num_block_inplace' => {
19965759b3d2Safresh1        desc    => 'codeblock numeric sort in-place',
19975759b3d2Safresh1        setup   => 'my @a = reverse 1..10;',
19985759b3d2Safresh1        code    => '@a = sort { $a + 1 <=> $b + 1 } @a',
19995759b3d2Safresh1    },
20005759b3d2Safresh1    'func::sort::num_fn_inplace' => {
20015759b3d2Safresh1        desc    => 'function numeric sort in-place',
20025759b3d2Safresh1        setup   => 'sub f { $a + 1 <=> $b + 1 } my @a = reverse 1..10;',
20035759b3d2Safresh1        code    => '@a = sort f @a',
20045759b3d2Safresh1    },
20055759b3d2Safresh1    'func::sort::str_inplace' => {
20065759b3d2Safresh1        desc    => 'plain string sort in-place',
20075759b3d2Safresh1        setup   => 'my @a = reverse "a".."j";',
20085759b3d2Safresh1        code    => '@a = sort { $a cmp $b } @a',
20095759b3d2Safresh1    },
20105759b3d2Safresh1    'func::sort::str_block_inplace' => {
20115759b3d2Safresh1        desc    => 'codeblock string sort in-place',
20125759b3d2Safresh1        setup   => 'my @a = reverse "a".."j";',
20135759b3d2Safresh1        code    => '@a = sort { ($a . "") cmp ($b . "") } @a',
20145759b3d2Safresh1    },
20155759b3d2Safresh1    'func::sort::str_fn_inplace' => {
20165759b3d2Safresh1        desc    => 'function string sort in-place',
20175759b3d2Safresh1        setup   => 'sub f { ($a . "") cmp ($b . "") } my @a = reverse  "a".."j";',
20185759b3d2Safresh1        code    => '@a = sort f @a',
20195759b3d2Safresh1    },
20205759b3d2Safresh1
20215759b3d2Safresh1
20225759b3d2Safresh1    'func::split::vars' => {
20235759b3d2Safresh1        desc    => 'split into two lexical vars',
20245759b3d2Safresh1        setup   => 'my $s = "abc:def";',
20255759b3d2Safresh1        code    => 'my ($x, $y) = split /:/, $s, 2;',
20265759b3d2Safresh1    },
20275759b3d2Safresh1
20285759b3d2Safresh1    'func::split::array' => {
20295759b3d2Safresh1        desc    => 'split into a lexical array',
20305759b3d2Safresh1        setup   => 'my @a; my $s = "abc:def";',
20315759b3d2Safresh1        code    => '@a = split /:/, $s, 2;',
20325759b3d2Safresh1    },
20335759b3d2Safresh1    'func::split::myarray' => {
20345759b3d2Safresh1        desc    => 'split into a lexical array declared in the assign',
20355759b3d2Safresh1        setup   => 'my $s = "abc:def";',
20365759b3d2Safresh1        code    => 'my @a = split /:/, $s, 2;',
20375759b3d2Safresh1    },
20385759b3d2Safresh1    'func::split::arrayexpr' => {
20395759b3d2Safresh1        desc    => 'split into an @{$expr} ',
20405759b3d2Safresh1        setup   => 'my $s = "abc:def"; my $r = []',
20415759b3d2Safresh1        code    => '@$r = split /:/, $s, 2;',
20425759b3d2Safresh1    },
20435759b3d2Safresh1    'func::split::arraylist' => {
20445759b3d2Safresh1        desc    => 'split into an array with extra arg',
20455759b3d2Safresh1        setup   => 'my @a; my $s = "abc:def";',
20465759b3d2Safresh1        code    => '@a = (split(/:/, $s, 2), 1);',
20475759b3d2Safresh1    },
20485759b3d2Safresh1
20495759b3d2Safresh1    # SPRINTF
20505759b3d2Safresh1
20515759b3d2Safresh1
20525759b3d2Safresh1    'func::sprintf::d' => {
20535759b3d2Safresh1        desc    => '%d',
20545759b3d2Safresh1        setup   => 'my $s; my $a1 = 1234;',
20555759b3d2Safresh1        code    => '$s = sprintf "%d", $a1',
20565759b3d2Safresh1    },
20575759b3d2Safresh1    'func::sprintf::d8' => {
20585759b3d2Safresh1        desc    => '%8d',
20595759b3d2Safresh1        setup   => 'my $s; my $a1 = 1234;',
20605759b3d2Safresh1        code    => '$s = sprintf "%8d", $a1',
20615759b3d2Safresh1    },
20625759b3d2Safresh1    'func::sprintf::foo_d8' => {
20635759b3d2Safresh1        desc    => 'foo=%8d',
20645759b3d2Safresh1        setup   => 'my $s; my $a1 = 1234;',
20655759b3d2Safresh1        code    => '$s = sprintf "foo=%8d", $a1',
20665759b3d2Safresh1    },
20675759b3d2Safresh1
20685759b3d2Safresh1    'func::sprintf::f0' => {
20695759b3d2Safresh1        # "%.0f" is very special-cased
20705759b3d2Safresh1        desc    => 'sprintf "%.0f"',
20715759b3d2Safresh1        setup   => 'my $s; my $a1 = 123.456;',
20725759b3d2Safresh1        code    => '$s = sprintf "%.0f", $a1',
20735759b3d2Safresh1    },
20745759b3d2Safresh1    'func::sprintf::foo_f0' => {
20755759b3d2Safresh1        # "...%.0f..." is special-cased
20765759b3d2Safresh1        desc    => 'sprintf "foo=%.0f"',
20775759b3d2Safresh1        setup   => 'my $s; my $a1 = 123.456;',
20785759b3d2Safresh1        code    => '$s = sprintf "foo=%.0f\n", $a1',
20795759b3d2Safresh1    },
20805759b3d2Safresh1    'func::sprintf::foo_f93' => {
20815759b3d2Safresh1        desc    => 'foo=%9.3f',
20825759b3d2Safresh1        setup   => 'my $s; my $a1 = 123.456;',
20835759b3d2Safresh1        code    => '$s = sprintf "foo=%9.3f\n", $a1',
20845759b3d2Safresh1    },
20855759b3d2Safresh1
20865759b3d2Safresh1    'func::sprintf::g9' => {
20875759b3d2Safresh1        # "...%.NNNg..." is special-cased
20885759b3d2Safresh1        desc    => '%.9g',
20895759b3d2Safresh1        setup   => 'my $s; my $a1 = 123.456;',
20905759b3d2Safresh1        code    => '$s = sprintf "%.9g", $a1',
20915759b3d2Safresh1    },
20925759b3d2Safresh1    'func::sprintf::foo_g9' => {
20935759b3d2Safresh1        # "...%.NNNg..." is special-cased
20945759b3d2Safresh1        desc    => 'foo=%.9g',
20955759b3d2Safresh1        setup   => 'my $s; my $a1 = 123.456;',
20965759b3d2Safresh1        code    => '$s = sprintf "foo=%.9g\n", $a1',
20975759b3d2Safresh1    },
20985759b3d2Safresh1    'func::sprintf::foo_g93' => {
20995759b3d2Safresh1        desc    => 'foo=%9.3g',
21005759b3d2Safresh1        setup   => 'my $s; my $a1 = 123.456;',
21015759b3d2Safresh1        code    => '$s = sprintf "foo=%9.3g\n", $a1',
21025759b3d2Safresh1    },
21035759b3d2Safresh1
21045759b3d2Safresh1    'func::sprintf::s' => {
21055759b3d2Safresh1        desc    => '%s',
21065759b3d2Safresh1        setup   => 'my $s; my $a1 = "abcd";',
21075759b3d2Safresh1        code    => '$s = sprintf "%s", $a1',
21085759b3d2Safresh1    },
21095759b3d2Safresh1    'func::sprintf::foo_s' => {
21105759b3d2Safresh1        desc    => 'foo=%s',
21115759b3d2Safresh1        setup   => 'my $s; my $a1 = "abcd";',
21125759b3d2Safresh1        code    => '$s = sprintf "foo=%s", $a1',
21135759b3d2Safresh1    },
21145759b3d2Safresh1    'func::sprintf::mixed_utf8_sss' => {
21155759b3d2Safresh1        desc    => 'foo=%s bar=%s baz=%s',
21165759b3d2Safresh1        setup   => 'my $s;my $a = "ab\x{100}cd"; my $b = "efg"; my $c = "h\x{101}ij"',
21175759b3d2Safresh1        code    => '$s = sprintf "foo=%s bar=%s baz=%s", $a, $b, $c',
21185759b3d2Safresh1    },
21195759b3d2Safresh1
21205759b3d2Safresh1    # sprint that's likely to be optimised to an OP_MULTICONCAT
21215759b3d2Safresh1
21225759b3d2Safresh1    'func::sprintf::l' => {
21235759b3d2Safresh1        setup   => 'my $lex1 = "abcd"',
21245759b3d2Safresh1        code    => 'sprintf "%s", $lex1',
21255759b3d2Safresh1    },
21265759b3d2Safresh1    'func::sprintf::g_l' => {
21275759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"',
21285759b3d2Safresh1        code    => '$pkg = sprintf "%s", $lex1',
21295759b3d2Safresh1    },
21305759b3d2Safresh1    'func::sprintf::g_append_l' => {
21315759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"',
21325759b3d2Safresh1        pre     => '$pkg = "pqrs"',
21335759b3d2Safresh1        code    => '$pkg .= sprintf "%s", $lex1',
21345759b3d2Safresh1    },
21355759b3d2Safresh1    'func::sprintf::g_ll' => {
21365759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
21375759b3d2Safresh1        code    => '$pkg = sprintf "%s%s", $lex1, $lex2',
21385759b3d2Safresh1    },
21395759b3d2Safresh1    'func::sprintf::g_append_ll' => {
21405759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
21415759b3d2Safresh1        pre     => '$pkg = "pqrs"',
21425759b3d2Safresh1        code    => '$pkg .= sprintf "%s%s", $lex1, $lex2',
21435759b3d2Safresh1    },
21445759b3d2Safresh1    'func::sprintf::g_cl' => {
21455759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"',
21465759b3d2Safresh1        code    => '$pkg = sprintf "foo=%s", $lex1',
21475759b3d2Safresh1    },
21485759b3d2Safresh1    'func::sprintf::g_clclc' => {
21495759b3d2Safresh1        setup   => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"',
21505759b3d2Safresh1        code    => '$pkg = sprintf "foo=%s bar=%s\n", $lex1, $lex2',
21515759b3d2Safresh1    },
21525759b3d2Safresh1
21535759b3d2Safresh1    'func::sprintf::l_l' => {
21545759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"',
21555759b3d2Safresh1        code    => '$lex = sprintf "%s", $lex1',
21565759b3d2Safresh1    },
21575759b3d2Safresh1    'func::sprintf::l_append_l' => {
21585759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"',
21595759b3d2Safresh1        pre     => '$lex = "pqrs"',
21605759b3d2Safresh1        code    => '$lex .= sprintf "%s", $lex1',
21615759b3d2Safresh1    },
21625759b3d2Safresh1    'func::sprintf::ll' => {
21635759b3d2Safresh1        setup   => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
21645759b3d2Safresh1        code    => 'sprintf "%s%s", $lex1, $lex2',
21655759b3d2Safresh1    },
21665759b3d2Safresh1    'func::sprintf::l_ll' => {
21675759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
21685759b3d2Safresh1        code    => '$lex = sprintf "%s%s", $lex1, $lex2',
21695759b3d2Safresh1    },
21705759b3d2Safresh1    'func::sprintf::l_append_ll' => {
21715759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
21725759b3d2Safresh1        pre     => '$lex = "pqrs"',
21735759b3d2Safresh1        code    => '$lex .= sprintf "%s%s", $lex1, $lex2',
21745759b3d2Safresh1    },
21755759b3d2Safresh1    'func::sprintf::l_cl' => {
21765759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"',
21775759b3d2Safresh1        code    => '$lex = sprintf "foo=%s", $lex1',
21785759b3d2Safresh1    },
21795759b3d2Safresh1    'func::sprintf::l_clclc' => {
21805759b3d2Safresh1        setup   => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"',
21815759b3d2Safresh1        code    => '$lex = sprintf "foo=%s bar=%s\n", $lex1, $lex2',
21825759b3d2Safresh1    },
21835759b3d2Safresh1
21845759b3d2Safresh1    'func::sprintf::m_l' => {
21855759b3d2Safresh1        setup   => 'my $lex1 = "abcd"',
21865759b3d2Safresh1        code    => 'my $lex = sprintf "%s", $lex1',
21875759b3d2Safresh1    },
21885759b3d2Safresh1    'func::sprintf::m_ll' => {
21895759b3d2Safresh1        setup   => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
21905759b3d2Safresh1        code    => 'my $lex = sprintf "%s%s", $lex1, $lex2',
21915759b3d2Safresh1    },
21925759b3d2Safresh1    'func::sprintf::m_cl' => {
21935759b3d2Safresh1        setup   => 'my $lex1 = "abcd"',
21945759b3d2Safresh1        code    => 'my $lex = sprintf "foo=%s", $lex1',
21955759b3d2Safresh1    },
21965759b3d2Safresh1    'func::sprintf::m_clclc' => {
21975759b3d2Safresh1        setup   => 'my $lex1 = "abcd"; my $lex2 = "wxyz"',
21985759b3d2Safresh1        code    => 'my $lex = sprintf "foo=%s bar=%s\n", $lex1, $lex2',
21995759b3d2Safresh1    },
22005759b3d2Safresh1
22015759b3d2Safresh1    'func::sprintf::utf8__l_lll' => {
22025759b3d2Safresh1        desc    => '$s = sprintf("foo=%s bar=%s baz=%s", $a, $b, $c) where $a,$c are utf8',
22035759b3d2Safresh1        setup   => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"',
22045759b3d2Safresh1        code    => '$s = sprintf "foo=%s bar=%s baz=%s", $a, $b, $c',
22055759b3d2Safresh1    },
22065759b3d2Safresh1
22075759b3d2Safresh1
22085759b3d2Safresh1    # S///
22095759b3d2Safresh1
22105759b3d2Safresh1    'func::subst::bool' => {
22115759b3d2Safresh1        desc    => 's/// in boolean context',
22125759b3d2Safresh1        setup   => '',
22135759b3d2Safresh1        code    => '$_ = "aaa"; !s/./x/g;'
22145759b3d2Safresh1    },
22155759b3d2Safresh1
22165759b3d2Safresh1
22175759b3d2Safresh1    'func::values::scalar_cxt_empty' => {
22185759b3d2Safresh1        desc    => ' values() on an empty hash in scalar context',
22195759b3d2Safresh1        setup   => 'my $k; my %h = ()',
22205759b3d2Safresh1        code    => '$k = values %h',
22215759b3d2Safresh1    },
22225759b3d2Safresh1    'func::values::scalar_cxt' => {
22235759b3d2Safresh1        desc    => ' values() on a non-empty hash in scalar context',
22245759b3d2Safresh1        setup   => 'my $k; my %h = qw(aardvark 1 banana 2 cucumber 3)',
22255759b3d2Safresh1        code    => '$k = values %h',
22265759b3d2Safresh1    },
22275759b3d2Safresh1    'func::values::list_cxt_empty' => {
22285759b3d2Safresh1        desc    => ' values() on an empty hash in list context',
22295759b3d2Safresh1        setup   => 'my %h = ()',
22305759b3d2Safresh1        code    => '() = values %h',
22315759b3d2Safresh1    },
22325759b3d2Safresh1    'func::values::list_cxt' => {
22335759b3d2Safresh1        desc    => ' values() on a non-empty hash in list context',
22345759b3d2Safresh1        setup   => 'my %h = qw(aardvark 1 banana 2 cucumber 3)',
22355759b3d2Safresh1        code    => '() = values %h',
22365759b3d2Safresh1    },
22375759b3d2Safresh1
22385759b3d2Safresh1
22395759b3d2Safresh1
2240b8851fccSafresh1    'loop::block' => {
2241b8851fccSafresh1        desc    => 'empty basic loop',
22425759b3d2Safresh1        setup   => '',
2243b8851fccSafresh1        code    => '{1;}',
2244b8851fccSafresh1    },
2245b8851fccSafresh1
2246b8851fccSafresh1    'loop::do' => {
2247b8851fccSafresh1        desc    => 'basic do block',
2248b8851fccSafresh1        setup   => 'my $x; my $y = 2;',
2249b8851fccSafresh1        code    => '$x = do {1; $y}', # the ';' stops the do being optimised
2250b8851fccSafresh1    },
2251b8851fccSafresh1
2252b8851fccSafresh1    'loop::for::my_range1' => {
2253b8851fccSafresh1        desc    => 'empty for loop with my var and 1 integer range',
2254b8851fccSafresh1        setup   => '',
2255b8851fccSafresh1        code    => 'for my $x (1..1) {}',
2256b8851fccSafresh1    },
2257b8851fccSafresh1    'loop::for::lex_range1' => {
2258b8851fccSafresh1        desc    => 'empty for loop with lexical var and 1 integer range',
2259b8851fccSafresh1        setup   => 'my $x;',
2260b8851fccSafresh1        code    => 'for $x (1..1) {}',
2261b8851fccSafresh1    },
2262b8851fccSafresh1    'loop::for::pkg_range1' => {
2263b8851fccSafresh1        desc    => 'empty for loop with package var and 1 integer range',
2264b8851fccSafresh1        setup   => '$x = 1;',
2265b8851fccSafresh1        code    => 'for $x (1..1) {}',
2266b8851fccSafresh1    },
2267b8851fccSafresh1    'loop::for::defsv_range1' => {
2268b8851fccSafresh1        desc    => 'empty for loop with $_ and integer 1 range',
2269b8851fccSafresh1        setup   => ';',
2270b8851fccSafresh1        code    => 'for (1..1) {}',
2271b8851fccSafresh1    },
2272b8851fccSafresh1    'loop::for::my_range4' => {
2273b8851fccSafresh1        desc    => 'empty for loop with my var and 4 integer range',
2274b8851fccSafresh1        setup   => '',
2275b8851fccSafresh1        code    => 'for my $x (1..4) {}',
2276b8851fccSafresh1    },
2277b8851fccSafresh1    'loop::for::lex_range4' => {
2278b8851fccSafresh1        desc    => 'empty for loop with lexical var and 4 integer range',
2279b8851fccSafresh1        setup   => 'my $x;',
2280b8851fccSafresh1        code    => 'for $x (1..4) {}',
2281b8851fccSafresh1    },
2282b8851fccSafresh1    'loop::for::pkg_range4' => {
2283b8851fccSafresh1        desc    => 'empty for loop with package var and 4 integer range',
2284b8851fccSafresh1        setup   => '$x = 1;',
2285b8851fccSafresh1        code    => 'for $x (1..4) {}',
2286b8851fccSafresh1    },
2287b8851fccSafresh1    'loop::for::defsv_range4' => {
2288b8851fccSafresh1        desc    => 'empty for loop with $_ and integer 4 range',
2289b8851fccSafresh1        setup   => ';',
2290b8851fccSafresh1        code    => 'for (1..4) {}',
2291b8851fccSafresh1    },
2292b8851fccSafresh1
2293b8851fccSafresh1    'loop::for::my_list1' => {
2294b8851fccSafresh1        desc    => 'empty for loop with my var and 1 integer list',
2295b8851fccSafresh1        setup   => '',
2296b8851fccSafresh1        code    => 'for my $x (1) {}',
2297b8851fccSafresh1    },
2298b8851fccSafresh1    'loop::for::lex_list1' => {
2299b8851fccSafresh1        desc    => 'empty for loop with lexical var and 1 integer list',
2300b8851fccSafresh1        setup   => 'my $x;',
2301b8851fccSafresh1        code    => 'for $x (1) {}',
2302b8851fccSafresh1    },
2303b8851fccSafresh1    'loop::for::pkg_list1' => {
2304b8851fccSafresh1        desc    => 'empty for loop with package var and 1 integer list',
2305b8851fccSafresh1        setup   => '$x = 1;',
2306b8851fccSafresh1        code    => 'for $x (1) {}',
2307b8851fccSafresh1    },
2308b8851fccSafresh1    'loop::for::defsv_list1' => {
2309b8851fccSafresh1        desc    => 'empty for loop with $_ and integer 1 list',
2310b8851fccSafresh1        setup   => ';',
2311b8851fccSafresh1        code    => 'for (1) {}',
2312b8851fccSafresh1    },
2313b8851fccSafresh1    'loop::for::my_list4' => {
2314b8851fccSafresh1        desc    => 'empty for loop with my var and 4 integer list',
2315b8851fccSafresh1        setup   => '',
2316b8851fccSafresh1        code    => 'for my $x (1,2,3,4) {}',
2317b8851fccSafresh1    },
2318b8851fccSafresh1    'loop::for::lex_list4' => {
2319b8851fccSafresh1        desc    => 'empty for loop with lexical var and 4 integer list',
2320b8851fccSafresh1        setup   => 'my $x;',
2321b8851fccSafresh1        code    => 'for $x (1,2,3,4) {}',
2322b8851fccSafresh1    },
2323b8851fccSafresh1    'loop::for::pkg_list4' => {
2324b8851fccSafresh1        desc    => 'empty for loop with package var and 4 integer list',
2325b8851fccSafresh1        setup   => '$x = 1;',
2326b8851fccSafresh1        code    => 'for $x (1,2,3,4) {}',
2327b8851fccSafresh1    },
2328b8851fccSafresh1    'loop::for::defsv_list4' => {
2329b8851fccSafresh1        desc    => 'empty for loop with $_ and integer 4 list',
2330b8851fccSafresh1        setup   => '',
2331b8851fccSafresh1        code    => 'for (1,2,3,4) {}',
2332b8851fccSafresh1    },
2333b8851fccSafresh1
2334b8851fccSafresh1    'loop::for::my_array1' => {
2335b8851fccSafresh1        desc    => 'empty for loop with my var and 1 integer array',
2336b8851fccSafresh1        setup   => 'my @a = (1);',
2337b8851fccSafresh1        code    => 'for my $x (@a) {}',
2338b8851fccSafresh1    },
2339b8851fccSafresh1    'loop::for::lex_array1' => {
2340b8851fccSafresh1        desc    => 'empty for loop with lexical var and 1 integer array',
2341b8851fccSafresh1        setup   => 'my $x; my @a = (1);',
2342b8851fccSafresh1        code    => 'for $x (@a) {}',
2343b8851fccSafresh1    },
2344b8851fccSafresh1    'loop::for::pkg_array1' => {
2345b8851fccSafresh1        desc    => 'empty for loop with package var and 1 integer array',
2346b8851fccSafresh1        setup   => '$x = 1; my @a = (1);',
2347b8851fccSafresh1        code    => 'for $x (@a) {}',
2348b8851fccSafresh1    },
2349b8851fccSafresh1    'loop::for::defsv_array1' => {
2350b8851fccSafresh1        desc    => 'empty for loop with $_ and integer 1 array',
2351b8851fccSafresh1        setup   => 'my @a = (@a);',
2352b8851fccSafresh1        code    => 'for (1) {}',
2353b8851fccSafresh1    },
2354b8851fccSafresh1    'loop::for::my_array4' => {
2355b8851fccSafresh1        desc    => 'empty for loop with my var and 4 integer array',
2356b8851fccSafresh1        setup   => 'my @a = (1..4);',
2357b8851fccSafresh1        code    => 'for my $x (@a) {}',
2358b8851fccSafresh1    },
2359b8851fccSafresh1    'loop::for::lex_array4' => {
2360b8851fccSafresh1        desc    => 'empty for loop with lexical var and 4 integer array',
2361b8851fccSafresh1        setup   => 'my $x; my @a = (1..4);',
2362b8851fccSafresh1        code    => 'for $x (@a) {}',
2363b8851fccSafresh1    },
2364b8851fccSafresh1    'loop::for::pkg_array4' => {
2365b8851fccSafresh1        desc    => 'empty for loop with package var and 4 integer array',
2366b8851fccSafresh1        setup   => '$x = 1; my @a = (1..4);',
2367b8851fccSafresh1        code    => 'for $x (@a) {}',
2368b8851fccSafresh1    },
2369b8851fccSafresh1    'loop::for::defsv_array4' => {
2370b8851fccSafresh1        desc    => 'empty for loop with $_ and integer 4 array',
2371b8851fccSafresh1        setup   => 'my @a = (1..4);',
2372b8851fccSafresh1        code    => 'for (@a) {}',
2373b8851fccSafresh1    },
2374b8851fccSafresh1
2375b8851fccSafresh1    'loop::for::next4' => {
2376b8851fccSafresh1        desc    => 'for loop containing only next with my var and integer 4 array',
2377b8851fccSafresh1        setup   => 'my @a = (1..4);',
2378b8851fccSafresh1        code    => 'for my $x (@a) {next}',
2379b8851fccSafresh1    },
2380b8851fccSafresh1
2381b8851fccSafresh1    'loop::grep::expr_3int' => {
2382b8851fccSafresh1        desc    => 'grep $_ > 0, 1,2,3',
2383b8851fccSafresh1        setup   => 'my @a',
2384b8851fccSafresh1        code    => '@a = grep $_ > 0, 1,2,3',
2385b8851fccSafresh1    },
2386b8851fccSafresh1
2387b8851fccSafresh1    'loop::grep::block_3int' => {
2388b8851fccSafresh1        desc    => 'grep { 1; $_ > 0} 1,2,3',
2389b8851fccSafresh1        setup   => 'my @a',
2390b8851fccSafresh1        code    => '@a = grep { 1; $_ > 0} 1,2,3',
2391b8851fccSafresh1    },
2392b8851fccSafresh1
2393b8851fccSafresh1    'loop::map::expr_3int' => {
2394b8851fccSafresh1        desc    => 'map $_+1, 1,2,3',
2395b8851fccSafresh1        setup   => 'my @a',
2396b8851fccSafresh1        code    => '@a = map $_+1, 1,2,3',
2397b8851fccSafresh1    },
2398b8851fccSafresh1
2399b8851fccSafresh1    'loop::map::block_3int' => {
2400b8851fccSafresh1        desc    => 'map { 1; $_+1} 1,2,3',
2401b8851fccSafresh1        setup   => 'my @a',
2402b8851fccSafresh1        code    => '@a = map { 1; $_+1} 1,2,3',
2403b8851fccSafresh1    },
2404b8851fccSafresh1
2405b8851fccSafresh1    'loop::while::i1' => {
2406b8851fccSafresh1        desc    => 'empty while loop 1 iteration',
2407b8851fccSafresh1        setup   => 'my $i = 0;',
2408b8851fccSafresh1        code    => 'while (++$i % 2) {}',
2409b8851fccSafresh1    },
2410b8851fccSafresh1    'loop::while::i4' => {
2411b8851fccSafresh1        desc    => 'empty while loop 4 iterations',
2412b8851fccSafresh1        setup   => 'my $i = 0;',
2413b8851fccSafresh1        code    => 'while (++$i % 4) {}',
2414b8851fccSafresh1    },
2415b8851fccSafresh1
24165759b3d2Safresh1
24175759b3d2Safresh1    'regex::anyof_plus::anchored' => {
24185759b3d2Safresh1        setup   => '$_ = "a" x 100;',
24195759b3d2Safresh1        code    => '/^[acgt]+/',
24205759b3d2Safresh1    },
24215759b3d2Safresh1    'regex::anyof_plus::floating' => {
24225759b3d2Safresh1        desc    => '/[acgt]+where match starts at position 0 for 100 chars/',
24235759b3d2Safresh1        setup   => '$_ = "a" x 100;',
24245759b3d2Safresh1        code    => '/[acgt]+/',
24255759b3d2Safresh1    },
24265759b3d2Safresh1    'regex::anyof_plus::floating_away' => {
24275759b3d2Safresh1        desc    => '/[acgt]+/ where match starts at position 100 for 100 chars',
24285759b3d2Safresh1        setup   => '$_ = ("0" x 100) . ("a" x 100);',
24295759b3d2Safresh1        code    => '/[acgt]+/',
24305759b3d2Safresh1    },
24315759b3d2Safresh1
24325759b3d2Safresh1    'regex::whilem::min_captures_fail' => {
24335759b3d2Safresh1        desc    => '/WHILEM with anon-greedy match and captures that fails',
24345759b3d2Safresh1        setup   => '$_ = ("a" x 20)',
24355759b3d2Safresh1        code    => '/^(?:(.)(.))*?[XY]/',
24365759b3d2Safresh1    },
24375759b3d2Safresh1    'regex::whilem::max_captures_fail' => {
24385759b3d2Safresh1        desc    => '/WHILEM with a greedy match and captures that fails',
24395759b3d2Safresh1        setup   => '$_ = ("a" x 20)',
24405759b3d2Safresh1        code    => '/^(?:(.)(.))*[XY]/',
24415759b3d2Safresh1    },
2442b8851fccSafresh1];
2443