Fix error message for unclosed \N{ in regcomp
authorDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Mon, 14 Nov 2016 19:05:31 +0000 (20:05 +0100)
committerDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Mon, 14 Nov 2016 19:12:03 +0000 (20:12 +0100)
An unclosed \N{ that made it through to the regex engine rather than
being handled by the lexer would erroneously trigger the error for
"\N{NAME} must be resolved by the lexer".

This separates the check for the missing trailing } and issues the
correct error message for this.

regcomp.c
t/re/re_tests

index ac66432..332cf00 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -12005,13 +12005,15 @@ S_grok_bslash_N(pTHX_ RExC_state_t *pRExC_state,
 
     RExC_parse++;      /* Skip past the '{' */
 
-    if (! (endbrace = strchr(RExC_parse, '}'))  /* no trailing brace */
-       || ! (endbrace == RExC_parse            /* nothing between the {} */
+    if (! (endbrace = strchr(RExC_parse, '}'))) { /* no trailing brace */
+        vFAIL2("Missing right brace on \\%c{}", 'N');
+    }
+    else if(!(endbrace == RExC_parse           /* nothing between the {} */
               || (endbrace - RExC_parse >= 2   /* U+ (bad hex is checked... */
                   && strnEQ(RExC_parse, "U+", 2)))) /* ... below for a better
                                                        error msg) */
     {
-       if (endbrace) RExC_parse = endbrace;    /* position msg's '<--HERE' */
+       RExC_parse = endbrace;  /* position msg's '<--HERE' */
        vFAIL("\\N{NAME} must be resolved by the lexer");
     }
 
index 046beaa..1797ddc 100644 (file)
@@ -1478,7 +1478,10 @@ abc\N    abc\n   n
 [\N{U+}]       -       c       -       Invalid hexadecimal number
 \N{U+4AG3}     -       c       -       Invalid hexadecimal number
 [\N{U+4AG3}]   -       c       -       Invalid hexadecimal number
-abc\N{def      -       c       -       \\N{NAME} must be resolved by the lexer
+abc\N{def}     -       c       -       \\N{NAME} must be resolved by the lexer
+abc\N{U+4AG3   -       c       -       Missing right brace on \\N{}
+abc\N{def      -       c       -       Missing right brace on \\N{}
+abc\N{ -       c       -       Missing right brace on \\N{}
 
 # Verify that under /x that still cant have space before left brace
 /abc\N {U+41}/x        -       c       -       Missing braces