regcomp.c: Expand diagnostic
authorKarl Williamson <public@khwilliamson.com>
Thu, 31 Jan 2013 16:15:05 +0000 (09:15 -0700)
committerKarl Williamson <public@khwilliamson.com>
Thu, 31 Jan 2013 17:35:04 +0000 (10:35 -0700)
Perl 5.16 added a deprecation message for an unescaped left brace
following \b and \B in regular expression patterns.  It suggests
escaping the brace by preceding it with a backslash.  This doesn't work
if the pattern delimiters are {}.  Instead, one can escape the brace
by enclosing it within square brackets.  In recent Perls, this compiles
identically to the backslashed version.

This comit expands the message to suggest both options.

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

index 02c93ce..ed88545 100644 (file)
@@ -536,13 +536,15 @@ check the return value of your socket() call?  See L<perlfunc/bind>.
 (W unopened) You tried binmode() on a filehandle that was never opened.
 Check your control flow and number of arguments.
 
-=item "\b{" is deprecated; use "\b\{" instead in regex; marked by <-- HERE in m/%s/
+=item "\b{" is deprecated; use "\b\{" or "\b[{]" instead in regex; marked by <-- HERE in m/%s/
 
-=item "\B{" is deprecated; use "\B\{" instead in regex; marked by <-- HERE in m/%s/
+=item "\B{" is deprecated; use "\B\{" or "\B[{]" instead in regex; marked by <-- HERE in m/%s/
 
 (W deprecated, regexp) Use of an unescaped "{" immediately following a
 C<\b> or C<\B> is now deprecated so as to reserve its use for Perl
-itself in a future release.
+itself in a future release.  You can either precede the brace with a
+backslash, or enclose it in square brackets; the latter is the way to go
+if the pattern delimiters are C<{}>.
 
 =item Bit vector size > 32 non-portable
 
index 2c7709a..b36b7e4 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -10264,7 +10264,7 @@ tryagain:
            FLAGS(ret) = get_regex_charset(RExC_flags);
            *flagp |= SIMPLE;
            if (! SIZE_ONLY && (U8) *(RExC_parse + 1) == '{') {
-               ckWARNdep(RExC_parse, "\"\\b{\" is deprecated; use \"\\b\\{\" instead");
+               ckWARNdep(RExC_parse, "\"\\b{\" is deprecated; use \"\\b\\{\" or \"\\b[{]\" instead");
            }
            goto finish_meta_pat;
        case 'B':
@@ -10278,7 +10278,7 @@ tryagain:
            FLAGS(ret) = get_regex_charset(RExC_flags);
            *flagp |= SIMPLE;
            if (! SIZE_ONLY && (U8) *(RExC_parse + 1) == '{') {
-               ckWARNdep(RExC_parse, "\"\\B{\" is deprecated; use \"\\B\\{\" instead");
+               ckWARNdep(RExC_parse, "\"\\B{\" is deprecated; use \"\\B\\{\" or \"\\B[{]\" instead");
            }
            goto finish_meta_pat;
 
index b514320..9af88d7 100644 (file)
@@ -254,8 +254,8 @@ my @experimental_regex_sets = (
 );
 
 my @deprecated = (
-    '/a\b{cde/' => '"\b{" is deprecated; use "\b\{" instead {#} m/a\{#}b{cde/',
-    '/a\B{cde/' => '"\B{" is deprecated; use "\B\{" instead {#} m/a\{#}B{cde/',
+    '/a\b{cde/' => '"\b{" is deprecated; use "\b\{" or "\b[{]" instead {#} m/a\{#}b{cde/',
+    '/a\B{cde/' => '"\B{" is deprecated; use "\B\{" or "\B[{]" instead {#} m/a\{#}B{cde/',
     'use utf8; /(?x)\\85\85\\85/' => 'Escape literal pattern white space under /x {#} m/(?x)\\85\85{#}\\85/',
 );