diff options
author | Father Chrysostomos <sprout@cpan.org> | 2015-02-07 19:22:00 -0800 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2015-02-07 19:22:00 -0800 |
commit | eea89386b3fb948a8b1eb5ea860ec0a970c9e559 (patch) | |
tree | 9ef2b1c60f57ea3d8a457f6a0fb8b9bc46b76a84 /t/op/lex.t | |
parent | 218721242848e642c0d1399644b6a90969e485e3 (diff) | |
download | perl-eea89386b3fb948a8b1eb5ea860ec0a970c9e559.tar.gz |
[perl #123753] Assert fail with &{+foo} and errors
This fixes the problem mentioned in 3c47da3c2e with an op address
being used as flags. '&' not followed by a identifier was being fed
to the parser with a stale token value, left over from the previous
token that had a value, which might be an op address. This would
cause the flags on the op to vary randomly.
Usually the rv2cv op created this way is nulled, but if there is a
syntax error it may be freed before that happens. And it is when the
op is freed that the private flags are checked to make sure no invalid
flags have been set.
The test added to t/op/lex.t used to fail an assertion (for me) more
than half the time, but not always, because the 0x10 bit was being set
in op_private (rv2cv does not use that bit).
Diffstat (limited to 't/op/lex.t')
-rw-r--r-- | t/op/lex.t | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/t/op/lex.t b/t/op/lex.t index 07cdccad37..762d88830b 100644 --- a/t/op/lex.t +++ b/t/op/lex.t @@ -7,7 +7,7 @@ use warnings; BEGIN { chdir 't' if -d 't'; require './test.pl'; } -plan(tests => 16); +plan(tests => 17); { no warnings 'deprecated'; @@ -129,7 +129,7 @@ fresh_perl_is( '* <null> ident' ); SKIP: { - skip "Different output on EBCDIC (presumably)", 1 if ord("A") != 65; + skip "Different output on EBCDIC (presumably)", 2 if ord("A") != 65; fresh_perl_is( qq'"ab}"ax;&\0z\x8Ao}\x82x;', <<gibberish, Bareword found where operator expected at - line 1, near ""ab}"ax" @@ -140,4 +140,14 @@ gibberish { stderr => 1 }, 'gibberish containing &\0z - used to crash [perl #123753]' ); + fresh_perl_is( + qq'"ab}"ax;&{+z}\x8Ao}\x82x;', <<gibberish, +Bareword found where operator expected at - line 1, near ""ab}"ax" + (Missing operator before ax?) +syntax error at - line 1, near ""ab}"ax" +Unrecognized character \\x8A; marked by <-- HERE after }"ax;&{+z}<-- HERE near column 14 at - line 1. +gibberish + { stderr => 1 }, + 'gibberish containing &{+z} - used to crash [perl #123753]' + ); } |