summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--regexec.c21
-rwxr-xr-xt/op/pat.t17
2 files changed, 28 insertions, 10 deletions
diff --git a/regexec.c b/regexec.c
index 1a8a8e7d2f..8e5efb0093 100644
--- a/regexec.c
+++ b/regexec.c
@@ -2591,16 +2591,19 @@ S_regmatch(pTHX_ regnode *prog)
nextchr = UCHARAT(++locinput);
break;
case CLUMP:
- LOAD_UTF8_CHARCLASS(mark,"~");
- if (locinput >= PL_regeol ||
- swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
- sayNO;
- locinput += PL_utf8skip[nextchr];
- while (locinput < PL_regeol &&
- swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
- locinput += UTF8SKIP(locinput);
- if (locinput > PL_regeol)
+ if (locinput >= PL_regeol)
sayNO;
+ if (do_utf8) {
+ LOAD_UTF8_CHARCLASS(mark,"~");
+ if (swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
+ sayNO;
+ locinput += PL_utf8skip[nextchr];
+ while (locinput < PL_regeol &&
+ swash_fetch(PL_utf8_mark,(U8*)locinput, do_utf8))
+ locinput += UTF8SKIP(locinput);
+ if (locinput > PL_regeol)
+ sayNO;
+ }
nextchr = UCHARAT(locinput);
break;
case REFFL:
diff --git a/t/op/pat.t b/t/op/pat.t
index 03eec49508..7a88b0466b 100755
--- a/t/op/pat.t
+++ b/t/op/pat.t
@@ -6,7 +6,7 @@
$| = 1;
-print "1..786\n";
+print "1..792\n";
BEGIN {
chdir 't' if -d 't';
@@ -2389,3 +2389,18 @@ print "# some Unicode properties\n";
# Before #13843 this was failing by matching falsely.
print "_:$char:_" =~ m/_:$SIGMA:_/i ? "not ok 786\n" : "ok 786\n";
}
+
+{
+ print "# \\X\n";
+
+ use charnames ':full';
+
+ print "a!" =~ /\X!/ ? "ok 787\n" : "not ok 787\n";
+ print "\xDF!" =~ /\X!/ ? "ok 788\n" : "not ok 788\n";
+ print "\x{100}!" =~ /\X!/ ? "ok 789\n" : "not ok 789\n";
+ print "\x{100}\x{300}!" =~ /\X!/ ? "ok 790\n" : "not ok 790\n";
+ print "\N{LATIN CAPITAL LETTER E}!" =~ /\X!/ ?
+ "ok 791\n" : "not ok 791\n";
+ print "\N{LATIN CAPITAL LETTER E}\N{COMBINING GRAVE ACCENT}!" =~ /\X!/ ?
+ "ok 792\n" : "not ok 792\n";
+}