This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fatalize defined(@) and defined{%)
authorKarl Williamson <khw@cpan.org>
Tue, 17 Jun 2014 00:56:44 +0000 (18:56 -0600)
committerKarl Williamson <khw@cpan.org>
Tue, 17 Jun 2014 01:17:52 +0000 (19:17 -0600)
Calling defined on an array or hash has been deprecated and scheduled
for removal in v5.22.  This commit does that, removing the tests that
assumed they were defined.

In order to get the line numbers of the errors to display, I combined
the first and second lines of the message, omitting the \n

op.c
pod/perldiag.pod
t/lib/strict/refs
t/lib/warnings/op
t/op/gv.t
t/op/method.t
t/op/stash.t
t/op/undef.t
t/uni/gv.t
t/uni/stash.t

diff --git a/op.c b/op.c
index f321f20..b232de8 100644 (file)
--- a/op.c
+++ b/op.c
@@ -9062,17 +9062,13 @@ Perl_ck_defined(pTHX_ OP *o)            /* 19990527 MJD */
        case OP_RV2AV:
        case OP_PADAV:
        case OP_AASSIGN:                /* Is this a good idea? */
-           Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                          "defined(@array) is deprecated");
-           Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                          "\t(Maybe you should just omit the defined()?)\n");
+           Perl_croak(aTHX_ "Can't use 'defined(@array)'"
+                            " (Maybe you should just omit the defined()?)");
        break;
        case OP_RV2HV:
        case OP_PADHV:
-           Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                          "defined(%%hash) is deprecated");
-           Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                          "\t(Maybe you should just omit the defined()?)\n");
+           Perl_croak(aTHX_ "Can't use 'defined(%%hash)'"
+                            " (Maybe you should just omit the defined()?)");
            break;
        default:
            /* no warning */
index 2e9165f..0267523 100644 (file)
@@ -1227,6 +1227,34 @@ provide symbolic names for C<$!> errno values.
 byte-order at the same time, so this combination of modifiers is not
 allowed.  See L<perlfunc/pack>.
 
