# grep() and map() tests
#
-print "1..27\n";
+print "1..38\n";
$test = 1;
{ $_ & "X" } ("ok $test\n");
$test++;
}
+
+# Tests for "for" in "map" and "grep"
+# Used to dump core, bug [perl #17771]
+
+{
+ my @x;
+ my $y = '';
+ @x = map { $y .= $_ for 1..2; 1 } 3..4;
+ print "# @x,$y\n";
+ print "@x,$y" eq "1 1,1212" ? "ok $test\n" : "not ok $test\n";
+ $test++;
+ $y = '';
+ @x = map { $y .= $_ for 1..2; $y .= $_ } 3..4;
+ print "# @x,$y\n";
+ print "@x,$y" eq "123 123124,123124" ? "ok $test\n" : "not ok $test\n";
+ $test++;
+ $y = '';
+ @x = map { for (1..2) { $y .= $_ } $y .= $_ } 3..4;
+ print "# @x,$y\n";
+ print "@x,$y" eq "123 123124,123124" ? "ok $test\n" : "not ok $test\n";
+ $test++;
+ $y = '';
+ @x = grep { $y .= $_ for 1..2; 1 } 3..4;
+ print "# @x,$y\n";
+ print "@x,$y" eq "3 4,1212" ? "ok $test\n" : "not ok $test\n";
+ $test++;
+ $y = '';
+ @x = grep { for (1..2) { $y .= $_ } 1 } 3..4;
+ print "# @x,$y\n";
+ print "@x,$y" eq "3 4,1212" ? "ok $test\n" : "not ok $test\n";
+ $test++;
+
+ # Add also a sample test from [perl #18153]. (The same bug).
+ $a = 1; map {if ($a){}} (2);
+ print "ok $test\n"; # no core dump is all we need
+ $test++;
+}
+
+{
+ sub add_an_x(@){
+ map {"${_}x"} @_;
+ };
+ ok join("-",add_an_x(1,2,3,4)), "1x-2x-3x-4x";
+ $test++;
+}
+
+{
+ my $gimme;
+
+ sub gimme {
+ my $want = wantarray();
+ if (defined $want) {
+ $gimme = $want ? 'list' : 'scalar';
+ } else {
+ $gimme = 'void';
+ }
+ }
+
+ my @list = 0..9;
+
+ undef $gimme; gimme for @list; ok($gimme, 'void'); $test++;
+ undef $gimme; grep { gimme } @list; ok($gimme, 'scalar'); $test++;
+ undef $gimme; map { gimme } @list; ok($gimme, 'list'); $test++;
+}
+
+{
+ # This shouldn't loop indefinitively.
+ my @empty = map { while (1) {} } ();
+ ok("@empty", '');
+}