This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix perl #126186 - (*ACCEPT) does not allow arguments
authorYves Orton <demerphq@gmail.com>
Sun, 4 Oct 2015 14:22:17 +0000 (16:22 +0200)
committerYves Orton <demerphq@gmail.com>
Mon, 5 Oct 2015 18:10:07 +0000 (20:10 +0200)
regcomp.c
t/re/re_tests

index 41c9c4d..b5d98e7 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -9861,8 +9861,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
            char *start_arg = NULL;
            unsigned char op = 0;
            int argok = 1;
-            int internal_argval = 0; /* internal_argval is only useful if
-                                        !argok */
+            int internal_argval = -1; /* if >-1 we are not allowed an argument*/
 
             if (has_intervening_patws) {
                 RExC_parse++;
@@ -9937,15 +9936,15 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
                     UTF8fARG(UTF, verb_len, start_verb));
            }
            if ( argok ) {
-                if ( start_arg && internal_argval ) {
+                if ( start_arg && internal_argval != -1 ) {
                    vFAIL3("Verb pattern '%.*s' may not have an argument",
                        verb_len, start_verb);
                } else if ( argok < 0 && !start_arg ) {
                     vFAIL3("Verb pattern '%.*s' has a mandatory argument",
                        verb_len, start_verb);
-               } else {
-                   ret = reganode(pRExC_state, op, internal_argval);
-                   if ( ! internal_argval && ! SIZE_ONLY ) {
+                } else if ( internal_argval == -1 ) {
+                    ret = reganode(pRExC_state, op, 0);
+                    if ( ! SIZE_ONLY ) {
                         if (start_arg) {
                             SV *sv = newSVpvn( start_arg,
                                                RExC_parse - start_arg);
@@ -9957,9 +9956,13 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
                             ret->flags = 1;
                         }
                     }
-               }
-               if (!internal_argval)
                     RExC_seen |= REG_VERBARG_SEEN;
+               } else {
+                    /* ACCEPT does not allow :args like the rest of the verbs
+                     * as it currently uses its arg slot for something else. 
+                     * We can change that in a future commit. */
+                   ret = reganode(pRExC_state, op, internal_argval);
+                }
            } else if ( start_arg ) {
                vFAIL3("Verb pattern '%.*s' may not have an argument",
                        verb_len, start_verb);
index 226d35a..8da653a 100644 (file)
@@ -1933,7 +1933,7 @@ A+(*PRUNE)BC(?{}) AAABC   y       $&      AAABC
 ^((?(?!)xb|ya)z)       xbz     n       -       -
 ^((?(?!)xb|ya)z)       yaz     y       $1      yaz             # [perl-126222]
 
-(*ACCEPT:foo)  foo     Tc      -       Verb pattern 'ACCEPT' may not have an argument
+(*ACCEPT:foo)  foo           -       Verb pattern 'ACCEPT' may not have an argument
 ((*ACCEPT:foo))        foo     c       -       Verb pattern 'ACCEPT' may not have an argument
 # Keep these lines at the end of the file
 # vim: softtabstop=0 noexpandtab