+=item Can't use 'defined(@array)' (Maybe you should just omit the defined()?)
+
+(F) defined() is not useful on arrays because it
+checks for an undefined I<scalar> value.  If you want to see if the
+array is empty, just use C<if (@array) { # not empty }> for example.
+
+=item Can't use 'defined(%hash)' (Maybe you should just omit the defined()?)
+
+(F) C<defined()> is not usually right on hashes.
+
+Although C<defined %hash> is false on a plain not-yet-used hash, it
+becomes true in several non-obvious circumstances, including iterators,
+weak references, stash names, even remaining true after C<undef %hash>.
+These things make C<defined %hash> fairly useless in practice, so it now
+generates a fatal error.
+
+If a check for non-empty is what you wanted then just put it in boolean
+context (see L<perldata/Scalar values>):
+
+    if (%hash) {
+       # not empty
+    }
+
+If you had C<defined %Foo::Bar::QUUX> to check whether such a package
+variable exists then that's never really been reliable, and isn't
+a good way to enquire about the features of a package, or whether
+it's loaded, etc.
+
 =item Can't use %s for loop variable
 
 (F) Only a simple scalar variable may be used as a loop variable on a
@@ -1567,35 +1595,6 @@ which case it indicates something else.
 This threshold can be changed from 100, by recompiling the F<perl> binary,
 setting the C pre-processor macro C<PERL_SUB_DEPTH_WARN> to the desired value.
 
-=item defined(@array) is deprecated
-
-(D deprecated) defined() is not usually useful on arrays because it
-checks for an undefined I<scalar> value.  If you want to see if the
-array is empty, just use C<if (@array) { # not empty }> for example.
-
-=item defined(%hash) is deprecated
-
-(D deprecated) C<defined()> is not usually right on hashes and has been
-discouraged since 5.004.
-
-Although C<defined %hash> is false on a plain not-yet-used hash, it
-becomes true in several non-obvious circumstances, including iterators,
-weak references, stash names, even remaining true after C<undef %hash>.
-These things make C<defined %hash> fairly useless in practice.
-
-If a check for non-empty is what you wanted then just put it in boolean
-context (see L<perldata/Scalar values>):
-
-    if (%hash) {
-       # not empty
-    }
-
-If you had C<defined %Foo::Bar::QUUX> to check whether such a package
-variable exists then that's never really been reliable, and isn't
-a good way to enquire about the features of a package, or whether
-it's loaded, etc.
-
-
 =item (?(DEFINE)....) does not allow branches in regex; marked by
 S<<-- HERE> in m/%s/
 
index e748512..ee9f42c 100644 (file)
@@ -340,24 +340,6 @@ defined $$x;
 EXPECT
 Can't use string ("foo") as a SCALAR ref while "strict refs" in use at - line 4.
 ########
-# [perl #37886] strict 'refs' doesn't apply inside defined
-use strict 'refs';
-my $x = "foo";
-defined @$x;
-EXPECT
-defined(@array) is deprecated at - line 4.
-       (Maybe you should just omit the defined()?)
-Can't use string ("foo") as an ARRAY ref while "strict refs" in use at - line 4.
-########
-# [perl #37886] strict 'refs' doesn't apply inside defined
-use strict 'refs';
-my $x = "foo";
-defined %$x;
-EXPECT
-defined(%hash) is deprecated at - line 4.
-       (Maybe you should just omit the defined()?)
-Can't use string ("foo") as a HASH ref while "strict refs" in use at - line 4.
-########
 # [perl #74168] Assertion failed: (SvTYPE(_svcur) >= SVt_PV), function Perl_softref2xv, file pp.c, line 240.
 use strict 'refs';
 my $o = 1 ; $o->{1} ;
index 4773aec..a6b3116 100644 (file)
        (Maybe you meant system() when you said exec()?
        exec "true" ; my $a
 
-     defined(@array) is deprecated
-       (Maybe you should just omit the defined()?)
+     Can't use defined(@array) (Maybe you should just omit the defined()?)
        my @a ; defined @a ;
        defined (@a = (1,2,3)) ;
 
-     defined(%hash) is deprecated
-       (Maybe you should just omit the defined()?)
+     Can't use defined(%hash) (Maybe you should just omit the defined()?)
        my %h ; defined %h ;
 
      "my %s" used in sort comparison
@@ -1071,32 +1069,32 @@ EXPECT
 # op.c
 defined(@a);
 EXPECT
-defined(@array) is deprecated at - line 2.
-       (Maybe you should just omit the defined()?)
+OPTION fatal
+Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at - line 2.
 ########
 # op.c
 my @a; defined(@a);
 EXPECT
-defined(@array) is deprecated at - line 2.
-       (Maybe you should just omit the defined()?)
+OPTION fatal
+Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at - line 2.
 ########
 # op.c
 defined(@a = (1,2,3));
 EXPECT
-defined(@array) is deprecated at - line 2.
-       (Maybe you should just omit the defined()?)
+OPTION fatal
+Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at - line 2.
 ########
 # op.c
 defined(%h);
 EXPECT
-defined(%hash) is deprecated at - line 2.
-       (Maybe you should just omit the defined()?)
+OPTION fatal
+Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at - line 2.
 ########
 # op.c
 my %h; defined(%h);
 EXPECT
-defined(%hash) is deprecated at - line 2.
-       (Maybe you should just omit the defined()?)
+OPTION fatal
+Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at - line 2.
 ########
 # op.c
 no warnings 'exec' ;
index 6b90864..f1ef962 100644 (file)
--- a/t/op/gv.t
+++ b/t/op/gv.t
@@ -12,7 +12,7 @@ BEGIN {
 
 use warnings;
 
-plan( tests => 271 );
+plan( tests => 267 );
 
 # type coercion on assignment
 $foo = 'foo';
@@ -200,18 +200,6 @@ is *x{PACKAGE}, 'main', 'and *foo{PACKAGE} the original package';
     my $a = "SYM000";
     ok(!defined *{$a});
 
-    {
-       no warnings 'deprecated';
-       ok(!defined @{$a});
-    }
-    ok(!defined *{$a});
-
-    {
-       no warnings 'deprecated';
-       ok(!defined %{$a});
-    }
-    ok(!defined *{$a});
-
     ok(!defined ${$a});
     ok(!defined *{$a});
 
index 059b44f..0f53c3a 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
 use strict;
 no warnings 'once';
 
-plan(tests => 147);
+plan(tests => 146);
 
 @A::ISA = 'B';
 @B::ISA = 'C';
@@ -170,15 +170,6 @@ no warnings 'redefine';
 is(A->eee(), "new B: In A::eee, 4");   # We get a correct $autoload
 is(A->eee(), "new B: In A::eee, 4");   # Which sticks
 
-{
-    no strict 'refs';
-    no warnings 'deprecated';
-    # this test added due to bug discovery (in 5.004_04, fb73857aa0bfa8ed)
-    # Possibly kill this test now that defined @::array is finally properly
-    # deprecated?
-    is(defined(@{"unknown_package::ISA"}) ? "defined" : "undefined", "undefined");
-}
-
 # test that failed subroutine calls don't affect method calls
 {
     package A1;
index f2e5523..5988114 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 
 BEGIN { require "./test.pl"; }
 
-plan( tests => 58 );
+plan( tests => 49 );
 
 # Used to segfault (bug #15479)
 fresh_perl_like(
@@ -36,18 +36,6 @@ SKIP: {
   );
 }
 
-{
-    no warnings 'deprecated';
-    ok( defined %oedipa::maas::, q(stashes happen to be defined if not used) );
-    ok( defined %{"oedipa::maas::"}, q(- work with hard refs too) );
-
-    ok( defined %tyrone::slothrop::, q(stashes are defined if seen at compile time) );
-    ok( defined %{"tyrone::slothrop::"}, q(- work with hard refs too) );
-
-    ok( defined %bongo::shaftsbury::, q(stashes are defined if a var is seen at compile time) );
-    ok( defined %{"bongo::shaftsbury::"}, q(- work with hard refs too) );
-}
-
 package tyrone::slothrop;
 $bongo::shaftsbury::scalar = 1;
 
@@ -73,17 +61,10 @@ package main;
                  );
 }
 
-# now tests in eval
-
-ok( eval  { no warnings 'deprecated'; defined %achtfaden:: },   'works in eval{}' );
-ok( eval q{ no warnings 'deprecated'; defined %schoenmaker:: }, 'works in eval("")' );
-
 # now tests with strictures
 
 {
     use strict;
-    no warnings 'deprecated';
-    ok( defined %pig::, q(referencing a non-existent stash doesn't produce stricture errors) );
     ok( !exists $pig::{bodine}, q(referencing a non-existent stash element doesn't produce stricture errors) );
 }
 
index d7d78c0..366c3d2 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 
 use vars qw(@ary %ary %hash);
 
-plan 86;
+plan 73;
 
 ok !defined($a);
 
@@ -44,35 +44,6 @@ ok !defined($ary{'bar'});
 undef $ary{'foo'};
 ok !defined($ary{'foo'});
 
-{
-    no warnings 'deprecated';
-    ok defined(@ary);
-    ok defined(%ary);
-}
-ok %ary;
-undef @ary;
-{
-    no warnings 'deprecated';
-    ok !defined(@ary);
-}
-undef %ary;
-{
-    no warnings 'deprecated';
-    ok !defined(%ary);
-}
-ok !%ary;
-@ary = (1);
-{
-    no warnings 'deprecated';
-    ok defined @ary;
-}
-%ary = (1,1);
-{
-    no warnings 'deprecated';
-    ok defined %ary;
-}
-ok %ary;
-
 sub foo { pass; 1 }
 
 &foo || fail;
@@ -88,24 +59,6 @@ eval { $1 = undef };
 like $@, qr/^Modification of a read/;
 
 {
-    require Tie::Hash;
-    tie my %foo, 'Tie::StdHash';
-    no warnings 'deprecated';
-    ok defined %foo;
-    %foo = ( a => 1 );
-    ok defined %foo;
-}
-
-{
-    require Tie::Array;
-    tie my @foo, 'Tie::StdArray';
-    no warnings 'deprecated';
-    ok defined @foo;
-    @foo = ( a => 1 );
-    ok defined @foo;
-}
-
-{
     # [perl #17753] segfault when undef'ing unquoted string constant
     eval 'undef tcp';
     like $@, qr/^Can't modify constant item/;
index 90a6332..670bb6a 100644 (file)
@@ -14,7 +14,7 @@ use utf8;
 use open qw( :utf8 :std );
 use warnings;
 
-plan( tests => 211 );
+plan( tests => 207 );
 
 # type coersion on assignment
 $ᕘ = 'ᕘ';
@@ -194,18 +194,6 @@ is (*{*Ẋ{GLOB}}, "*main::STDOUT");
     my $a = "Sʎm000";
     ok(!defined *{$a});
 
-    {
-       no warnings 'deprecated';
-       ok(!defined @{$a});
-    }
-    ok(!defined *{$a});
-
-    {
-       no warnings 'deprecated';
-       ok(!defined %{$a});
-    }
-    ok(!defined *{$a});
-
     ok(!defined ${$a});
     ok(!defined *{$a});
 
index 7d24e51..3d41e40 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
 use utf8;
 use open qw( :utf8 :std );
 
-plan( tests => 58 );
+plan( tests => 49 );
 
 #These come from op/my_stash.t
 {
@@ -39,35 +39,15 @@ plan( tests => 58 );
 
 #op/stash.t
 {
-    {
-        no warnings 'deprecated';
-        ok( defined %왿ퟀⲺa::ᒫṡ::, q(stashes happen to be defined if not used) );
-        ok( defined %{"왿ퟀⲺa::ᒫṡ::"}, q(- work with hard refs too) );
-    
-        ok( defined %ᛐⲞɲe::Šꇇᚽṙᆂṗ::, q(stashes are defined if seen at compile time) );
-        ok( defined %{"ᛐⲞɲe::Šꇇᚽṙᆂṗ::"}, q(- work with hard refs too) );
-    
-        ok( defined %본go::ଶfʦbᚒƴ::, q(stashes are defined if a var is seen at compile time) );
-        ok( defined %{"본go::ଶfʦbᚒƴ::"}, q(- work with hard refs too) );
-    }
-
-    
     package ᛐⲞɲe::Šꇇᚽṙᆂṗ;
     $본go::ଶfʦbᚒƴ::scalar = 1;
     
     package main;
         
-    # now tests in eval
-    
-    ok( eval  { no warnings 'deprecated'; defined %앛hȚꟻࡃҥ:: },   'works in eval{}' );
-    ok( eval q{ no warnings 'deprecated'; defined %Ṧㄘㇹen맠ㄦ:: }, 'works in eval("")' );
-    
     # now tests with strictures
     
     {
         use strict;
-        no warnings 'deprecated';
-        ok( defined %piƓ::, q(referencing a non-existent stash doesn't produce stricture errors) );
         ok( !exists $piƓ::{bodine}, q(referencing a non-existent stash element doesn't produce stricture errors) );
     }