This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Handle /[#]/ and /[(?#]/ with code blocks
authorDavid Mitchell <davem@iabyn.com>
Wed, 31 Jul 2013 21:41:17 +0000 (22:41 +0100)
committerDavid Mitchell <davem@iabyn.com>
Wed, 31 Jul 2013 21:41:17 +0000 (22:41 +0100)
This is a regression in 5.18.0.

In something like /[#](?{})/x, the perl toker incorrectly sees the '#' as a
comment and skips the code block without parsing it.

t/re/re_tests
toke.c

index 3921bb7..e992845 100644 (file)
@@ -1764,3 +1764,15 @@ A+?(*PRUNE)BC(?{})       AAABC   y       $&      ABC
 A+(*THEN)BC(?{})       AAABC   y       $&      AAABC
 A+(*PRUNE)BC(?{})      AAABC   y       $&      AAABC
 # vim: softtabstop=0 noexpandtab
+/[#]/  a#b     y       $&      #
+/[#]b/ a#b     y       $&      #b
+/[#]/x a#b     y       $&      #
+/[#]b/x        a#b     y       $&      #b
+/[#](?{})/x    a#b     y       $&      #
+/[#](??{'b'})/x        a#b     y       $&      #b
+/(?#)(?{})b/   a#b     y       $&      b
+/(?#)(??{'b'})/        a#b     y       $&      b
+/[(?#](?{})b/  a#b     y       $&      #b
+/[(?#](??{'b'})/       a#b     y       $&      #b
+/(?#)(?{})b/x  a#b     y       $&      b
+/(?#)(??{'b'})/x       a#b     y       $&      b
diff --git a/toke.c b/toke.c
index c030aec..578fe14 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -3285,12 +3285,12 @@ S_scan_const(pTHX_ char *start)
         * char, which will be done separately.
         * Stop on (?{..}) and friends */
 
-       else if (*s == '(' && PL_lex_inpat && s[1] == '?') {
+       else if (*s == '(' && PL_lex_inpat && s[1] == '?' && !in_charclass) {
            if (s[2] == '#') {
                while (s+1 < send && *s != ')')
                    *d++ = NATIVE_TO_NEED(has_utf8,*s++);
            }
-           else if (!PL_lex_casemods && !in_charclass &&
+           else if (!PL_lex_casemods &&
                     (    s[2] == '{' /* This should match regcomp.c */
                      || (s[2] == '?' && s[3] == '{')))
            {
@@ -3299,7 +3299,7 @@ S_scan_const(pTHX_ char *start)
        }
 
        /* likewise skip #-initiated comments in //x patterns */
-       else if (*s == '#' && PL_lex_inpat &&
+       else if (*s == '#' && PL_lex_inpat && !in_charclass &&
          ((PMOP*)PL_lex_inpat)->op_pmflags & RXf_PMf_EXTENDED) {
            while (s+1 < send && *s != '\n')
                *d++ = NATIVE_TO_NEED(has_utf8,*s++);