This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #132851] Empty /(?)/
authorKarl Williamson <khw@cpan.org>
Sat, 23 Mar 2019 16:16:16 +0000 (10:16 -0600)
committerKarl Williamson <khw@cpan.org>
Sat, 23 Mar 2019 16:24:26 +0000 (10:24 -0600)
This changes perlre to note that zero modifiers are allowed in the
(?...) construct, but changes the code to warn about this no-op, but
only under "use re 'strict'".

pod/perldiag.pod
pod/perlre.pod
regcomp.c
t/re/reg_mesg.t

index 8163dde..7a3faad 100644 (file)
@@ -2169,6 +2169,11 @@ C<\x> without specifying anything for it to operate on.
 Unfortunately, for backwards compatibility reasons, an empty C<\x> is
 legal outside S<C<use re 'strict'>> and expands to a NUL character.
 
 Unfortunately, for backwards compatibility reasons, an empty C<\x> is
 legal outside S<C<use re 'strict'>> and expands to a NUL character.
 
+=item Empty (?) without any modifiers in regex; marked by <-- HERE in m/%s/
+
+(W regexp) (only under C<S<use re 'strict'>>)
+C<(?)> does nothing, so perhaps this is a typo.
+
 =item ${^ENCODING} is no longer supported
 
 (F) The special variable C<${^ENCODING}>, formerly used to implement
 =item ${^ENCODING} is no longer supported
 
 (F) The special variable C<${^ENCODING}>, formerly used to implement
index f9ea161..cc71707 100644 (file)
@@ -1376,7 +1376,7 @@ an escape sequence.   Examples:
 =item C<(?^alupimnsx)>
 X<(?)> X<(?^)>
 
 =item C<(?^alupimnsx)>
 X<(?)> X<(?^)>
 
-One or more embedded pattern-match modifiers, to be turned on (or
+Zero or more embedded pattern-match modifiers, to be turned on (or
 turned off if preceded by C<"-">) for the remainder of the pattern or
 the remainder of the enclosing pattern group (if any).
 
 turned off if preceded by C<"-">) for the remainder of the pattern or
 the remainder of the enclosing pattern group (if any).
 
@@ -1450,6 +1450,10 @@ C<(?-d:...)> and C<(?dl:...)> are fatal errors.
 Note also that the C<"p"> modifier is special in that its presence
 anywhere in a pattern has a global effect.
 
 Note also that the C<"p"> modifier is special in that its presence
 anywhere in a pattern has a global effect.
 
+Having zero modifiers makes this a no-op (so why did you specify it,
+unless it's generated code), and starting in v5.30, warns under L<C<use
+re 'strict'>|re/'strict' mode>.
+
 =item C<(?:I<pattern>)>
 X<(?:)>
 
 =item C<(?:I<pattern>)>
 X<(?:)>
 
index a56e75b..547b911 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -11977,6 +11977,12 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
                RExC_parse--; /* for vFAIL to print correctly */
                 vFAIL("Sequence (? incomplete");
                 break;
                RExC_parse--; /* for vFAIL to print correctly */
                 vFAIL("Sequence (? incomplete");
                 break;
+
+            case ')':
+                if (RExC_strict) {  /* [perl #132851] */
+                    ckWARNreg(RExC_parse, "Empty (?) without any modifiers");
+                }
+                /* FALLTHROUGH */
            default: /* e.g., (?i) */
                RExC_parse = (char *) seqstart + 1;
               parse_flags:
            default: /* e.g., (?i) */
                RExC_parse = (char *) seqstart + 1;
               parse_flags:
index 3d60c4a..f826592 100644 (file)
@@ -673,6 +673,7 @@ my @warning_only_under_strict = (
     "/[$low_mixed_digit-$high_mixed_digit]/" => "Ranges of ASCII printables should be some subset of \"0-9\", \"A-Z\", or \"a-z\" {#} m/[$low_mixed_digit-$high_mixed_digit\{#}]/",
     '/\b<GCB}/' => 'Unescaped literal \'}\' {#} m/\b<GCB}{#}/',
     '/[ ]def]/' => 'Unescaped literal \']\' {#} m/[ ]def]{#}/',
     "/[$low_mixed_digit-$high_mixed_digit]/" => "Ranges of ASCII printables should be some subset of \"0-9\", \"A-Z\", or \"a-z\" {#} m/[$low_mixed_digit-$high_mixed_digit\{#}]/",
     '/\b<GCB}/' => 'Unescaped literal \'}\' {#} m/\b<GCB}{#}/',
     '/[ ]def]/' => 'Unescaped literal \']\' {#} m/[ ]def]{#}/',
+    '/(?)/' => 'Empty (?) without any modifiers {#} m/(?){#}/', [perl #132851]
 );
 
 my @warning_utf8_only_under_strict = mark_as_utf8(
 );
 
 my @warning_utf8_only_under_strict = mark_as_utf8(