const bool pureperl = !CvISXSUB(cv) && CvROOT(cv);
if (CvLVALUE(compcv) && ! CvLVALUE(cv) && pureperl
&& ckWARN(WARN_MISC))
+ {
+ /* protect against fatal warnings leaking compcv */
+ SAVEFREESV(PL_compcv);
Perl_warner(aTHX_ packWARN(WARN_MISC), "lvalue attribute ignored after the subroutine has been defined");
+ SvREFCNT_inc_simple_void_NN(PL_compcv);
+ }
CvFLAGS(cv) |=
(CvFLAGS(compcv) & CVf_BUILTIN_ATTRS
& ~(CVf_LVALUE * pureperl));
const bool pureperl = !CvISXSUB(cv) && CvROOT(cv);
if (CvLVALUE(PL_compcv) && ! CvLVALUE(cv) && pureperl
&& ckWARN(WARN_MISC))
+ {
+ /* protect against fatal warnings leaking compcv */
+ SAVEFREESV(PL_compcv);
Perl_warner(aTHX_ packWARN(WARN_MISC), "lvalue attribute ignored after the subroutine has been defined");
+ SvREFCNT_inc_simple_void_NN(PL_compcv);
+ }
CvFLAGS(cv) |=
(CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS
& ~(CVf_LVALUE * pureperl));
eleak(2, 0, "$all s//\\1/", 's//\1/ with fatal warnings');
eleak(2, 0, "$all qq|\\i|", 'qq|\i| with fatal warnings');
eleak(2, 0, "$f 'digit'; qq|\\o{9}|", 'qq|\o{9}| with fatal warnings');
-$::TODO = 'still leaks';
eleak(2, 0, "$f 'misc'; sub foo{} sub foo:lvalue",
'ignored :lvalue with fatal warnings');
eleak(2, 0, "no warnings; use feature ':all'; $f 'misc';
my sub foo{} sub foo:lvalue",
'ignored mysub :lvalue with fatal warnings');
+$::TODO = 'still leaks';
eleak(2, 0, "no warnings; use feature ':all'; $all
my sub foo{} sub foo:lvalue{}",
'fatal mysub redef warning');