PATCH: [Perl #42957] Suggesting warning for useless greediness operator
authorKarl Williamson <public@khwilliamson.com>
Fri, 6 Dec 2013 22:50:52 +0000 (15:50 -0700)
committerKarl Williamson <public@khwilliamson.com>
Sat, 7 Dec 2013 16:57:55 +0000 (09:57 -0700)
This adds the requested warning.  Now we'll see if anything breaks as a
result.

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

index e94e6fa..052dd7c 100644 (file)
@@ -202,7 +202,9 @@ XXX L<message|perldiag/"message">
 
 =item *
 
-XXX L<message|perldiag/"message">
+L<Useless use of greediness modifier|perldiag/"Useless use of greediness modifier '%c' in regex; marked by <-- HERE in m/%s/">
+
+This fixes [Perl #42957].
 
 =back
 
index 4061fe2..bf05f2b 100644 (file)
@@ -5979,6 +5979,17 @@ will have an effect, so remove them from your code.
 (W misc) You have a \E in a double-quotish string without a C<\U>,
 C<\L> or C<\Q> preceding it.
 
+=item Useless use of greediness modifier '%c' in regex; marked by S<<-- HERE> in m/%s/
+
+(W regexp) You specified something like these:
+
+ qr/a{3}?/
+ qr/b{1,1}+/
+
+The C<"?"> and C<"+"> don't have any effect, as they modify whether to
+match more or fewer when there is a choice, and by specifying to match
+exactly a given numer, there is no room left for a choice.
+
 =item Useless use of %s in void context
 
 (W void) You did something without a side effect in a context that does
index ddc71ce..2d8ce3d 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -10182,6 +10182,19 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                 ret = reg_node(pRExC_state, OPFAIL);
                 return ret;
             }
+            else if (min == max
+                     && RExC_parse < RExC_end
+                     && (*RExC_parse == '?' || *RExC_parse == '+'))
+            {
+                if (SIZE_ONLY) {
+                    ckWARN2reg(RExC_parse + 1,
+                               "Useless use of greediness modifier '%c'",
+                               *RExC_parse);
+                }
+                /* Absorb the modifier, so later code doesn't see nor use
+                    * it */
+                nextchar(pRExC_state);
+            }
 
        do_curly:
            if ((flags&SIMPLE)) {
index b235338..0563264 100644 (file)
@@ -377,6 +377,8 @@ my @warning = (
                     'Useless (?g) - use /g modifier {#} m/(?og{#}c)/',
                     'Useless (?c) - use /gc modifier {#} m/(?ogc{#})/',
                   ],
+    '/a{1,1}?/' => 'Useless use of greediness modifier \'?\' {#} m/a{1,1}?{#}/',
+    '/b{3}  +/x' => 'Useless use of greediness modifier \'+\' {#} m/b{3}  +{#}/',
 );
 
 my @warnings_utf8 = mark_as_utf8(