}
require "./test.pl";
-plan( tests => 21 );
+plan( tests => 60 );
eval '%@x=0;';
like( $@, qr/^Can't modify hash dereference in repeat \(x\)/, '%@x=0' );
like( $@, qr/^Missing right brace on \\x/,
'syntax error in string, used to dump core' );
+eval q/"\N{"/;
+like( $@, qr/^Missing right brace on \\N/,
+ 'syntax error in string with incomplete \N' );
+eval q/"\Nfoo"/;
+like( $@, qr/^Missing braces on \\N/,
+ 'syntax error in string with incomplete \N' );
+
eval "a.b.c.d.e.f;sub";
like( $@, qr/^Illegal declaration of anonymous subroutine/,
'found by Markov chain stress testing' );
eval q{ "\c" };
like( $@, qr/^Missing control char name in \\c/, q("\c" string) );
+eval q{ qq(foo$) };
+like( $@, qr/Final \$ should be \\\$ or \$name/, q($ at end of "" string) );
+
# two tests for memory corruption problems in the said variables
# (used to dump core or produce strange results)
${a}{
}
+eval q{ sub a(;; &) { } a { } };
+is($@, '', "';&' sub prototype confuses the lexer");
+
# Bug #21575
# ensure that the second print statement works, by playing a bit
# with the test output.
print(
$data{foo});
pass();
+
+# Bug #21875
+# { q.* => ... } should be interpreted as hash, not block
+
+foreach my $line (split /\n/, <<'EOF')
+1 { foo => 'bar' }
+1 { qoo => 'bar' }
+1 { q => 'bar' }
+1 { qq => 'bar' }
+0 { q,'bar', }
+0 { q=bar= }
+0 { qq=bar= }
+1 { q=bar= => 'bar' }
+EOF
+{
+ my ($expect, $eval) = split / /, $line, 2;
+ my $result = eval $eval;
+ ok($@ eq '', "eval $eval");
+ is(ref $result, $expect ? 'HASH' : '', $eval);
+}
+
+# Bug #24212
+{
+ local $SIG{__WARN__} = sub { }; # silence mandatory warning
+ eval q{ my $x = -F 1; };
+ like( $@, qr/(?i:syntax|parse) error .* near "F 1"/, "unknown filetest operators" );
+ is(
+ eval q{ sub F { 42 } -F 1 },
+ '-42',
+ '-F calls the F function'
+ );
+}
+
+# Bug #24762
+{
+ eval q{ *foo{CODE} ? 1 : 0 };
+ is( $@, '', "glob subscript in conditional" );
+}
+
+# Bug #25824
+{
+ eval q{ sub f { @a=@b=@c; {use} } };
+ like( $@, qr/syntax error/, "use without body" );
+}
+
+# Bug #27024
+{
+ # this used to segfault (because $[=1 is optimized away to a null block)
+ my $x;
+ $[ = 1 while $x;
+ pass();
+ $[ = 0; # restore the original value for less side-effects
+}
+
+# [perl #2738] perl segfautls on input
+{
+ eval q{ sub _ <> {} };
+ like($@, qr/Illegal declaration of subroutine main::_/, "readline operator as prototype");
+
+ eval q{ $s = sub <> {} };
+ like($@, qr/Illegal declaration of anonymous subroutine/, "readline operator as prototype");
+
+ eval q{ sub _ __FILE__ {} };
+ like($@, qr/Illegal declaration of subroutine main::_/, "__FILE__ as prototype");
+}
+
+# [perl #36313] perl -e "1for$[=0" crash
+{
+ my $x;
+ $x = 1 for ($[) = 0;
+ pass('optimized assignment to $[ used to segfault in list context');
+ if ($[ = 0) { $x = 1 }
+ pass('optimized assignment to $[ used to segfault in scalar context');
+ $x = ($[=2.4);
+ is($x, 2, 'scalar assignment to $[ behaves like other variables');
+ $x = (($[) = 0);
+ is($x, 1, 'list assignment to $[ behaves like other variables');
+ $x = eval q{ ($[, $x) = (0) };
+ like($@, qr/That use of \$\[ is unsupported/,
+ 'cannot assign to $[ in a list');
+ eval q{ ($[) = (0, 1) };
+ like($@, qr/That use of \$\[ is unsupported/,
+ 'cannot assign list of >1 elements to $[');
+ eval q{ ($[) = () };
+ like($@, qr/That use of \$\[ is unsupported/,
+ 'cannot assign list of <1 elements to $[');
+}
+
+# tests for "Bad name"
+eval q{ foo::$bar };
+like( $@, qr/Bad name after foo::/, 'Bad name after foo::' );
+eval q{ foo''bar };
+like( $@, qr/Bad name after foo'/, 'Bad name after foo\'' );
+
+# test for ?: context error
+eval q{($a ? $x : ($y)) = 5};
+like( $@, qr/Assignment to both a list and a scalar/, 'Assignment to both a list and a scalar' );
+
+eval q{ s/x/#/e };
+is( $@, '', 'comments in s///e' );