diff options
-rw-r--r-- | t/uni/variables.t | 28 | ||||
-rw-r--r-- | toke.c | 15 |
2 files changed, 33 insertions, 10 deletions
diff --git a/t/uni/variables.t b/t/uni/variables.t index 9a469d6e42..cee681fd08 100644 --- a/t/uni/variables.t +++ b/t/uni/variables.t @@ -12,7 +12,7 @@ use utf8; use open qw( :utf8 :std ); no warnings qw(misc reserved); -plan (tests => 65856); +plan (tests => 65869); # ${single:colon} should not be valid syntax { @@ -201,3 +201,29 @@ EOP ); } } + +{ + # bleadperl v5.17.9-109-g3283393 breaks JEREMY/File-Signature-1.009.tar.gz + # https://rt.perl.org/rt3/Ticket/Display.html?id=117145 + local $@; + my $var = 10; + eval ' ${ var }'; + + is( + $@, + '', + '${ var } works under strict' + ); + + { + no strict; + for my $var ( '$', "\7LOBAL_PHASE", "^GLOBAL_PHASE", "^V" ) { + eval "\${ $var}"; + is($@, '', "\${ $var} works" ); + eval "\${$var }"; + is($@, '', "\${$var } works" ); + eval "\${ $var }"; + is($@, '', "\${ $var } works" ); + } + } +} @@ -9292,6 +9292,8 @@ S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck if (*s == '{') { bracket = s; s++; + while (s < send && SPACE_OR_TAB(*s)) + s++; } #define VALID_LEN_ONE_IDENT(d, u) (isPUNCT_A((U8)*(d)) \ @@ -9320,15 +9322,6 @@ S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck else if (ck_uni && !bracket) check_uni(); if (bracket) { - if (isSPACE(s[-1])) { - while (s < send) { - const char ch = *s++; - if (!SPACE_OR_TAB(ch)) { - *d = ch; - break; - } - } - } if (isIDFIRST_lazy_if(d,is_utf8)) { d += is_utf8 ? UTF8SKIP(d) : 1; parse_ident(&s, &d, e, 1, is_utf8); @@ -9364,6 +9357,10 @@ S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck Perl_croak(aTHX_ "%s", ident_too_long); *d = '\0'; } + + while (s < send && SPACE_OR_TAB(*s)) + s++; + if (*s == '}') { s++; if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) { |