f6ea51
From 8121278aa8fe72e9e8aca8651c7f1d4fa204ac1d Mon Sep 17 00:00:00 2001
f6ea51
From: Karl Williamson <khw@cpan.org>
f6ea51
Date: Mon, 2 Apr 2018 21:54:59 -0600
f6ea51
Subject: [PATCH] PATCH: [perl #132167] Parse error in regex_sets
f6ea51
MIME-Version: 1.0
f6ea51
Content-Type: text/plain; charset=UTF-8
f6ea51
Content-Transfer-Encoding: 8bit
f6ea51
f6ea51
When popping the stack, the code inappropriately also subtracted one
f6ea51
from the result.  This is probably left over from an earlier change in
f6ea51
the implementation.  The top of the stack contained the correct value;
f6ea51
subtracting was a mistake.
f6ea51
f6ea51
Signed-off-by: Petr Písař <ppisar@redhat.com>
f6ea51
---
f6ea51
 regcomp.c         |  2 +-
f6ea51
 t/re/regex_sets.t | 11 +++++++++++
f6ea51
 2 files changed, 12 insertions(+), 1 deletion(-)
f6ea51
f6ea51
diff --git a/regcomp.c b/regcomp.c
f6ea51
index 018d5646fc..39ab260efa 100644
f6ea51
--- a/regcomp.c
f6ea51
+++ b/regcomp.c
f6ea51
@@ -15689,7 +15689,7 @@ redo_curchar:
f6ea51
                  * fence.  Get rid of it */
f6ea51
                 fence_ptr = av_pop(fence_stack);
f6ea51
                 assert(fence_ptr);
f6ea51
-                fence = SvIV(fence_ptr) - 1;
f6ea51
+                fence = SvIV(fence_ptr);
f6ea51
                 SvREFCNT_dec_NN(fence_ptr);
f6ea51
                 fence_ptr = NULL;
f6ea51
 
f6ea51
diff --git a/t/re/regex_sets.t b/t/re/regex_sets.t
f6ea51
index e9644bd4e6..e70df81254 100644
f6ea51
--- a/t/re/regex_sets.t
f6ea51
+++ b/t/re/regex_sets.t
f6ea51
@@ -204,6 +204,17 @@ for my $char ("٠", "٥", "٩") {
f6ea51
     like("a", qr/$pat/, "/$pat/ compiles and matches 'a'");
f6ea51
 }
f6ea51
 
f6ea51
+{   # [perl #132167]
f6ea51
+    fresh_perl_is('no warnings "experimental::regex_sets";
f6ea51
+        print "c" =~ qr/(?[ ( \p{Uppercase} ) + (\p{Lowercase} - ([a] + [b]))  ])/;',
f6ea51
+        1, {},
f6ea51
+        'qr/(?[ ( \p{Uppercase} ) + (\p{Lowercase} - ([a] + [b]))  ]) compiles and properly matches');
f6ea51
+    fresh_perl_is('no warnings "experimental::regex_sets";
f6ea51
+        print "b" =~ qr/(?[ ( \p{Uppercase} ) + (\p{Lowercase} - ([a] + [b]))  ])/;',
f6ea51
+        "", {},
f6ea51
+        'qr/(?[ ( \p{Uppercase} ) + (\p{Lowercase} - ([a] + [b]))  ]) compiles and properly matches');
f6ea51
+}
f6ea51
+
f6ea51
 done_testing();
f6ea51
 
f6ea51
 1;
f6ea51
-- 
f6ea51
2.14.3
f6ea51