This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Warn on [:^posix:] not being in []
authorKarl Williamson <khw@cpan.org>
Thu, 5 Feb 2015 20:07:38 +0000 (13:07 -0700)
committerKarl Williamson <khw@cpan.org>
Thu, 5 Feb 2015 20:54:23 +0000 (13:54 -0700)
A POSIX character class is has to be in a bracketed character class.  A
warning is issued when something appearing to be one is found outside.
Until this commit the warning wasn't raised for negated classes.

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

index 674109a..097d28c 100644 (file)
@@ -399,6 +399,14 @@ array, for example, perl would produce a runtime error and not set
 C<PL_rs>, but perl code that checked C<$/> would see the array
 reference.  [perl #123218]
 
+=item *
+
+In a regular expression pattern, a POSIX class, like C<[:ascii:]>, must
+be inside a bracketed character class, like C</qr[[:ascii:]]>.  A
+warning is issued when something looking like a POSIX class is not
+inside a bracketed class.  That warning wasn't getting generated when
+the POSIX class was negated: C<[:^ascii:]>.  This is now fixed.
+
 =back
 
 =head1 Known Problems
index edab543..0d6d344 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -13864,6 +13864,9 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
        const char *s = RExC_parse;
        const char  c = *s++;
 
+        if (*s == '^') {
+            s++;
+        }
        while (isWORDCHAR(*s))
            s++;
        if (*s && c == *s && s[1] == ']') {
index 4abfdf7..c985c8e 100644 (file)
@@ -451,6 +451,7 @@ my @death_utf8_only_under_strict = (
 my @warning = (
     'm/\b*\x{100}/' => '\b* matches null string many times {#} m/\b*{#}\x{100}/',
     'm/[:blank:]\x{100}/' => 'POSIX syntax [: :] belongs inside character classes {#} m/[:blank:]{#}\x{100}/',
+    'm/[[:cntrl:]][:^ascii:]\x{100}/' =>  'POSIX syntax [: :] belongs inside character classes {#} m/[[:cntrl:]][:^ascii:]{#}\x{100}/',
     "m'\\y\\x{100}'"     => 'Unrecognized escape \y passed through {#} m/\y{#}\x{100}/',
     '/x{3,1}/'   => 'Quantifier {n,m} with n > m can\'t match {#} m/x{3,1}{#}/',
     '/\08/' => '\'\08\' resolved to \'\o{0}8\' {#} m/\08{#}/',