This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make constant sub redef warnings obey scope
authorFather Chrysostomos <sprout@cpan.org>
Mon, 21 Nov 2011 21:02:47 +0000 (13:02 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 21 Nov 2011 21:02:47 +0000 (13:02 -0800)
In perldiag, this is listed as (S), which means that outside of any
use/no warnings scope it always warns, regardless of $^W.

But this warning was ignoring use/no warnings, too.

There were actually tests for this oddity, but I think those were
added by mistake, or this was just not thought through.  I cannot see
how this is not a bug.

op.c
sv.c
t/lib/warnings/op

diff --git a/op.c b/op.c
index 97407ad..257e221 100644 (file)
--- a/op.c
+++ b/op.c
@@ -6592,6 +6592,7 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
                                 strEQ(hvname, "autouse"))
                       ))
                    || (CvCONST(cv)
+                       && ckWARN_d(WARN_REDEFINE)
                        && (!const_sv || sv_cmp(cv_const_sv(cv), const_sv))))
                {
                    const line_t oldline = CopLINE(PL_curcop);
diff --git a/sv.c b/sv.c
index 0095e07..d4f0373 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3833,6 +3833,7 @@ S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
                                  )
                                 )
                                 || (CvCONST(cv)
+                                    && ckWARN_d(WARN_REDEFINE)
                                     && (!CvCONST((const CV *)sref)
                                         || sv_cmp(cv_const_sv(cv),
                                                   cv_const_sv((const CV *)
index 1a1bb26..6c1f1f1 100644 (file)
@@ -732,18 +732,28 @@ EXPECT
 Constant subroutine fred redefined at - line 4.
 ########
 # op.c
+sub fred () { 1 }
+sub fred () { 2 }
+EXPECT
+Constant subroutine fred redefined at - line 3.
+########
+# op.c
+sub fred () { 1 }
+*fred = sub () { 2 };
+EXPECT
+Constant subroutine main::fred redefined at - line 3.
+########
+# op.c
 no warnings 'redefine' ;
 sub fred () { 1 }
 sub fred () { 2 }
 EXPECT
-Constant subroutine fred redefined at - line 4.
 ########
 # op.c
 no warnings 'redefine' ;
 sub fred () { 1 }
 *fred = sub () { 2 };
 EXPECT
-Constant subroutine main::fred redefined at - line 4.
 ########
 # op.c
 use warnings 'redefine' ;
@@ -1240,22 +1250,20 @@ EXPECT
 Constant subroutine frèd redefined at - line 6.
 ########
 # op.c
-no warnings 'redefine' ;
 use utf8;
 use open qw( :utf8 :std );
 sub frèd () { 1 }
 sub frèd () { 2 }
 EXPECT
-Constant subroutine frèd redefined at - line 6.
+Constant subroutine frèd redefined at - line 5.
 ########
 # op.c
-no warnings 'redefine' ;
 use utf8;
 use open qw( :utf8 :std );
 sub frèd () { 1 }
 *frèd = sub () { 2 };
 EXPECT
-Constant subroutine main::frèd redefined at - line 6.
+Constant subroutine main::frèd redefined at - line 5.
 ########
 # op.c
 use warnings 'redefine' ;
@@ -1280,20 +1288,18 @@ EXPECT
 Constant subroutine ᚠርƊ redefined at - line 6.
 ########
 # op.c
-no warnings 'redefine' ;
 use utf8;
 use open qw( :utf8 :std );
 sub ᚠርƊ () { 1 }
 sub ᚠርƊ () { 2 }
 EXPECT
-Constant subroutine ᚠርƊ redefined at - line 6.
+Constant subroutine ᚠርƊ redefined at - line 5.
 ########
 # op.c
-no warnings 'redefine' ;
 use utf8;
 use open qw( :utf8 :std );
 sub ᚠርƊ () { 1 }
 *ᚠርƊ = sub () { 2 };
 EXPECT
-Constant subroutine main::ᚠርƊ redefined at - line 6.
+Constant subroutine main::ᚠርƊ redefined at - line 5.
 ########