dcb3b7
From bab0f8e933b383b6bef406d79c2da340bbcded33 Mon Sep 17 00:00:00 2001
dcb3b7
From: Yves Orton <demerphq@gmail.com>
dcb3b7
Date: Sun, 18 Jun 2017 20:45:30 +0200
dcb3b7
Subject: [PATCH 1/2] Resolve Perl #131522: Spurious "Assuming NOT a POSIX
dcb3b7
 class" warning
dcb3b7
MIME-Version: 1.0
dcb3b7
Content-Type: text/plain; charset=UTF-8
dcb3b7
Content-Transfer-Encoding: 8bit
dcb3b7
dcb3b7
Signed-off-by: Petr Písař <ppisar@redhat.com>
dcb3b7
---
dcb3b7
 regcomp.c | 30 ++++++++++++++++++------------
dcb3b7
 1 file changed, 18 insertions(+), 12 deletions(-)
dcb3b7
dcb3b7
diff --git a/regcomp.c b/regcomp.c
dcb3b7
index 8921eed..0a4ea78 100644
dcb3b7
--- a/regcomp.c
dcb3b7
+++ b/regcomp.c
dcb3b7
@@ -13991,6 +13991,13 @@ S_populate_ANYOF_from_invlist(pTHX_ regnode *node, SV** invlist_ptr)
dcb3b7
                                              REPORT_LOCATION_ARGS(p)));     \
dcb3b7
         }                                                                   \
dcb3b7
     } STMT_END
dcb3b7
+#define CLEAR_POSIX_WARNINGS()                                              \
dcb3b7
+    if (posix_warnings && RExC_warn_text)                                   \
dcb3b7
+        av_clear(RExC_warn_text)
dcb3b7
+
dcb3b7
+#define CLEAR_POSIX_WARNINGS_AND_RETURN(ret)                                \
dcb3b7
+    CLEAR_POSIX_WARNINGS();                                                 \
dcb3b7
+    return ret
dcb3b7
 
dcb3b7
 STATIC int
dcb3b7
 S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
@@ -14063,7 +14070,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
      *
dcb3b7
      * The syntax for a legal posix class is:
dcb3b7
      *
dcb3b7
-     * qr/(?xa: \[ : \^? [:lower:]{4,6} : \] )/
dcb3b7
+     * qr/(?xa: \[ : \^? [[:lower:]]{4,6} : \] )/
dcb3b7
      *
dcb3b7
      * What this routine considers syntactically to be an intended posix class
dcb3b7
      * is this (the comments indicate some restrictions that the pattern
dcb3b7
@@ -14088,7 +14095,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
      *                                      # for it to be considered to be
dcb3b7
      *                                      # an intended posix class.
dcb3b7
      *          \h*
dcb3b7
-     *          [:punct:]?                  # The closing class character,
dcb3b7
+     *          [[:punct:]]?                # The closing class character,
dcb3b7
      *                                      # possibly omitted.  If not a colon
dcb3b7
      *                                      # nor semi colon, the class name
dcb3b7
      *                                      # must be even closer to a valid
dcb3b7
@@ -14131,8 +14138,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
 
dcb3b7
     PERL_ARGS_ASSERT_HANDLE_POSSIBLE_POSIX;
dcb3b7
 
dcb3b7
-    if (posix_warnings && RExC_warn_text)
dcb3b7
-        av_clear(RExC_warn_text);
dcb3b7
+    CLEAR_POSIX_WARNINGS();
dcb3b7
 
dcb3b7
     if (p >= e) {
dcb3b7
         return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
@@ -14224,7 +14230,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
                     *updated_parse_ptr = (char *) temp_ptr;
dcb3b7
                 }
dcb3b7
 
dcb3b7
-                return OOB_NAMEDCLASS;
dcb3b7
+                CLEAR_POSIX_WARNINGS_AND_RETURN(OOB_NAMEDCLASS);
dcb3b7
             }
dcb3b7
         }
dcb3b7
 
dcb3b7
@@ -14294,7 +14300,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
         /* We consider something like [^:^alnum:]] to not have been intended to
dcb3b7
          * be a posix class, but XXX maybe we should */
dcb3b7
         if (complement) {
dcb3b7
-            return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS);
dcb3b7
         }
dcb3b7
 
dcb3b7
         complement = 1;
dcb3b7
@@ -14321,7 +14327,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
          * this leaves this construct looking like [:] or [:^], which almost
dcb3b7
          * certainly weren't intended to be posix classes */
dcb3b7
         if (has_opening_bracket) {
dcb3b7
-            return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS);
dcb3b7
         }
dcb3b7
 
dcb3b7
         /* But this function can be called when we parse the colon for
dcb3b7
@@ -14338,7 +14344,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
             /* XXX We are currently very restrictive here, so this code doesn't
dcb3b7
              * consider the possibility that, say, /[alpha.]]/ was intended to
dcb3b7
              * be a posix class. */
dcb3b7
-            return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS);
dcb3b7
         }
dcb3b7
 
dcb3b7
         /* Here we have something like 'foo:]'.  There was no initial colon,
dcb3b7
@@ -14508,7 +14514,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
             }
dcb3b7
 
dcb3b7
             /* Otherwise, it can't have meant to have been a class */
dcb3b7
-            return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS);
dcb3b7
         }
dcb3b7
 
dcb3b7
         /* If we ran off the end, and the final character was a punctuation
dcb3b7
@@ -14558,7 +14564,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
          * class name.  (We can do this on the first pass, as any second pass
dcb3b7
          * will yield an even shorter name) */
dcb3b7
         if (name_len < 3) {
dcb3b7
-            return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS);
dcb3b7
         }
dcb3b7
 
dcb3b7
         /* Find which class it is.  Initially switch on the length of the name.
dcb3b7
@@ -14717,7 +14723,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
             }
dcb3b7
 
dcb3b7
             /* Here neither pass found a close-enough class name */
dcb3b7
-            return NOT_MEANT_TO_BE_A_POSIX_CLASS;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(NOT_MEANT_TO_BE_A_POSIX_CLASS);
dcb3b7
         }
dcb3b7
 
dcb3b7
     probably_meant_to_be:
dcb3b7
@@ -14759,7 +14765,7 @@ S_handle_possible_posix(pTHX_ RExC_state_t *pRExC_state,
dcb3b7
             /* If it is a known class, return the class.  The class number
dcb3b7
              * #defines are structured so each complement is +1 to the normal
dcb3b7
              * one */
dcb3b7
-            return class_number + complement;
dcb3b7
+            CLEAR_POSIX_WARNINGS_AND_RETURN(class_number + complement);
dcb3b7
         }
dcb3b7
         else if (! check_only) {
dcb3b7
 
dcb3b7
-- 
dcb3b7
2.9.4
dcb3b7