Michael, thank you for finding this amusing bug! > (string-match-p "\\`\\(?:ab\\)*\\'" "a") ==> 0 With a bit of help from the regexp-disasm package, we see that this compiles to 0 begbuf 1 on-failure-jump-smart to 11 4 exact "ab" 8 jump to 1 11 endbuf 12 succeed where the on-failure-jump-smart op turns into on-failure-keep-string-jump the first time it's executed. This gives us a clue about what is wrong: when there is a failure inside an 'exact' string match, the target pointer should be reset to the start of that string ("ab" here) before jumping to the failure location. Reading the source it becomes clear that this is done correctly when there is a mismatch, but not if the target string ends prematurely because PREFETCH() has no idea that it should reset the target pointer! Easy enough to fix. Please try the attached patch. (The patch takes care of counted repetitions for good measure although I wasn't able to provoke a failure directly.)