xref: /openbsd-src/gnu/usr.bin/perl/t/opbasic/concat.t (revision b46d8ef224b95de1dddcd1f01c1ab482f0ab3778)
191f110e0Safresh1#!./perl
291f110e0Safresh1
391f110e0Safresh1BEGIN {
491f110e0Safresh1    chdir 't' if -d 't';
591f110e0Safresh1    @INC = '../lib';
691f110e0Safresh1}
791f110e0Safresh1
89f11ffb7Safresh1# ok()/is() functions from other sources (e.g., t/test.pl) may use
99f11ffb7Safresh1# concatenation, but that is what is being tested in this file.  Hence, we
109f11ffb7Safresh1# place this file in the directory where do not use t/test.pl, and we
119f11ffb7Safresh1# write functions specially written to avoid any concatenation.
1291f110e0Safresh1
1391f110e0Safresh1my $test = 1;
149f11ffb7Safresh1
1591f110e0Safresh1sub ok {
1691f110e0Safresh1    my($ok, $name) = @_;
1791f110e0Safresh1
1891f110e0Safresh1    printf "%sok %d - %s\n", ($ok ? "" : "not "), $test, $name;
1991f110e0Safresh1
2091f110e0Safresh1    printf "# Failed test at line %d\n", (caller)[2] unless $ok;
2191f110e0Safresh1
2291f110e0Safresh1    $test++;
2391f110e0Safresh1    return $ok;
2491f110e0Safresh1}
2591f110e0Safresh1
269f11ffb7Safresh1sub is {
279f11ffb7Safresh1    my($got, $expected, $name) = @_;
289f11ffb7Safresh1
299f11ffb7Safresh1    my $ok = $got eq $expected;
309f11ffb7Safresh1
319f11ffb7Safresh1    printf "%sok %d - %s\n", ($ok ? "" : "not "), $test, $name;
329f11ffb7Safresh1
339f11ffb7Safresh1    if (!$ok) {
349f11ffb7Safresh1        printf "# Failed test at line %d\n", (caller)[2];
359f11ffb7Safresh1        printf "# got:      %s\n#expected: %s\n", $got, $expected;
369f11ffb7Safresh1    }
379f11ffb7Safresh1
389f11ffb7Safresh1    $test++;
399f11ffb7Safresh1    return $ok;
409f11ffb7Safresh1}
419f11ffb7Safresh1
42*b46d8ef2Safresh1print "1..254\n";
4391f110e0Safresh1
4491f110e0Safresh1($a, $b, $c) = qw(foo bar);
4591f110e0Safresh1
4691f110e0Safresh1ok("$a"     eq "foo",    "verifying assign");
4791f110e0Safresh1ok("$a$b"   eq "foobar", "basic concatenation");
4891f110e0Safresh1ok("$c$a$c" eq "foo",    "concatenate undef, fore and aft");
4991f110e0Safresh1
5091f110e0Safresh1# Okay, so that wasn't very challenging.  Let's go Unicode.
5191f110e0Safresh1
5291f110e0Safresh1{
539f11ffb7Safresh1    # bug id 20000819.004 (#3761)
5491f110e0Safresh1
5591f110e0Safresh1    $_ = $dx = "\x{10f2}";
5691f110e0Safresh1    s/($dx)/$dx$1/;
5791f110e0Safresh1    {
589f11ffb7Safresh1        ok($_ eq  "$dx$dx","bug id 20000819.004 (#3761), back");
5991f110e0Safresh1    }
6091f110e0Safresh1
6191f110e0Safresh1    $_ = $dx = "\x{10f2}";
6291f110e0Safresh1    s/($dx)/$1$dx/;
6391f110e0Safresh1    {
649f11ffb7Safresh1        ok($_ eq  "$dx$dx","bug id 20000819.004 (#3761), front");
6591f110e0Safresh1    }
6691f110e0Safresh1
6791f110e0Safresh1    $dx = "\x{10f2}";
6891f110e0Safresh1    $_  = "\x{10f2}\x{10f2}";
6991f110e0Safresh1    s/($dx)($dx)/$1$2/;
7091f110e0Safresh1    {
719f11ffb7Safresh1        ok($_ eq  "$dx$dx","bug id 20000819.004 (#3761), front and back");
7291f110e0Safresh1    }
7391f110e0Safresh1}
7491f110e0Safresh1
7591f110e0Safresh1{
769f11ffb7Safresh1    # bug id 20000901.092 (#4184)
7791f110e0Safresh1    # test that undef left and right of utf8 results in a valid string
7891f110e0Safresh1
7991f110e0Safresh1    my $a;
8091f110e0Safresh1    $a .= "\x{1ff}";
819f11ffb7Safresh1    ok($a eq  "\x{1ff}", "bug id 20000901.092 (#4184), undef left");
8291f110e0Safresh1    $a .= undef;
839f11ffb7Safresh1    ok($a eq  "\x{1ff}", "bug id 20000901.092 (#4184), undef right");
8491f110e0Safresh1}
8591f110e0Safresh1
8691f110e0Safresh1{
879f11ffb7Safresh1    # ID 20001020.006 (#4484)
8891f110e0Safresh1
8991f110e0Safresh1    "x" =~ /(.)/; # unset $2
9091f110e0Safresh1
9191f110e0Safresh1    # Without the fix this 5.7.0 would croak:
9291f110e0Safresh1    # Modification of a read-only value attempted at ...
9391f110e0Safresh1    eval {"$2\x{1234}"};
949f11ffb7Safresh1    ok(!$@, "bug id 20001020.006 (#4484), left");
9591f110e0Safresh1
9691f110e0Safresh1    # For symmetry with the above.
9791f110e0Safresh1    eval {"\x{1234}$2"};
989f11ffb7Safresh1    ok(!$@, "bug id 20001020.006 (#4484), right");
9991f110e0Safresh1
10091f110e0Safresh1    *pi = \undef;
10191f110e0Safresh1    # This bug existed earlier than the $2 bug, but is fixed with the same
10291f110e0Safresh1    # patch. Without the fix this 5.7.0 would also croak:
10391f110e0Safresh1    # Modification of a read-only value attempted at ...
10491f110e0Safresh1    eval{"$pi\x{1234}"};
1059f11ffb7Safresh1    ok(!$@, "bug id 20001020.006 (#4484), constant left");
10691f110e0Safresh1
10791f110e0Safresh1    # For symmetry with the above.
10891f110e0Safresh1    eval{"\x{1234}$pi"};
1099f11ffb7Safresh1    ok(!$@, "bug id 20001020.006 (#4484), constant right");
11091f110e0Safresh1}
11191f110e0Safresh1
11291f110e0Safresh1sub beq { use bytes; $_[0] eq $_[1]; }
11391f110e0Safresh1
11491f110e0Safresh1{
11591f110e0Safresh1    # concat should not upgrade its arguments.
11691f110e0Safresh1    my($l, $r, $c);
11791f110e0Safresh1
11891f110e0Safresh1    ($l, $r, $c) = ("\x{101}", "\x{fe}", "\x{101}\x{fe}");
11991f110e0Safresh1    ok(beq($l.$r, $c), "concat utf8 and byte");
12091f110e0Safresh1    ok(beq($l, "\x{101}"), "right not changed after concat u+b");
12191f110e0Safresh1    ok(beq($r, "\x{fe}"), "left not changed after concat u+b");
12291f110e0Safresh1
12391f110e0Safresh1    ($l, $r, $c) = ("\x{fe}", "\x{101}", "\x{fe}\x{101}");
12491f110e0Safresh1    ok(beq($l.$r, $c), "concat byte and utf8");
12591f110e0Safresh1    ok(beq($l, "\x{fe}"), "right not changed after concat b+u");
12691f110e0Safresh1    ok(beq($r, "\x{101}"), "left not changed after concat b+u");
12791f110e0Safresh1}
12891f110e0Safresh1
12991f110e0Safresh1{
13091f110e0Safresh1    my $a; ($a .= 5) . 6;
13191f110e0Safresh1    ok($a == 5, '($a .= 5) . 6 - present since 5.000');
13291f110e0Safresh1}
13391f110e0Safresh1
13491f110e0Safresh1{
13591f110e0Safresh1    # [perl #24508] optree construction bug
13691f110e0Safresh1    sub strfoo { "x" }
13791f110e0Safresh1    my ($x, $y);
13891f110e0Safresh1    $y = ($x = '' . strfoo()) . "y";
13991f110e0Safresh1    ok( "$x,$y" eq "x,xy", 'figures out correct target' );
14091f110e0Safresh1}
14191f110e0Safresh1
14291f110e0Safresh1{
14391f110e0Safresh1    # [perl #26905] "use bytes" doesn't apply byte semantics to concatenation
14491f110e0Safresh1
14591f110e0Safresh1    my $p = "\xB6"; # PILCROW SIGN (ASCII/EBCDIC), 2bytes in UTF-X
14691f110e0Safresh1    my $u = "\x{100}";
14791f110e0Safresh1    my $b = pack 'a*', "\x{100}";
14891f110e0Safresh1    my $pu = "\xB6\x{100}";
14991f110e0Safresh1    my $up = "\x{100}\xB6";
15091f110e0Safresh1    my $x1 = $p;
15191f110e0Safresh1    my $y1 = $u;
1529f11ffb7Safresh1    my ($x2, $x3, $x4, $y2);
15391f110e0Safresh1
15491f110e0Safresh1    use bytes;
15591f110e0Safresh1    ok(beq($p.$u, $p.$b), "perl #26905, left eq bytes");
15691f110e0Safresh1    ok(beq($u.$p, $b.$p), "perl #26905, right eq bytes");
15791f110e0Safresh1    ok(!beq($p.$u, $pu),  "perl #26905, left ne unicode");
15891f110e0Safresh1    ok(!beq($u.$p, $up),  "perl #26905, right ne unicode");
15991f110e0Safresh1
16091f110e0Safresh1    $x1 .= $u;
16191f110e0Safresh1    $x2 = $p . $u;
16291f110e0Safresh1    $y1 .= $p;
16391f110e0Safresh1    $y2 = $u . $p;
16491f110e0Safresh1
1659f11ffb7Safresh1    $x3 = $p; $x3 .= $u . $u;
1669f11ffb7Safresh1    $x4 = $p . $u . $u;
1679f11ffb7Safresh1
16891f110e0Safresh1    no bytes;
16991f110e0Safresh1    ok(beq($x1, $x2), "perl #26905, left,  .= vs = . in bytes");
17091f110e0Safresh1    ok(beq($y1, $y2), "perl #26905, right, .= vs = . in bytes");
17191f110e0Safresh1    ok(($x1 eq $x2),  "perl #26905, left,  .= vs = . in chars");
17291f110e0Safresh1    ok(($y1 eq $y2),  "perl #26905, right, .= vs = . in chars");
1739f11ffb7Safresh1    ok(($x3 eq $x4),  "perl #26905, twin,  .= vs = . in chars");
17491f110e0Safresh1}
17591f110e0Safresh1
17691f110e0Safresh1{
17791f110e0Safresh1    # Concatenation needs to preserve UTF8ness of left oper.
17891f110e0Safresh1    my $x = eval"qr/\x{fff}/";
17991f110e0Safresh1    ok( ord chop($x .= "\303\277") == 191, "UTF8ness preserved" );
18091f110e0Safresh1}
18191f110e0Safresh1
18291f110e0Safresh1{
18391f110e0Safresh1    my $x;
18491f110e0Safresh1    $x = "a" . "b";
18591f110e0Safresh1    $x .= "-append-";
18691f110e0Safresh1    ok($x eq "ab-append-", "Appending to something initialized using constant folding");
18791f110e0Safresh1}
188b8851fccSafresh1
1899f11ffb7Safresh1# non-POK consts
1909f11ffb7Safresh1
1919f11ffb7Safresh1{
1929f11ffb7Safresh1    my $a = "a";
1939f11ffb7Safresh1    my $b;
1949f11ffb7Safresh1    $b = $a . $a . 1;
1959f11ffb7Safresh1    ok($b eq "aa1", "aa1");
1969f11ffb7Safresh1    $b = 2 . $a . $a;
1979f11ffb7Safresh1    ok($b eq "2aa", "2aa");
1989f11ffb7Safresh1}
1999f11ffb7Safresh1
200b8851fccSafresh1# [perl #124160]
201b8851fccSafresh1package o { use overload "." => sub { $_[0] }, fallback => 1 }
202b8851fccSafresh1$o = bless [], "o";
203b8851fccSafresh1ok(ref(CORE::state $y = "a $o b") eq 'o',
204b8851fccSafresh1  'state $y = "foo $bar baz" does not stringify; only concats');
2059f11ffb7Safresh1
2069f11ffb7Safresh1
2079f11ffb7Safresh1# multiconcat: utf8 dest with non-utf8 args should grow dest sufficiently.
2089f11ffb7Safresh1# This is mainly for valgrind or ASAN to detect problems with.
2099f11ffb7Safresh1
2109f11ffb7Safresh1{
2119f11ffb7Safresh1    my $s = "\x{100}";
2129f11ffb7Safresh1    my $t = "\x80" x 1024;
2139f11ffb7Safresh1    $s .= "-$t-";
2149f11ffb7Safresh1    ok length($s) == 1027, "utf8 dest with non-utf8 args";
2159f11ffb7Safresh1}
2169f11ffb7Safresh1
2179f11ffb7Safresh1# target on RHS
2189f11ffb7Safresh1
2199f11ffb7Safresh1{
2209f11ffb7Safresh1    my $a = "abc";
2219f11ffb7Safresh1    $a .= $a;
2229f11ffb7Safresh1    ok($a eq 'abcabc', 'append self');
2239f11ffb7Safresh1
2249f11ffb7Safresh1    $a = "abc";
2259f11ffb7Safresh1    $a = $a . $a;
2269f11ffb7Safresh1    ok($a eq 'abcabc', 'double self');
2279f11ffb7Safresh1
2289f11ffb7Safresh1    $a = "abc";
2299f11ffb7Safresh1    $a .= $a . $a;
2309f11ffb7Safresh1    ok($a eq 'abcabcabc', 'append double self');
2319f11ffb7Safresh1
2329f11ffb7Safresh1    $a = "abc";
2339f11ffb7Safresh1    $a = "$a-$a";
2349f11ffb7Safresh1    ok($a eq 'abc-abc', 'double self with const');
2359f11ffb7Safresh1
2369f11ffb7Safresh1    $a = "abc";
2379f11ffb7Safresh1    $a .= "$a-$a";
2389f11ffb7Safresh1    ok($a eq 'abcabc-abc', 'append double self with const');
2399f11ffb7Safresh1
2409f11ffb7Safresh1    $a = "abc";
2419f11ffb7Safresh1    $a .= $a . $a . $a;
2429f11ffb7Safresh1    ok($a eq 'abcabcabcabc', 'append triple self');
2439f11ffb7Safresh1
2449f11ffb7Safresh1    $a = "abc";
2459f11ffb7Safresh1    $a = "$a-$a=$a";
2469f11ffb7Safresh1    ok($a eq 'abc-abc=abc', 'triple self with const');
2479f11ffb7Safresh1
2489f11ffb7Safresh1    $a = "abc";
2499f11ffb7Safresh1    $a .= "$a-$a=$a";
2509f11ffb7Safresh1    ok($a eq 'abcabc-abc=abc', 'append triple self with const');
2519f11ffb7Safresh1}
2529f11ffb7Safresh1
2539f11ffb7Safresh1# test the sorts of optree which may (or may not) get optimised into
2549f11ffb7Safresh1# a single MULTICONCAT op. It's based on a loop in t/perf/opcount.t,
2559f11ffb7Safresh1# but here the loop is unwound as we would need to use concat to
2569f11ffb7Safresh1# generate the expected results to compare with the actual results,
2579f11ffb7Safresh1# which would rather defeat the object.
2589f11ffb7Safresh1
2599f11ffb7Safresh1{
2609f11ffb7Safresh1    my ($a1, $a2, $a3) = qw(1 2 3);
2619f11ffb7Safresh1    our $pkg;
2629f11ffb7Safresh1    my $lex;
2639f11ffb7Safresh1
2649f11ffb7Safresh1    is("-", '-', '"-"');
2659f11ffb7Safresh1    is("-", '-', '"-"');
2669f11ffb7Safresh1    is("-", '-', '"-"');
2679f11ffb7Safresh1    is("-", '-', '"-"');
2689f11ffb7Safresh1    is($a1, '1', '$a1');
2699f11ffb7Safresh1    is("-".$a1, '-1', '"-".$a1');
2709f11ffb7Safresh1    is($a1."-", '1-', '$a1."-"');
2719f11ffb7Safresh1    is("-".$a1."-", '-1-', '"-".$a1."-"');
2729f11ffb7Safresh1    is("$a1", '1', '"$a1"');
2739f11ffb7Safresh1    is("-$a1", '-1', '"-$a1"');
2749f11ffb7Safresh1    is("$a1-", '1-', '"$a1-"');
2759f11ffb7Safresh1    is("-$a1-", '-1-', '"-$a1-"');
2769f11ffb7Safresh1    is($a1.$a2, '12', '$a1.$a2');
2779f11ffb7Safresh1    is($a1."-".$a2, '1-2', '$a1."-".$a2');
2789f11ffb7Safresh1    is("-".$a1."-".$a2, '-1-2', '"-".$a1."-".$a2');
2799f11ffb7Safresh1    is($a1."-".$a2."-", '1-2-', '$a1."-".$a2."-"');
2809f11ffb7Safresh1    is("-".$a1."-".$a2."-", '-1-2-', '"-".$a1."-".$a2."-"');
2819f11ffb7Safresh1    is("$a1$a2", '12', '"$a1$a2"');
2829f11ffb7Safresh1    is("$a1-$a2", '1-2', '"$a1-$a2"');
2839f11ffb7Safresh1    is("-$a1-$a2", '-1-2', '"-$a1-$a2"');
2849f11ffb7Safresh1    is("$a1-$a2-", '1-2-', '"$a1-$a2-"');
2859f11ffb7Safresh1    is("-$a1-$a2-", '-1-2-', '"-$a1-$a2-"');
2869f11ffb7Safresh1    is($a1.$a2.$a3, '123', '$a1.$a2.$a3');
2879f11ffb7Safresh1    is($a1."-".$a2."-".$a3, '1-2-3', '$a1."-".$a2."-".$a3');
2889f11ffb7Safresh1    is("-".$a1."-".$a2."-".$a3, '-1-2-3', '"-".$a1."-".$a2."-".$a3');
2899f11ffb7Safresh1    is($a1."-".$a2."-".$a3."-", '1-2-3-', '$a1."-".$a2."-".$a3."-"');
2909f11ffb7Safresh1    is("-".$a1."-".$a2."-".$a3."-", '-1-2-3-', '"-".$a1."-".$a2."-".$a3."-"');
2919f11ffb7Safresh1    is("$a1$a2$a3", '123', '"$a1$a2$a3"');
2929f11ffb7Safresh1    is("$a1-$a2-$a3", '1-2-3', '"$a1-$a2-$a3"');
2939f11ffb7Safresh1    is("-$a1-$a2-$a3", '-1-2-3', '"-$a1-$a2-$a3"');
2949f11ffb7Safresh1    is("$a1-$a2-$a3-", '1-2-3-', '"$a1-$a2-$a3-"');
2959f11ffb7Safresh1    is("-$a1-$a2-$a3-", '-1-2-3-', '"-$a1-$a2-$a3-"');
2969f11ffb7Safresh1    $pkg  = "-";
2979f11ffb7Safresh1    is($pkg, '-', '$pkg  = "-"');
2989f11ffb7Safresh1    $pkg  = "-";
2999f11ffb7Safresh1    is($pkg, '-', '$pkg  = "-"');
3009f11ffb7Safresh1    $pkg  = "-";
3019f11ffb7Safresh1    is($pkg, '-', '$pkg  = "-"');
3029f11ffb7Safresh1    $pkg  = "-";
3039f11ffb7Safresh1    is($pkg, '-', '$pkg  = "-"');
3049f11ffb7Safresh1    $pkg  = $a1;
3059f11ffb7Safresh1    is($pkg, '1', '$pkg  = $a1');
3069f11ffb7Safresh1    $pkg  = "-".$a1;
3079f11ffb7Safresh1    is($pkg, '-1', '$pkg  = "-".$a1');
3089f11ffb7Safresh1    $pkg  = $a1."-";
3099f11ffb7Safresh1    is($pkg, '1-', '$pkg  = $a1."-"');
3109f11ffb7Safresh1    $pkg  = "-".$a1."-";
3119f11ffb7Safresh1    is($pkg, '-1-', '$pkg  = "-".$a1."-"');
3129f11ffb7Safresh1    $pkg  = "$a1";
3139f11ffb7Safresh1    is($pkg, '1', '$pkg  = "$a1"');
3149f11ffb7Safresh1    $pkg  = "-$a1";
3159f11ffb7Safresh1    is($pkg, '-1', '$pkg  = "-$a1"');
3169f11ffb7Safresh1    $pkg  = "$a1-";
3179f11ffb7Safresh1    is($pkg, '1-', '$pkg  = "$a1-"');
3189f11ffb7Safresh1    $pkg  = "-$a1-";
3199f11ffb7Safresh1    is($pkg, '-1-', '$pkg  = "-$a1-"');
3209f11ffb7Safresh1    $pkg  = $a1.$a2;
3219f11ffb7Safresh1    is($pkg, '12', '$pkg  = $a1.$a2');
3229f11ffb7Safresh1    $pkg  = $a1."-".$a2;
3239f11ffb7Safresh1    is($pkg, '1-2', '$pkg  = $a1."-".$a2');
3249f11ffb7Safresh1    $pkg  = "-".$a1."-".$a2;
3259f11ffb7Safresh1    is($pkg, '-1-2', '$pkg  = "-".$a1."-".$a2');
3269f11ffb7Safresh1    $pkg  = $a1."-".$a2."-";
3279f11ffb7Safresh1    is($pkg, '1-2-', '$pkg  = $a1."-".$a2."-"');
3289f11ffb7Safresh1    $pkg  = "-".$a1."-".$a2."-";
3299f11ffb7Safresh1    is($pkg, '-1-2-', '$pkg  = "-".$a1."-".$a2."-"');
3309f11ffb7Safresh1    $pkg  = "$a1$a2";
3319f11ffb7Safresh1    is($pkg, '12', '$pkg  = "$a1$a2"');
3329f11ffb7Safresh1    $pkg  = "$a1-$a2";
3339f11ffb7Safresh1    is($pkg, '1-2', '$pkg  = "$a1-$a2"');
3349f11ffb7Safresh1    $pkg  = "-$a1-$a2";
3359f11ffb7Safresh1    is($pkg, '-1-2', '$pkg  = "-$a1-$a2"');
3369f11ffb7Safresh1    $pkg  = "$a1-$a2-";
3379f11ffb7Safresh1    is($pkg, '1-2-', '$pkg  = "$a1-$a2-"');
3389f11ffb7Safresh1    $pkg  = "-$a1-$a2-";
3399f11ffb7Safresh1    is($pkg, '-1-2-', '$pkg  = "-$a1-$a2-"');
3409f11ffb7Safresh1    $pkg  = $a1.$a2.$a3;
3419f11ffb7Safresh1    is($pkg, '123', '$pkg  = $a1.$a2.$a3');
3429f11ffb7Safresh1    $pkg  = $a1."-".$a2."-".$a3;
3439f11ffb7Safresh1    is($pkg, '1-2-3', '$pkg  = $a1."-".$a2."-".$a3');
3449f11ffb7Safresh1    $pkg  = "-".$a1."-".$a2."-".$a3;
3459f11ffb7Safresh1    is($pkg, '-1-2-3', '$pkg  = "-".$a1."-".$a2."-".$a3');
3469f11ffb7Safresh1    $pkg  = $a1."-".$a2."-".$a3."-";
3479f11ffb7Safresh1    is($pkg, '1-2-3-', '$pkg  = $a1."-".$a2."-".$a3."-"');
3489f11ffb7Safresh1    $pkg  = "-".$a1."-".$a2."-".$a3."-";
3499f11ffb7Safresh1    is($pkg, '-1-2-3-', '$pkg  = "-".$a1."-".$a2."-".$a3."-"');
3509f11ffb7Safresh1    $pkg  = "$a1$a2$a3";
3519f11ffb7Safresh1    is($pkg, '123', '$pkg  = "$a1$a2$a3"');
3529f11ffb7Safresh1    $pkg  = "$a1-$a2-$a3";
3539f11ffb7Safresh1    is($pkg, '1-2-3', '$pkg  = "$a1-$a2-$a3"');
3549f11ffb7Safresh1    $pkg  = "-$a1-$a2-$a3";
3559f11ffb7Safresh1    is($pkg, '-1-2-3', '$pkg  = "-$a1-$a2-$a3"');
3569f11ffb7Safresh1    $pkg  = "$a1-$a2-$a3-";
3579f11ffb7Safresh1    is($pkg, '1-2-3-', '$pkg  = "$a1-$a2-$a3-"');
3589f11ffb7Safresh1    $pkg  = "-$a1-$a2-$a3-";
3599f11ffb7Safresh1    is($pkg, '-1-2-3-', '$pkg  = "-$a1-$a2-$a3-"');
3609f11ffb7Safresh1    $pkg = 'P';
3619f11ffb7Safresh1    $pkg .= "-";
3629f11ffb7Safresh1    is($pkg, 'P-', '$pkg .= "-"');
3639f11ffb7Safresh1    $pkg = 'P';
3649f11ffb7Safresh1    $pkg .= "-";
3659f11ffb7Safresh1    is($pkg, 'P-', '$pkg .= "-"');
3669f11ffb7Safresh1    $pkg = 'P';
3679f11ffb7Safresh1    $pkg .= "-";
3689f11ffb7Safresh1    is($pkg, 'P-', '$pkg .= "-"');
3699f11ffb7Safresh1    $pkg = 'P';
3709f11ffb7Safresh1    $pkg .= "-";
3719f11ffb7Safresh1    is($pkg, 'P-', '$pkg .= "-"');
3729f11ffb7Safresh1    $pkg = 'P';
3739f11ffb7Safresh1    $pkg .= $a1;
3749f11ffb7Safresh1    is($pkg, 'P1', '$pkg .= $a1');
3759f11ffb7Safresh1    $pkg = 'P';
3769f11ffb7Safresh1    $pkg .= "-".$a1;
3779f11ffb7Safresh1    is($pkg, 'P-1', '$pkg .= "-".$a1');
3789f11ffb7Safresh1    $pkg = 'P';
3799f11ffb7Safresh1    $pkg .= $a1."-";
3809f11ffb7Safresh1    is($pkg, 'P1-', '$pkg .= $a1."-"');
3819f11ffb7Safresh1    $pkg = 'P';
3829f11ffb7Safresh1    $pkg .= "-".$a1."-";
3839f11ffb7Safresh1    is($pkg, 'P-1-', '$pkg .= "-".$a1."-"');
3849f11ffb7Safresh1    $pkg = 'P';
3859f11ffb7Safresh1    $pkg .= "$a1";
3869f11ffb7Safresh1    is($pkg, 'P1', '$pkg .= "$a1"');
3879f11ffb7Safresh1    $pkg = 'P';
3889f11ffb7Safresh1    $pkg .= "-$a1";
3899f11ffb7Safresh1    is($pkg, 'P-1', '$pkg .= "-$a1"');
3909f11ffb7Safresh1    $pkg = 'P';
3919f11ffb7Safresh1    $pkg .= "$a1-";
3929f11ffb7Safresh1    is($pkg, 'P1-', '$pkg .= "$a1-"');
3939f11ffb7Safresh1    $pkg = 'P';
3949f11ffb7Safresh1    $pkg .= "-$a1-";
3959f11ffb7Safresh1    is($pkg, 'P-1-', '$pkg .= "-$a1-"');
3969f11ffb7Safresh1    $pkg = 'P';
3979f11ffb7Safresh1    $pkg .= $a1.$a2;
3989f11ffb7Safresh1    is($pkg, 'P12', '$pkg .= $a1.$a2');
3999f11ffb7Safresh1    $pkg = 'P';
4009f11ffb7Safresh1    $pkg .= $a1."-".$a2;
4019f11ffb7Safresh1    is($pkg, 'P1-2', '$pkg .= $a1."-".$a2');
4029f11ffb7Safresh1    $pkg = 'P';
4039f11ffb7Safresh1    $pkg .= "-".$a1."-".$a2;
4049f11ffb7Safresh1    is($pkg, 'P-1-2', '$pkg .= "-".$a1."-".$a2');
4059f11ffb7Safresh1    $pkg = 'P';
4069f11ffb7Safresh1    $pkg .= $a1."-".$a2."-";
4079f11ffb7Safresh1    is($pkg, 'P1-2-', '$pkg .= $a1."-".$a2."-"');
4089f11ffb7Safresh1    $pkg = 'P';
4099f11ffb7Safresh1    $pkg .= "-".$a1."-".$a2."-";
4109f11ffb7Safresh1    is($pkg, 'P-1-2-', '$pkg .= "-".$a1."-".$a2."-"');
4119f11ffb7Safresh1    $pkg = 'P';
4129f11ffb7Safresh1    $pkg .= "$a1$a2";
4139f11ffb7Safresh1    is($pkg, 'P12', '$pkg .= "$a1$a2"');
4149f11ffb7Safresh1    $pkg = 'P';
4159f11ffb7Safresh1    $pkg .= "$a1-$a2";
4169f11ffb7Safresh1    is($pkg, 'P1-2', '$pkg .= "$a1-$a2"');
4179f11ffb7Safresh1    $pkg = 'P';
4189f11ffb7Safresh1    $pkg .= "-$a1-$a2";
4199f11ffb7Safresh1    is($pkg, 'P-1-2', '$pkg .= "-$a1-$a2"');
4209f11ffb7Safresh1    $pkg = 'P';
4219f11ffb7Safresh1    $pkg .= "$a1-$a2-";
4229f11ffb7Safresh1    is($pkg, 'P1-2-', '$pkg .= "$a1-$a2-"');
4239f11ffb7Safresh1    $pkg = 'P';
4249f11ffb7Safresh1    $pkg .= "-$a1-$a2-";
4259f11ffb7Safresh1    is($pkg, 'P-1-2-', '$pkg .= "-$a1-$a2-"');
4269f11ffb7Safresh1    $pkg = 'P';
4279f11ffb7Safresh1    $pkg .= $a1.$a2.$a3;
4289f11ffb7Safresh1    is($pkg, 'P123', '$pkg .= $a1.$a2.$a3');
4299f11ffb7Safresh1    $pkg = 'P';
4309f11ffb7Safresh1    $pkg .= $a1."-".$a2."-".$a3;
4319f11ffb7Safresh1    is($pkg, 'P1-2-3', '$pkg .= $a1."-".$a2."-".$a3');
4329f11ffb7Safresh1    $pkg = 'P';
4339f11ffb7Safresh1    $pkg .= "-".$a1."-".$a2."-".$a3;
4349f11ffb7Safresh1    is($pkg, 'P-1-2-3', '$pkg .= "-".$a1."-".$a2."-".$a3');
4359f11ffb7Safresh1    $pkg = 'P';
4369f11ffb7Safresh1    $pkg .= $a1."-".$a2."-".$a3."-";
4379f11ffb7Safresh1    is($pkg, 'P1-2-3-', '$pkg .= $a1."-".$a2."-".$a3."-"');
4389f11ffb7Safresh1    $pkg = 'P';
4399f11ffb7Safresh1    $pkg .= "-".$a1."-".$a2."-".$a3."-";
4409f11ffb7Safresh1    is($pkg, 'P-1-2-3-', '$pkg .= "-".$a1."-".$a2."-".$a3."-"');
4419f11ffb7Safresh1    $pkg = 'P';
4429f11ffb7Safresh1    $pkg .= "$a1$a2$a3";
4439f11ffb7Safresh1    is($pkg, 'P123', '$pkg .= "$a1$a2$a3"');
4449f11ffb7Safresh1    $pkg = 'P';
4459f11ffb7Safresh1    $pkg .= "$a1-$a2-$a3";
4469f11ffb7Safresh1    is($pkg, 'P1-2-3', '$pkg .= "$a1-$a2-$a3"');
4479f11ffb7Safresh1    $pkg = 'P';
4489f11ffb7Safresh1    $pkg .= "-$a1-$a2-$a3";
4499f11ffb7Safresh1    is($pkg, 'P-1-2-3', '$pkg .= "-$a1-$a2-$a3"');
4509f11ffb7Safresh1    $pkg = 'P';
4519f11ffb7Safresh1    $pkg .= "$a1-$a2-$a3-";
4529f11ffb7Safresh1    is($pkg, 'P1-2-3-', '$pkg .= "$a1-$a2-$a3-"');
4539f11ffb7Safresh1    $pkg = 'P';
4549f11ffb7Safresh1    $pkg .= "-$a1-$a2-$a3-";
4559f11ffb7Safresh1    is($pkg, 'P-1-2-3-', '$pkg .= "-$a1-$a2-$a3-"');
4569f11ffb7Safresh1    $lex  = "-";
4579f11ffb7Safresh1    is($lex, '-', '$lex  = "-"');
4589f11ffb7Safresh1    $lex  = "-";
4599f11ffb7Safresh1    is($lex, '-', '$lex  = "-"');
4609f11ffb7Safresh1    $lex  = "-";
4619f11ffb7Safresh1    is($lex, '-', '$lex  = "-"');
4629f11ffb7Safresh1    $lex  = "-";
4639f11ffb7Safresh1    is($lex, '-', '$lex  = "-"');
4649f11ffb7Safresh1    $lex  = $a1;
4659f11ffb7Safresh1    is($lex, '1', '$lex  = $a1');
4669f11ffb7Safresh1    $lex  = "-".$a1;
4679f11ffb7Safresh1    is($lex, '-1', '$lex  = "-".$a1');
4689f11ffb7Safresh1    $lex  = $a1."-";
4699f11ffb7Safresh1    is($lex, '1-', '$lex  = $a1."-"');
4709f11ffb7Safresh1    $lex  = "-".$a1."-";
4719f11ffb7Safresh1    is($lex, '-1-', '$lex  = "-".$a1."-"');
4729f11ffb7Safresh1    $lex  = "$a1";
4739f11ffb7Safresh1    is($lex, '1', '$lex  = "$a1"');
4749f11ffb7Safresh1    $lex  = "-$a1";
4759f11ffb7Safresh1    is($lex, '-1', '$lex  = "-$a1"');
4769f11ffb7Safresh1    $lex  = "$a1-";
4779f11ffb7Safresh1    is($lex, '1-', '$lex  = "$a1-"');
4789f11ffb7Safresh1    $lex  = "-$a1-";
4799f11ffb7Safresh1    is($lex, '-1-', '$lex  = "-$a1-"');
4809f11ffb7Safresh1    $lex  = $a1.$a2;
4819f11ffb7Safresh1    is($lex, '12', '$lex  = $a1.$a2');
4829f11ffb7Safresh1    $lex  = $a1."-".$a2;
4839f11ffb7Safresh1    is($lex, '1-2', '$lex  = $a1."-".$a2');
4849f11ffb7Safresh1    $lex  = "-".$a1."-".$a2;
4859f11ffb7Safresh1    is($lex, '-1-2', '$lex  = "-".$a1."-".$a2');
4869f11ffb7Safresh1    $lex  = $a1."-".$a2."-";
4879f11ffb7Safresh1    is($lex, '1-2-', '$lex  = $a1."-".$a2."-"');
4889f11ffb7Safresh1    $lex  = "-".$a1."-".$a2."-";
4899f11ffb7Safresh1    is($lex, '-1-2-', '$lex  = "-".$a1."-".$a2."-"');
4909f11ffb7Safresh1    $lex  = "$a1$a2";
4919f11ffb7Safresh1    is($lex, '12', '$lex  = "$a1$a2"');
4929f11ffb7Safresh1    $lex  = "$a1-$a2";
4939f11ffb7Safresh1    is($lex, '1-2', '$lex  = "$a1-$a2"');
4949f11ffb7Safresh1    $lex  = "-$a1-$a2";
4959f11ffb7Safresh1    is($lex, '-1-2', '$lex  = "-$a1-$a2"');
4969f11ffb7Safresh1    $lex  = "$a1-$a2-";
4979f11ffb7Safresh1    is($lex, '1-2-', '$lex  = "$a1-$a2-"');
4989f11ffb7Safresh1    $lex  = "-$a1-$a2-";
4999f11ffb7Safresh1    is($lex, '-1-2-', '$lex  = "-$a1-$a2-"');
5009f11ffb7Safresh1    $lex  = $a1.$a2.$a3;
5019f11ffb7Safresh1    is($lex, '123', '$lex  = $a1.$a2.$a3');
5029f11ffb7Safresh1    $lex  = $a1."-".$a2."-".$a3;
5039f11ffb7Safresh1    is($lex, '1-2-3', '$lex  = $a1."-".$a2."-".$a3');
5049f11ffb7Safresh1    $lex  = "-".$a1."-".$a2."-".$a3;
5059f11ffb7Safresh1    is($lex, '-1-2-3', '$lex  = "-".$a1."-".$a2."-".$a3');
5069f11ffb7Safresh1    $lex  = $a1."-".$a2."-".$a3."-";
5079f11ffb7Safresh1    is($lex, '1-2-3-', '$lex  = $a1."-".$a2."-".$a3."-"');
5089f11ffb7Safresh1    $lex  = "-".$a1."-".$a2."-".$a3."-";
5099f11ffb7Safresh1    is($lex, '-1-2-3-', '$lex  = "-".$a1."-".$a2."-".$a3."-"');
5109f11ffb7Safresh1    $lex  = "$a1$a2$a3";
5119f11ffb7Safresh1    is($lex, '123', '$lex  = "$a1$a2$a3"');
5129f11ffb7Safresh1    $lex  = "$a1-$a2-$a3";
5139f11ffb7Safresh1    is($lex, '1-2-3', '$lex  = "$a1-$a2-$a3"');
5149f11ffb7Safresh1    $lex  = "-$a1-$a2-$a3";
5159f11ffb7Safresh1    is($lex, '-1-2-3', '$lex  = "-$a1-$a2-$a3"');
5169f11ffb7Safresh1    $lex  = "$a1-$a2-$a3-";
5179f11ffb7Safresh1    is($lex, '1-2-3-', '$lex  = "$a1-$a2-$a3-"');
5189f11ffb7Safresh1    $lex  = "-$a1-$a2-$a3-";
5199f11ffb7Safresh1    is($lex, '-1-2-3-', '$lex  = "-$a1-$a2-$a3-"');
5209f11ffb7Safresh1    $lex = 'L';
5219f11ffb7Safresh1    $lex .= "-";
5229f11ffb7Safresh1    is($lex, 'L-', '$lex .= "-"');
5239f11ffb7Safresh1    $lex = 'L';
5249f11ffb7Safresh1    $lex .= "-";
5259f11ffb7Safresh1    is($lex, 'L-', '$lex .= "-"');
5269f11ffb7Safresh1    $lex = 'L';
5279f11ffb7Safresh1    $lex .= "-";
5289f11ffb7Safresh1    is($lex, 'L-', '$lex .= "-"');
5299f11ffb7Safresh1    $lex = 'L';
5309f11ffb7Safresh1    $lex .= "-";
5319f11ffb7Safresh1    is($lex, 'L-', '$lex .= "-"');
5329f11ffb7Safresh1    $lex = 'L';
5339f11ffb7Safresh1    $lex .= $a1;
5349f11ffb7Safresh1    is($lex, 'L1', '$lex .= $a1');
5359f11ffb7Safresh1    $lex = 'L';
5369f11ffb7Safresh1    $lex .= "-".$a1;
5379f11ffb7Safresh1    is($lex, 'L-1', '$lex .= "-".$a1');
5389f11ffb7Safresh1    $lex = 'L';
5399f11ffb7Safresh1    $lex .= $a1."-";
5409f11ffb7Safresh1    is($lex, 'L1-', '$lex .= $a1."-"');
5419f11ffb7Safresh1    $lex = 'L';
5429f11ffb7Safresh1    $lex .= "-".$a1."-";
5439f11ffb7Safresh1    is($lex, 'L-1-', '$lex .= "-".$a1."-"');
5449f11ffb7Safresh1    $lex = 'L';
5459f11ffb7Safresh1    $lex .= "$a1";
5469f11ffb7Safresh1    is($lex, 'L1', '$lex .= "$a1"');
5479f11ffb7Safresh1    $lex = 'L';
5489f11ffb7Safresh1    $lex .= "-$a1";
5499f11ffb7Safresh1    is($lex, 'L-1', '$lex .= "-$a1"');
5509f11ffb7Safresh1    $lex = 'L';
5519f11ffb7Safresh1    $lex .= "$a1-";
5529f11ffb7Safresh1    is($lex, 'L1-', '$lex .= "$a1-"');
5539f11ffb7Safresh1    $lex = 'L';
5549f11ffb7Safresh1    $lex .= "-$a1-";
5559f11ffb7Safresh1    is($lex, 'L-1-', '$lex .= "-$a1-"');
5569f11ffb7Safresh1    $lex = 'L';
5579f11ffb7Safresh1    $lex .= $a1.$a2;
5589f11ffb7Safresh1    is($lex, 'L12', '$lex .= $a1.$a2');
5599f11ffb7Safresh1    $lex = 'L';
5609f11ffb7Safresh1    $lex .= $a1."-".$a2;
5619f11ffb7Safresh1    is($lex, 'L1-2', '$lex .= $a1."-".$a2');
5629f11ffb7Safresh1    $lex = 'L';
5639f11ffb7Safresh1    $lex .= "-".$a1."-".$a2;
5649f11ffb7Safresh1    is($lex, 'L-1-2', '$lex .= "-".$a1."-".$a2');
5659f11ffb7Safresh1    $lex = 'L';
5669f11ffb7Safresh1    $lex .= $a1."-".$a2."-";
5679f11ffb7Safresh1    is($lex, 'L1-2-', '$lex .= $a1."-".$a2."-"');
5689f11ffb7Safresh1    $lex = 'L';
5699f11ffb7Safresh1    $lex .= "-".$a1."-".$a2."-";
5709f11ffb7Safresh1    is($lex, 'L-1-2-', '$lex .= "-".$a1."-".$a2."-"');
5719f11ffb7Safresh1    $lex = 'L';
5729f11ffb7Safresh1    $lex .= "$a1$a2";
5739f11ffb7Safresh1    is($lex, 'L12', '$lex .= "$a1$a2"');
5749f11ffb7Safresh1    $lex = 'L';
5759f11ffb7Safresh1    $lex .= "$a1-$a2";
5769f11ffb7Safresh1    is($lex, 'L1-2', '$lex .= "$a1-$a2"');
5779f11ffb7Safresh1    $lex = 'L';
5789f11ffb7Safresh1    $lex .= "-$a1-$a2";
5799f11ffb7Safresh1    is($lex, 'L-1-2', '$lex .= "-$a1-$a2"');
5809f11ffb7Safresh1    $lex = 'L';
5819f11ffb7Safresh1    $lex .= "$a1-$a2-";
5829f11ffb7Safresh1    is($lex, 'L1-2-', '$lex .= "$a1-$a2-"');
5839f11ffb7Safresh1    $lex = 'L';
5849f11ffb7Safresh1    $lex .= "-$a1-$a2-";
5859f11ffb7Safresh1    is($lex, 'L-1-2-', '$lex .= "-$a1-$a2-"');
5869f11ffb7Safresh1    $lex = 'L';
5879f11ffb7Safresh1    $lex .= $a1.$a2.$a3;
5889f11ffb7Safresh1    is($lex, 'L123', '$lex .= $a1.$a2.$a3');
5899f11ffb7Safresh1    $lex = 'L';
5909f11ffb7Safresh1    $lex .= $a1."-".$a2."-".$a3;
5919f11ffb7Safresh1    is($lex, 'L1-2-3', '$lex .= $a1."-".$a2."-".$a3');
5929f11ffb7Safresh1    $lex = 'L';
5939f11ffb7Safresh1    $lex .= "-".$a1."-".$a2."-".$a3;
5949f11ffb7Safresh1    is($lex, 'L-1-2-3', '$lex .= "-".$a1."-".$a2."-".$a3');
5959f11ffb7Safresh1    $lex = 'L';
5969f11ffb7Safresh1    $lex .= $a1."-".$a2."-".$a3."-";
5979f11ffb7Safresh1    is($lex, 'L1-2-3-', '$lex .= $a1."-".$a2."-".$a3."-"');
5989f11ffb7Safresh1    $lex = 'L';
5999f11ffb7Safresh1    $lex .= "-".$a1."-".$a2."-".$a3."-";
6009f11ffb7Safresh1    is($lex, 'L-1-2-3-', '$lex .= "-".$a1."-".$a2."-".$a3."-"');
6019f11ffb7Safresh1    $lex = 'L';
6029f11ffb7Safresh1    $lex .= "$a1$a2$a3";
6039f11ffb7Safresh1    is($lex, 'L123', '$lex .= "$a1$a2$a3"');
6049f11ffb7Safresh1    $lex = 'L';
6059f11ffb7Safresh1    $lex .= "$a1-$a2-$a3";
6069f11ffb7Safresh1    is($lex, 'L1-2-3', '$lex .= "$a1-$a2-$a3"');
6079f11ffb7Safresh1    $lex = 'L';
6089f11ffb7Safresh1    $lex .= "-$a1-$a2-$a3";
6099f11ffb7Safresh1    is($lex, 'L-1-2-3', '$lex .= "-$a1-$a2-$a3"');
6109f11ffb7Safresh1    $lex = 'L';
6119f11ffb7Safresh1    $lex .= "$a1-$a2-$a3-";
6129f11ffb7Safresh1    is($lex, 'L1-2-3-', '$lex .= "$a1-$a2-$a3-"');
6139f11ffb7Safresh1    $lex = 'L';
6149f11ffb7Safresh1    $lex .= "-$a1-$a2-$a3-";
6159f11ffb7Safresh1    is($lex, 'L-1-2-3-', '$lex .= "-$a1-$a2-$a3-"');
6169f11ffb7Safresh1    {
6179f11ffb7Safresh1        my $l = "-";
6189f11ffb7Safresh1        is($l, '-', 'my $l = "-"');
6199f11ffb7Safresh1    }
6209f11ffb7Safresh1    {
6219f11ffb7Safresh1        my $l = "-";
6229f11ffb7Safresh1        is($l, '-', 'my $l = "-"');
6239f11ffb7Safresh1    }
6249f11ffb7Safresh1    {
6259f11ffb7Safresh1        my $l = "-";
6269f11ffb7Safresh1        is($l, '-', 'my $l = "-"');
6279f11ffb7Safresh1    }
6289f11ffb7Safresh1    {
6299f11ffb7Safresh1        my $l = "-";
6309f11ffb7Safresh1        is($l, '-', 'my $l = "-"');
6319f11ffb7Safresh1    }
6329f11ffb7Safresh1    {
6339f11ffb7Safresh1        my $l = $a1;
6349f11ffb7Safresh1        is($l, '1', 'my $l = $a1');
6359f11ffb7Safresh1    }
6369f11ffb7Safresh1    {
6379f11ffb7Safresh1        my $l = "-".$a1;
6389f11ffb7Safresh1        is($l, '-1', 'my $l = "-".$a1');
6399f11ffb7Safresh1    }
6409f11ffb7Safresh1    {
6419f11ffb7Safresh1        my $l = $a1."-";
6429f11ffb7Safresh1        is($l, '1-', 'my $l = $a1."-"');
6439f11ffb7Safresh1    }
6449f11ffb7Safresh1    {
6459f11ffb7Safresh1        my $l = "-".$a1."-";
6469f11ffb7Safresh1        is($l, '-1-', 'my $l = "-".$a1."-"');
6479f11ffb7Safresh1    }
6489f11ffb7Safresh1    {
6499f11ffb7Safresh1        my $l = "$a1";
6509f11ffb7Safresh1        is($l, '1', 'my $l = "$a1"');
6519f11ffb7Safresh1    }
6529f11ffb7Safresh1    {
6539f11ffb7Safresh1        my $l = "-$a1";
6549f11ffb7Safresh1        is($l, '-1', 'my $l = "-$a1"');
6559f11ffb7Safresh1    }
6569f11ffb7Safresh1    {
6579f11ffb7Safresh1        my $l = "$a1-";
6589f11ffb7Safresh1        is($l, '1-', 'my $l = "$a1-"');
6599f11ffb7Safresh1    }
6609f11ffb7Safresh1    {
6619f11ffb7Safresh1        my $l = "-$a1-";
6629f11ffb7Safresh1        is($l, '-1-', 'my $l = "-$a1-"');
6639f11ffb7Safresh1    }
6649f11ffb7Safresh1    {
6659f11ffb7Safresh1        my $l = $a1.$a2;
6669f11ffb7Safresh1        is($l, '12', 'my $l = $a1.$a2');
6679f11ffb7Safresh1    }
6689f11ffb7Safresh1    {
6699f11ffb7Safresh1        my $l = $a1."-".$a2;
6709f11ffb7Safresh1        is($l, '1-2', 'my $l = $a1."-".$a2');
6719f11ffb7Safresh1    }
6729f11ffb7Safresh1    {
6739f11ffb7Safresh1        my $l = "-".$a1."-".$a2;
6749f11ffb7Safresh1        is($l, '-1-2', 'my $l = "-".$a1."-".$a2');
6759f11ffb7Safresh1    }
6769f11ffb7Safresh1    {
6779f11ffb7Safresh1        my $l = $a1."-".$a2."-";
6789f11ffb7Safresh1        is($l, '1-2-', 'my $l = $a1."-".$a2."-"');
6799f11ffb7Safresh1    }
6809f11ffb7Safresh1    {
6819f11ffb7Safresh1        my $l = "-".$a1."-".$a2."-";
6829f11ffb7Safresh1        is($l, '-1-2-', 'my $l = "-".$a1."-".$a2."-"');
6839f11ffb7Safresh1    }
6849f11ffb7Safresh1    {
6859f11ffb7Safresh1        my $l = "$a1$a2";
6869f11ffb7Safresh1        is($l, '12', 'my $l = "$a1$a2"');
6879f11ffb7Safresh1    }
6889f11ffb7Safresh1    {
6899f11ffb7Safresh1        my $l = "$a1-$a2";
6909f11ffb7Safresh1        is($l, '1-2', 'my $l = "$a1-$a2"');
6919f11ffb7Safresh1    }
6929f11ffb7Safresh1    {
6939f11ffb7Safresh1        my $l = "-$a1-$a2";
6949f11ffb7Safresh1        is($l, '-1-2', 'my $l = "-$a1-$a2"');
6959f11ffb7Safresh1    }
6969f11ffb7Safresh1    {
6979f11ffb7Safresh1        my $l = "$a1-$a2-";
6989f11ffb7Safresh1        is($l, '1-2-', 'my $l = "$a1-$a2-"');
6999f11ffb7Safresh1    }
7009f11ffb7Safresh1    {
7019f11ffb7Safresh1        my $l = "-$a1-$a2-";
7029f11ffb7Safresh1        is($l, '-1-2-', 'my $l = "-$a1-$a2-"');
7039f11ffb7Safresh1    }
7049f11ffb7Safresh1    {
7059f11ffb7Safresh1        my $l = $a1.$a2.$a3;
7069f11ffb7Safresh1        is($l, '123', 'my $l = $a1.$a2.$a3');
7079f11ffb7Safresh1    }
7089f11ffb7Safresh1    {
7099f11ffb7Safresh1        my $l = $a1."-".$a2."-".$a3;
7109f11ffb7Safresh1        is($l, '1-2-3', 'my $l = $a1."-".$a2."-".$a3');
7119f11ffb7Safresh1    }
7129f11ffb7Safresh1    {
7139f11ffb7Safresh1        my $l = "-".$a1."-".$a2."-".$a3;
7149f11ffb7Safresh1        is($l, '-1-2-3', 'my $l = "-".$a1."-".$a2."-".$a3');
7159f11ffb7Safresh1    }
7169f11ffb7Safresh1    {
7179f11ffb7Safresh1        my $l = $a1."-".$a2."-".$a3."-";
7189f11ffb7Safresh1        is($l, '1-2-3-', 'my $l = $a1."-".$a2."-".$a3."-"');
7199f11ffb7Safresh1    }
7209f11ffb7Safresh1    {
7219f11ffb7Safresh1        my $l = "-".$a1."-".$a2."-".$a3."-";
7229f11ffb7Safresh1        is($l, '-1-2-3-', 'my $l = "-".$a1."-".$a2."-".$a3."-"');
7239f11ffb7Safresh1    }
7249f11ffb7Safresh1    {
7259f11ffb7Safresh1        my $l = "$a1$a2$a3";
7269f11ffb7Safresh1        is($l, '123', 'my $l = "$a1$a2$a3"');
7279f11ffb7Safresh1    }
7289f11ffb7Safresh1    {
7299f11ffb7Safresh1        my $l = "$a1-$a2-$a3";
7309f11ffb7Safresh1        is($l, '1-2-3', 'my $l = "$a1-$a2-$a3"');
7319f11ffb7Safresh1    }
7329f11ffb7Safresh1    {
7339f11ffb7Safresh1        my $l = "-$a1-$a2-$a3";
7349f11ffb7Safresh1        is($l, '-1-2-3', 'my $l = "-$a1-$a2-$a3"');
7359f11ffb7Safresh1    }
7369f11ffb7Safresh1    {
7379f11ffb7Safresh1        my $l = "$a1-$a2-$a3-";
7389f11ffb7Safresh1        is($l, '1-2-3-', 'my $l = "$a1-$a2-$a3-"');
7399f11ffb7Safresh1    }
7409f11ffb7Safresh1    {
7419f11ffb7Safresh1        my $l = "-$a1-$a2-$a3-";
7429f11ffb7Safresh1        is($l, '-1-2-3-', 'my $l = "-$a1-$a2-$a3-"');
7439f11ffb7Safresh1    }
7449f11ffb7Safresh1}
7459f11ffb7Safresh1
7469f11ffb7Safresh1# multiconcat optimises away scalar assign, and is responsible
7479f11ffb7Safresh1# for handling the assign itself. If the LHS is something weird,
7489f11ffb7Safresh1# make sure it's handled ok
7499f11ffb7Safresh1
7509f11ffb7Safresh1{
7519f11ffb7Safresh1    my $a = 'a';
7529f11ffb7Safresh1    my $b = 'b';
7539f11ffb7Safresh1    my $o = 'o';
7549f11ffb7Safresh1
7559f11ffb7Safresh1    my $re = qr/abc/;
7569f11ffb7Safresh1    $$re = $a . $b;
7579f11ffb7Safresh1    is($$re, "ab", '$$re = $a . $b');
7589f11ffb7Safresh1
7599f11ffb7Safresh1    #passing a hash elem to a sub creates a PVLV
7609f11ffb7Safresh1    my $s = sub { $_[0] = $a . $b; };
7619f11ffb7Safresh1    my %h;
7629f11ffb7Safresh1    $s->($h{foo});
7639f11ffb7Safresh1    is($h{foo}, "ab", "PVLV");
7649f11ffb7Safresh1
7659f11ffb7Safresh1    # assigning a string to a typeglob creates an alias
7669f11ffb7Safresh1    $Foo = 'myfoo';
7679f11ffb7Safresh1    *Bar = ("F" . $o . $o);
7689f11ffb7Safresh1    is($Bar, "myfoo", '*Bar = "Foo"');
7699f11ffb7Safresh1
7709f11ffb7Safresh1    # while that same typeglob also appearing on the RHS returns
7719f11ffb7Safresh1    # a stringified value
7729f11ffb7Safresh1
7739f11ffb7Safresh1    package QPR {
7749f11ffb7Safresh1        ${'*QPR::Bar*QPR::BarBaz'} = 'myfoobarbaz';
7759f11ffb7Safresh1        *Bar = (*Bar  . *Bar . "Baz");
7769f11ffb7Safresh1        ::is($Bar, "myfoobarbaz", '*Bar =  (*Bar  . *Bar . "Baz")');
7779f11ffb7Safresh1    }
7789f11ffb7Safresh1}
7799f11ffb7Safresh1
7809f11ffb7Safresh1# distinguish between '=' and  '.=' where the LHS has the OPf_MOD flag
7819f11ffb7Safresh1
7829f11ffb7Safresh1{
7839f11ffb7Safresh1    my $foo = "foo";
7849f11ffb7Safresh1    my $a . $foo; # weird but legal
7859f11ffb7Safresh1    is($a, '', 'my $a . $foo');
7869f11ffb7Safresh1    my $b; $b .= $foo;
7879f11ffb7Safresh1    is($b, 'foo', 'my $b; $b .= $foo');
7889f11ffb7Safresh1}
7899f11ffb7Safresh1
7909f11ffb7Safresh1# distinguish between nested appends and concats; the former is
7919f11ffb7Safresh1# affected by the change of value of the target on each concat.
7929f11ffb7Safresh1# This is why multiconcat shouldn't be used in that case
7939f11ffb7Safresh1
7949f11ffb7Safresh1{
7959f11ffb7Safresh1    my $a = "a";
7969f11ffb7Safresh1    (($a .= $a) .= $a) .= $a;
7979f11ffb7Safresh1    is($a, "aaaaaaaa", '(($a .= $a) .= $a) .= $a;');
7989f11ffb7Safresh1}
7999f11ffb7Safresh1
8009f11ffb7Safresh1# check everything works ok near the max arg size of a multiconcat
8019f11ffb7Safresh1
8029f11ffb7Safresh1{
8039f11ffb7Safresh1    my @a = map "<$_>", 0..99;
8049f11ffb7Safresh1    for my $i (60..68) { # check each side of 64 threshold
8059f11ffb7Safresh1        my $c = join '.', map "\$a[$_]", 0..$i;
8069f11ffb7Safresh1        my $got = eval $c or die $@;
8079f11ffb7Safresh1        my $empty = ''; # don't use a const string in case join'' ever
8089f11ffb7Safresh1                        # gets optimised into a multiconcat
8099f11ffb7Safresh1        my $expected = join $empty, @a[0..$i];
8109f11ffb7Safresh1        is($got, $expected, "long concat chain $i");
8119f11ffb7Safresh1    }
8129f11ffb7Safresh1}
8139f11ffb7Safresh1
8149f11ffb7Safresh1# RT #132646
8159f11ffb7Safresh1# with adjacent consts, the second const is treated as an arg rather than a
8169f11ffb7Safresh1# consts. Make sure this doesn't exceeed the maximum allowed number of
8179f11ffb7Safresh1# args
8189f11ffb7Safresh1{
8199f11ffb7Safresh1    my $x = 'X';
8209f11ffb7Safresh1    my $got =
8219f11ffb7Safresh1          'A' . $x . 'B' . 'C' . $x . 'D'
8229f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8239f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8249f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8259f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8269f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8279f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8289f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8299f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8309f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8319f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8329f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8339f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8349f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8359f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8369f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8379f11ffb7Safresh1        . 'A' . $x . 'B' . 'C' . $x . 'D'
8389f11ffb7Safresh1        ;
8399f11ffb7Safresh1    is ($got,
8409f11ffb7Safresh1        "AXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXDAXBCXD",
8419f11ffb7Safresh1        "RT #132646");
8429f11ffb7Safresh1}
8439f11ffb7Safresh1
8449f11ffb7Safresh1# RT #132595
8459f11ffb7Safresh1# multiconcat shouldn't affect the order of arg evaluation
8469f11ffb7Safresh1package RT132595 {
8479f11ffb7Safresh1    my $a = "a";
8489f11ffb7Safresh1    my $i = 0;
8499f11ffb7Safresh1    sub TIESCALAR { bless({}, $_[0]) }
8509f11ffb7Safresh1    sub FETCH { ++$i; $a = "b".$i; "c".$i }
8519f11ffb7Safresh1    my $t;
8529f11ffb7Safresh1    tie $t, "RT132595";
8539f11ffb7Safresh1    my $res = $a.$t.$a.$t;
8549f11ffb7Safresh1    ::is($res, "b1c1b1c2", "RT #132595");
8559f11ffb7Safresh1}
856*b46d8ef2Safresh1
857*b46d8ef2Safresh1# RT #133441
858*b46d8ef2Safresh1# multiconcat wasn't seeing a mutator as a mutator
859*b46d8ef2Safresh1{
860*b46d8ef2Safresh1    my ($a, $b)  = qw(a b);
861*b46d8ef2Safresh1    ($a = 'A'.$b) .= 'c';
862*b46d8ef2Safresh1    is($a, "Abc", "RT #133441");
863*b46d8ef2Safresh1}
864