This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fatalize splitting '(?' and '(*' in regexes
authorKarl Williamson <khw@cpan.org>
Wed, 23 Apr 2014 18:40:30 +0000 (12:40 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 30 May 2014 16:00:51 +0000 (10:00 -0600)
Inserting spaces or comments between the '(' and '?' or '*' has been
deprecated since v5.18.0.

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

index fdf7181..89129af 100644 (file)
@@ -47,6 +47,11 @@ XXX For a release on a stable branch, this section aspires to be:
 
 In prior releases, failure to do this raised a deprecation warning.
 
+=head2 Splitting the tokens C<(?> and C<(*> in regular expressions is
+now a fatal compilation error.
+
+These had been deprecated since v5.18.
+
 =head1 Deprecations
 
 XXX Any deprecated features, syntax, modules etc. should be listed here.
index 2041049..380d3a6 100644 (file)
@@ -2407,16 +2407,13 @@ expression that contains a call to a user-defined character property
 function, i.e. C<\p{IsFoo}> or C<\p{InFoo}>.
 See L<perlunicode/User-Defined Character Properties> and L<perlsec>.
 
-=item In '(?...)', splitting the initial '(?' is deprecated in regex;
+=item In '(?...)', the '(' and '?' must be adjacent in regex;
 marked by S<<-- HERE> in m/%s/
 
-(D regexp, deprecated) The two-character sequence C<"(?"> in
+(F) The two-character sequence C<"(?"> in
 this context in a regular expression pattern should be an
 indivisible token, with nothing intervening between the C<"(">
-and the C<"?">, but you separated them.  Due to an accident of
-implementation, this prohibition was not enforced, but we do
-plan to forbid it in a future Perl version.  This message
-serves as giving you fair warning of this pending change.
+and the C<"?">, but you separated them.
 
 =item Integer overflow in format string for %s
 
@@ -2634,16 +2631,13 @@ for more details on allowed version formats.
 Perhaps the internals were modified directly in some way or
 an arbitrary reference was blessed into the "version" class.
 
-=item In '(*VERB...)', splitting the initial '(*' is deprecated in regex;
+=item In '(*VERB...)', the '(' and '*' must be adjacent in regex;
 marked by S<<-- HERE> in m/%s/
 
-(D regexp, deprecated) The two-character sequence C<"(*"> in
+(F) The two-character sequence C<"(*"> in
 this context in a regular expression pattern should be an
 indivisible token, with nothing intervening between the C<"(">
-and the C<"*">, but you separated them.  Due to an accident of
-implementation, this prohibition was not enforced, but we do
-plan to forbid it in a future Perl version.  This message
-serves as giving you fair warning of this pending change.
+and the C<"*">, but you separated them.
 
 =item ioctl is not implemented
 
index 2bad384..badff4a 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -9412,8 +9412,9 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
             int internal_argval = 0; /* internal_argval is only useful if
                                         !argok */
 
-            if (has_intervening_patws && SIZE_ONLY) {
-                ckWARNregdep(RExC_parse + 1, "In '(*VERB...)', splitting the initial '(*' is deprecated");
+            if (has_intervening_patws) {
+                RExC_parse++;
+                vFAIL("In '(*VERB...)', the '(' and '*' must be adjacent");
             }
            while ( *RExC_parse && *RExC_parse != ')' ) {
                if ( *RExC_parse == ':' ) {
@@ -9519,8 +9520,9 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth)
         else if (*RExC_parse == '?') { /* (?...) */
            bool is_logical = 0;
            const char * const seqstart = RExC_parse;
-            if (has_intervening_patws && SIZE_ONLY) {
-                ckWARNregdep(RExC_parse + 1, "In '(?...)', splitting the initial '(?' is deprecated");
+            if (has_intervening_patws) {
+                RExC_parse++;
+                vFAIL("In '(?...)', the '(' and '?' must be adjacent");
             }
 
            RExC_parse++;
index 81cb64b..c6e7f96 100644 (file)
@@ -20,7 +20,7 @@ BEGIN {
     require './test.pl';
 }
 
-plan tests => 733;  # Update this when adding/deleting tests.
+plan tests => 732;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -1403,13 +1403,6 @@ EOP
        ok("Perl" =~ /P.*$/i, '#116148');
     }
 
-    { # 117327: Sequence (?#...) not recognized in regex
-      # The space between the '(' and '?' is now deprecated; this test should
-      # be removed when the deprecation is made fatal.
-        no warnings;
-        like("ab", qr/a( ?#foo)b/x);
-    }
-
     { # 118297: Mixing up- and down-graded strings in regex
         utf8::upgrade(my $u = "\x{e5}");
         utf8::downgrade(my $d = "\x{e5}");
index 55eda18..529708a 100644 (file)
@@ -226,6 +226,8 @@ my @death =
  'm/\g{/'  => 'Sequence \g{... not terminated {#} m/\g{{#}/',
  'm/\k</'  => 'Sequence \k<... not terminated {#} m/\k<{#}/',
  'm/\cß/' => "Character following \"\\c\" must be printable ASCII",
+ '/((?# This is a comment in the middle of a token)?:foo)/' => 'In \'(?...)\', the \'(\' and \'?\' must be adjacent {#} m/((?# This is a comment in the middle of a token)?{#}:foo)/',
+ '/((?# This is a comment in the middle of a token)*FAIL)/' => 'In \'(*VERB...)\', the \'(\' and \'*\' must be adjacent {#} m/((?# This is a comment in the middle of a token)*{#}FAIL)/',
 );
 
 my @death_utf8 = mark_as_utf8(
@@ -416,8 +418,6 @@ my @experimental_regex_sets = (
 my @deprecated = (
     "/(?x)latin1\\\x{85}\x{85}\\\x{85}/" => 'Escape literal pattern white space under /x {#} ' . "m/(?x)latin1\\\x{85}\x{85}{#}\\\x{85}/",
     'use utf8; /(?x)utf8\\85\85\\85/' => 'Escape literal pattern white space under /x {#} ' . "m/(?x)utf8\\\N{NEXT LINE}\N{NEXT LINE}{#}\\\N{NEXT LINE}/",
-    '/((?# This is a comment in the middle of a token)?:foo)/' => 'In \'(?...)\', splitting the initial \'(?\' is deprecated {#} m/((?# This is a comment in the middle of a token)?{#}:foo)/',
-    '/((?# This is a comment in the middle of a token)*FAIL)/' => 'In \'(*VERB...)\', splitting the initial \'(*\' is deprecated {#} m/((?# This is a comment in the middle of a token)*{#}FAIL)/',
 );
 
 while (my ($regex, $expect) = splice @death, 0, 2) {