summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <public@khwilliamson.com>2014-01-29 14:38:00 -0700
committerKarl Williamson <public@khwilliamson.com>2014-01-29 14:51:55 -0700
commit6e79ab66ceb8b6d6046d356b6b4eba9c98b33599 (patch)
tree7f30569a5f811c3d3c206346d2e6a3a42b55faef
parent69e3da3c82c173aa3d9eb8701fef83e86ae166f5 (diff)
downloadperl-6e79ab66ceb8b6d6046d356b6b4eba9c98b33599.tar.gz
regcomp.c: Process all POSIXes in [...] under /l
Commit 31f05a37 introduced a regression in which if you have something like /[\s\d[:punct:]/, all but the final class were ignored. This was due to initialization happening every time through the loop, instead of the first time needed.
-rw-r--r--regcomp.c7
-rw-r--r--t/run/locale.t14
2 files changed, 19 insertions, 2 deletions
diff --git a/regcomp.c b/regcomp.c
index e4f6c86bfd..dfbaec8089 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -13581,6 +13581,11 @@ parseit:
else {
RExC_emit += ANYOF_POSIXL_FOLD_SKIP - ANYOF_SKIP;
}
+
+ /* We need to initialize this here because this node type has
+ * this field, and will skip getting initialized when we get to
+ * a posix class since are doing it here */
+ ANYOF_POSIXL_ZERO(ret);
}
if (ANYOF_LOCALE == ANYOF_POSIXL
|| (namedclass > OOB_NAMEDCLASS
@@ -13594,8 +13599,8 @@ parseit:
else {
RExC_emit += ANYOF_POSIXL_SKIP - ANYOF_SKIP;
}
+ ANYOF_POSIXL_ZERO(ret);
}
- ANYOF_POSIXL_ZERO(ret);
ANYOF_FLAGS(ret) |= ANYOF_POSIXL;
}
}
diff --git a/t/run/locale.t b/t/run/locale.t
index fadb5d499d..5e27e5b3c3 100644
--- a/t/run/locale.t
+++ b/t/run/locale.t
@@ -267,7 +267,19 @@ EOF
1, {}, "/il matching of [bracketed] doesn't skip POSIX class if fails individ char");
}
+ {
+ fresh_perl_is(<<"EOF",
+ use locale;
+ use POSIX;
+ POSIX::setlocale(POSIX::LC_CTYPE(),"C");
+ print "0" =~ /[\\d[:punct:]]/l || 0;
+ print "\\n";
+EOF
+ 1, {}, "/l matching of [bracketed] doesn't skip non-first POSIX class");
+
+ }
+
} # SKIP
-sub last { 16 }
+sub last { 17 }