static CV *S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside);
static void
-S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside)
+S_cv_clone_pad(pTHX_ CV *proto, CV *cv, CV *outside, bool newcv)
{
dVAR;
I32 ix;
ENTER;
SAVESPTR(PL_compcv);
PL_compcv = cv;
+ if (newcv) SAVEFREESV(cv); /* in case of fatal warnings */
if (CvHASEVAL(cv))
CvOUTSIDE(cv) = MUTABLE_CV(SvREFCNT_inc_simple(outside));
S_cv_clone(aTHX_ (CV *)ppad[ix], (CV *)PL_curpad[ix], cv);
}
+ if (newcv) SvREFCNT_inc_simple_void_NN(cv);
LEAVE;
}
S_cv_clone(pTHX_ CV *proto, CV *cv, CV *outside)
{
dVAR;
+ const bool newcv = !cv;
assert(!CvUNIQUE(proto));
if (SvMAGIC(proto))
mg_copy((SV *)proto, (SV *)cv, 0, 0);
- if (CvPADLIST(proto)) S_cv_clone_pad(aTHX_ proto, cv, outside);
+ if (CvPADLIST(proto)) S_cv_clone_pad(aTHX_ proto, cv, outside, newcv);
DEBUG_Xv(
PerlIO_printf(Perl_debug_log, "\nPad CV clone\n");
'newCONSTSUB sub redefinition with fatal warnings');
eleak(2, 0, "$f 'misc'; my\$a,my\$a", 'double my with fatal warnings');
eleak(2, 0, "$f 'misc'; our\$a,our\$a", 'double our with fatal warnings');
-$::TODO = 'still leaks';
eleak(2, 0, "$f 'closure';
sub foo { my \$x; format=\n\@\n\$x\n.\n} write; ",
'format closing over unavailable var with fatal warnings');
+$::TODO = 'still leaks';
eleak(2, 0, "$all /(?{})?/ ", '(?{})? with fatal warnings');
eleak(2, 0, "$all /(?{})+/ ", '(?{})+ with fatal warnings');
eleak(2, 0, "$all /[\\i]/ ", 'invalid charclass escape with fatal warns');