This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bump version to 5.33.5
[perl5.git] / lib / feature.pm
index ed13273..7c60f1d 100644 (file)
@@ -5,32 +5,35 @@
 
 package feature;
 
-our $VERSION = '1.47';
+our $VERSION = '1.61';
 
 our %feature = (
-    fc              => 'feature_fc',
-    say             => 'feature_say',
-    state           => 'feature_state',
-    switch          => 'feature_switch',
-    bitwise         => 'feature_bitwise',
-    evalbytes       => 'feature_evalbytes',
-    array_base      => 'feature_arybase',
-    signatures      => 'feature_signatures',
-    current_sub     => 'feature___SUB__',
-    refaliasing     => 'feature_refaliasing',
-    postderef_qq    => 'feature_postderef_qq',
-    unicode_eval    => 'feature_unieval',
-    declared_refs   => 'feature_myref',
-    unicode_strings => 'feature_unicode',
+    fc               => 'feature_fc',
+    isa              => 'feature_isa',
+    say              => 'feature_say',
+    state            => 'feature_state',
+    switch           => 'feature_switch',
+    bitwise          => 'feature_bitwise',
+    indirect         => 'feature_indirect',
+    evalbytes        => 'feature_evalbytes',
+    signatures       => 'feature_signatures',
+    current_sub      => 'feature___SUB__',
+    refaliasing      => 'feature_refaliasing',
+    postderef_qq     => 'feature_postderef_qq',
+    unicode_eval     => 'feature_unieval',
+    declared_refs    => 'feature_myref',
+    unicode_strings  => 'feature_unicode',
+    multidimensional => 'feature_multidimensional',
 );
 
 our %feature_bundle = (
-    "5.10"    => [qw(array_base say state switch)],
-    "5.11"    => [qw(array_base say state switch unicode_strings)],
-    "5.15"    => [qw(current_sub evalbytes fc say state switch unicode_eval unicode_strings)],
-    "5.23"    => [qw(current_sub evalbytes fc postderef_qq say state switch unicode_eval unicode_strings)],
-    "all"     => [qw(array_base bitwise current_sub declared_refs evalbytes fc postderef_qq refaliasing say signatures state switch unicode_eval unicode_strings)],
-    "default" => [qw(array_base)],
+    "5.10"    => [qw(indirect multidimensional say state switch)],
+    "5.11"    => [qw(indirect multidimensional say state switch unicode_strings)],
+    "5.15"    => [qw(current_sub evalbytes fc indirect multidimensional say state switch unicode_eval unicode_strings)],
+    "5.23"    => [qw(current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
+    "5.27"    => [qw(bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
+    "all"     => [qw(bitwise current_sub declared_refs evalbytes fc indirect isa multidimensional postderef_qq refaliasing say signatures state switch unicode_eval unicode_strings)],
+    "default" => [qw(indirect multidimensional)],
 );
 
 $feature_bundle{"5.12"} = $feature_bundle{"5.11"};
@@ -46,15 +49,25 @@ $feature_bundle{"5.22"} = $feature_bundle{"5.15"};
 $feature_bundle{"5.24"} = $feature_bundle{"5.23"};
 $feature_bundle{"5.25"} = $feature_bundle{"5.23"};
 $feature_bundle{"5.26"} = $feature_bundle{"5.23"};
+$feature_bundle{"5.28"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.29"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.30"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.31"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.32"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.33"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.34"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.9.5"} = $feature_bundle{"5.10"};
 my %noops = (
     postderef => 1,
     lexical_subs => 1,
 );
+my %removed = (
+    array_base => 1,
+);
 
 our $hint_shift   = 26;
-our $hint_mask    = 0x1c000000;
-our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 );
+our $hint_mask    = 0x3c000000;
+our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 );
 
 # This gets set (for now) in $^H as well as in %^H,
 # for runtime speed of the uc/lc/ucfirst/lcfirst functions.
@@ -125,7 +138,7 @@ disable I<all> features (an unusual request!) use C<no feature ':all'>.
 
 =head2 The 'say' feature
 
-C<use feature 'say'> tells the compiler to enable the Perl 6 style
+C<use feature 'say'> tells the compiler to enable the Raku-inspired
 C<say> function.
 
 See L<perlfunc/say> for details.
@@ -149,7 +162,7 @@ explicitly disabled the warning:
 
     no warnings "experimental::smartmatch";
 
-C<use feature 'switch'> tells the compiler to enable the Perl 6
+C<use feature 'switch'> tells the compiler to enable the Raku
 given/when construct.
 
 See L<perlsyn/"Switch Statements"> for details.
@@ -175,8 +188,9 @@ C<use feature 'unicode_strings'> subpragma is B<strongly> recommended.
 
 This feature is available starting with Perl 5.12; was almost fully
 implemented in Perl 5.14; and extended in Perl 5.16 to cover C<quotemeta>;
-and extended further in Perl 5.26 to cover L<the range
-operator|perlop/Range Operators>.
+was extended further in Perl 5.26 to cover L<the range
+operator|perlop/Range Operators>; and was extended again in Perl 5.28 to
+cover L<special-cased whitespace splitting|perlfunc/split>.
 
 =head2 The 'unicode_eval' and 'evalbytes' features
 
@@ -206,9 +220,9 @@ This feature is available starting with Perl 5.16.
 
 =head2 The 'array_base' feature
 
-This feature supports the legacy C<$[> variable.  See L<perlvar/$[> and
-L<arybase>.  It is on by default but disabled under C<use v5.16> (see
-L</IMPLICIT LOADING>, below).
+This feature supported the legacy C<$[> variable.  See L<perlvar/$[>.
+It was on by default but disabled under C<use v5.16> (see
+L</IMPLICIT LOADING>, below) and unavailable since perl 5.30.
 
 This feature is available under this name starting with Perl 5.16.  In
 previous versions, it was simply on all the time, and this pragma knew
@@ -313,13 +327,6 @@ This feature is available from Perl 5.22 onwards.
 
 =head2 The 'bitwise' feature
 
-B<WARNING>: This feature is still experimental and the implementation may
-change in future versions of Perl.  For this reason, Perl will
-warn when you use the feature, unless you have explicitly disabled the
-warning:
-
-    no warnings "experimental::bitwise";
-
 This makes the four standard bitwise operators (C<& | ^ ~>) treat their
 operands consistently as numbers, and introduces four new dotted operators
 (C<&. |. ^. ~.>) that treat their operands consistently as strings.  The
@@ -327,7 +334,10 @@ same applies to the assignment variants (C<&= |= ^= &.= |.= ^.=>).
 
 See L<perlop/Bitwise String Operators> for details.
 
-This feature is available from Perl 5.22 onwards.
+This feature is available from Perl 5.22 onwards.  Starting in Perl 5.28,
+C<use v5.28> will enable the feature.  Before 5.28, it was still
+experimental and would emit a warning in the "experimental::bitwise"
+category.
 
 =head2 The 'declared_refs' feature
 
@@ -345,6 +355,43 @@ Reference to a Variable> for examples.
 
 This feature is available from Perl 5.26 onwards.
 
+=head2 The 'isa' feature
+
+This allows the use of the C<isa> infix operator, which tests whether the
+scalar given by the left operand is an object of the class given by the
+right operand. See L<perlop/Class Instance Operator> for more details.
+
+This feature is available from Perl 5.32 onwards.
+
+=head2 The 'indirect' feature
+
+This feature allows the use of L<indirect object
+syntax|perlobj/Indirect Object Syntax> for method calls, e.g.  C<new
+Foo 1, 2;>. It is enabled by default, but can be turned off to
+disallow indirect object syntax.
+
+This feature is available under this name from Perl 5.32 onwards. In
+previous versions, it was simply on all the time.  To disallow (or
+warn on) indirect object syntax on older Perls, see the L<indirect>
+CPAN module.
+
+=head2 The 'multidimensional' feature
+
+This feature enables multidimensional array emulation, a perl 4 (or
+earlier) feature that was used to emulate multidimensional arrays with
+hashes.  This works by converting code like C<< $foo{$x, y} >> into
+C<< $foo{join($;, $x, $y} >>.  It is enabled by default, but can be
+turned off to disable multidimensional array emulation.
+
+When this feature is disabled the syntax that is normally replaced
+will report a compilation error.
+
+This feature is available under this name from Perl 5.34 onwards. In
+previous versions, it was simply on all the time.
+
+You can use the L<multidimensional> module on CPAN to disable
+multidimensional array emulation for older versions of Perl.
+
 =head1 FEATURE BUNDLES
 
 It's possible to load multiple features together, using
@@ -357,33 +404,55 @@ The following feature bundles are available:
 
   bundle    features included
   --------- -----------------
-  :default  array_base
+  :default  indirect multidimensional
+
+  :5.10     indirect multidimensional say state switch
 
-  :5.10     say state switch array_base
+  :5.12     indirect multidimensional say state switch
+            unicode_strings
 
-  :5.12     say state switch unicode_strings array_base
+  :5.14     indirect multidimensional say state switch
+            unicode_strings
 
-  :5.14     say state switch unicode_strings array_base
+  :5.16     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.16     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.18     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.18     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.20     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.20     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.22     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.22     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.24     current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.24     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq
+  :5.26     current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.26     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq
+  :5.28     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
+
+  :5.30     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
+
+  :5.32     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
+
+  :5.34     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
 The C<:default> bundle represents the feature set that is enabled before
 any C<use feature> or C<no feature> declaration.
@@ -434,6 +503,9 @@ with the same effect.
 If the required version is older than Perl 5.10, the ":default" feature
 bundle is automatically loaded instead.
 
+Unlike C<use feature ":5.12">, saying C<use v5.12> (or any higher version)
+also does the equivalent of C<use strict>; see L<perlfunc/use> for details.
+
 =back
 
 =cut
@@ -465,7 +537,7 @@ sub __common {
     my $import = shift;
     my $bundle_number = $^H & $hint_mask;
     my $features = $bundle_number != $hint_mask
-       && $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]};
+      && $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]};
     if ($features) {
        # Features are enabled implicitly via bundle hints.
        # Delete any keys that may be left over from last time.
@@ -493,6 +565,9 @@ sub __common {
             if (exists $noops{$name}) {
                 next;
             }
+            if (!$import && exists $removed{$name}) {
+                next;
+            }
             unknown_feature($name);
         }
        if ($import) {