This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Don't prematurely skip error checking
authorKarl Williamson <khw@cpan.org>
Mon, 1 Sep 2014 20:57:49 +0000 (14:57 -0600)
committerKarl Williamson <khw@cpan.org>
Sun, 7 Sep 2014 03:12:05 +0000 (21:12 -0600)
The assertion in the comment changed by this commit was true only for
pass1 of the regex compilation; not pass2.  This makes it true in both
passes by moving it, and the code it was about past some error checking.
This error checking was executed in pass1, but not pass2.  It also
changes the warning to only be done in the second pass, part of
[perl #122671].  A future commit will fix the others

regcomp.c

index de27b3d..682ee5e 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -14000,7 +14000,6 @@ parseit:
                                                      namedclass % 2 != 0,
                                                      posixes_ptr);
                 }
-                continue;   /* Go get next character */
            }
        } /* end of namedclass \blah */
 
@@ -14009,12 +14008,14 @@ parseit:
                                 FALSE /* means don't recognize comments */ );
         }
 
-        /* Here, we have a single value.  If 'range' is set, it is the ending
-         * of a range--check its validity.  Later, we will handle each
-         * individual code point in the range.  If 'range' isn't set, this
-         * could be the beginning of a range, so check for that by looking
-         * ahead to see if the next real character to be processed is the range
-         * indicator--the minus sign */
+        /* If 'range' is set, 'value' is the ending of a range--check its
+         * validity.  (If value isn't a single code point in the case of a
+         * range, we should have figured that out above in the code that
+         * catches false ranges).  Later, we will handle each individual code
+         * point in the range.  If 'range' isn't set, this could be the
+         * beginning of a range, so check for that by looking ahead to see if
+         * the next real character to be processed is the range indicator--the
+         * minus sign */
 
        if (range) {
            if (prevvalue > value) /* b-a */ {
@@ -14045,7 +14046,7 @@ parseit:
 
                     /* a bad range like \w-, [:word:]- ? */
                     if (namedclass > OOB_NAMEDCLASS) {
-                        if (strict || ckWARN(WARN_REGEXP)) {
+                        if (strict || (PASS2 && ckWARN(WARN_REGEXP))) {
                             const int w =
                                 RExC_parse >= rangebegin ?
                                 RExC_parse - rangebegin : 0;
@@ -14053,7 +14054,7 @@ parseit:
                                 vFAIL4("False [] range \"%*.*s\"",
                                     w, w, rangebegin);
                             }
-                            else {
+                            else if (PASS2) {
                                 vWARN4(RExC_parse,
                                     "False [] range \"%*.*s\"",
                                     w, w, rangebegin);
@@ -14070,8 +14071,12 @@ parseit:
            }
        }
 
-        /* Here, <prevvalue> is the beginning of the range, if any; or <value>
-         * if not */
+        if (namedclass > OOB_NAMEDCLASS) {
+            continue;
+        }
+
+        /* Here, we have a single value, and <prevvalue> is the beginning of
+         * the range, if any; or <value> if not */
 
        /* non-Latin1 code point implies unicode semantics.  Must be set in
         * pass1 so is there for the whole of pass 2 */