Warn inside character classes about unknown backslash escapes
Jarkko Hietaniemi [Thu, 14 Oct 1999 22:08:22 +0000 (22:08 +0000)]
(that are not caught earlier because of being completely unknown,
such as \m), such as \z (because they make do sense inside regexen,
but not inside character classes).

p4raw-id: //depot/cfgperl@4380

pod/perldelta.pod
pod/perldiag.pod
regcomp.c
t/pragma/warn/regcomp

index b4d4d21..2ea9237 100644 (file)
@@ -1395,7 +1395,12 @@ your signed integers.  See L<perlfunc/unpack>.
 
 (W) You used a backslash-character combination which is not recognized
 by Perl.  This combination appears in an interpolated variable or a
-C<'>-delimited regular expression.
+C<'>-delimited regular expression.  The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W) You used a backslash-character combination which is not recognized
+by Perl inside character classes.  The character was understood literally.
 
 =item /%s/ should probably be written as "%s"
 
@@ -1773,7 +1778,7 @@ subvert Perl's population of %ENV for nefarious purposes.
 =item Unrecognized escape \\%c passed through
 
 (W) You used a backslash-character combination which is not recognized
-by Perl.
+by Perl.  The character was understood literally.
 
 =item Unterminated attribute parameter in attribute list
 
index 11758e0..a6a723c 100644 (file)
@@ -110,7 +110,12 @@ your signed integers.  See L<perlfunc/unpack>.
 
 (W) You used a backslash-character combination which is not recognized
 by Perl.  This combination appears in an interpolated variable or a 
-C<'>-delimited regular expression.
+C<'>-delimited regular expression.  The character was understood literally.
+
+=item /%s/: Unrecognized escape \\%c in character class passed through
+
+(W) You used a backslash-character combination which is not recognized
+by Perl inside character classes.  The character was understood literally.
 
 =item /%s/ should probably be written as "%s"
 
index 0dafdd0..2a27b07 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -2061,9 +2061,9 @@ tryagain:
                    default:
                        if (!SIZE_ONLY && ckWARN(WARN_UNSAFE) && isALPHA(*p))
                            Perl_warner(aTHX_ WARN_UNSAFE, 
-                                  "/%.127s/: Unrecognized escape \\%c passed through",
-                                  PL_regprecomp,
-                                  *p);
+                                       "/%.127s/: Unrecognized escape \\%c passed through",
+                                       PL_regprecomp,
+                                       *p);
                        goto normal_default;
                    }
                    break;
@@ -2364,6 +2364,13 @@ S_regclass(pTHX)
                value = scan_oct(--PL_regcomp_parse, 3, &numlen);
                PL_regcomp_parse += numlen;
                break;
+           default:
+               if (!SIZE_ONLY && ckWARN(WARN_UNSAFE) && isALPHA(value))
+                   Perl_warner(aTHX_ WARN_UNSAFE, 
+                               "/%.127s/: Unrecognized escape \\%c in character class passed through",
+                               PL_regprecomp,
+                               value);
+               break;
            }
        }
        if (namedclass > OOB_NAMEDCLASS) {
@@ -2808,6 +2815,13 @@ S_regclassutf8(pTHX)
                value = scan_oct(--PL_regcomp_parse, 3, &numlen);
                PL_regcomp_parse += numlen;
                break;
+           default:
+               if (!SIZE_ONLY && ckWARN(WARN_UNSAFE) && isALPHA(value))
+                   Perl_warner(aTHX_ WARN_UNSAFE, 
+                               "/%.127s/: Unrecognized escape \\%c in character class passed through",
+                               PL_regprecomp,
+                               value);
+               break;
            }
        }
        if (namedclass > OOB_NAMEDCLASS) {
index 8890962..92b8208 100644 (file)
 
   /%.127s/: false [] range \"%*.*s\" in regexp [S_regclassutf8]
 
+  /%.127s/: Unrecognized escape \\%c in character class passed through"        [S_regclass] 
+
+  /%.127s/: Unrecognized escape \\%c in character class passed through"        [S_regclassutf8] 
+
 __END__
 # regcomp.c [S_regpiece]
 use warnings 'unsafe' ;
@@ -40,8 +44,9 @@ Strange *+?{} on zero-length expression at - line 4.
 ########
 # regcomp.c [S_regatom]
 use warnings 'unsafe' ;
-$a =~ /\m/ ;
+$a =~ /a\mb\b/ ;
 no warnings 'unsafe' ;
+$a =~ /a\mb\b/ ;
 EXPECT
 Unrecognized escape \m passed through at - line 3.
 ########
@@ -139,3 +144,11 @@ EXPECT
 /[[:digit:]-b]/: false [] range "[:digit:]-" in regexp at - line 11.
 /[[:alpha:]-[:digit:]]/: false [] range "[:alpha:]-" in regexp at - line 12.
 /[[:digit:]-[:alpha:]]/: false [] range "[:digit:]-" in regexp at - line 13.
+########
+# regcomp.c [S_regclass S_regclassutf8]
+use warnings 'unsafe' ;
+$a =~ /[a\zb]/ ;
+no warnings 'unsafe' ;
+$a =~ /[a\zb]/ ;
+EXPECT
+/[a\zb]/: Unrecognized escape \z in character class passed through at - line 3.