Skip to content

Commit 4f5a753

Browse files
committed
fixup permit unnamed slurpy mixed with named params
1 parent d709612 commit 4f5a753

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

op.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17125,10 +17125,6 @@ Perl_subsignature_finish(pTHX)
1712517125
aux->slurpy = signature->slurpy;
1712617126
aux->slurpy_padix = 0;
1712717127

17128-
if(signature->named_params && !aux->slurpy)
17129-
// maybe argcheck should do this?
17130-
aux->slurpy = '%';
17131-
1713217128
OP *multiparam = newUNOP_AUX(OP_MULTIPARAM, 0, NULL, (UNOP_AUX_item *)aux);
1713317129

1713417130
sigops = op_append_elem(OP_LINESEQ, sigops,

pp.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7901,7 +7901,9 @@ PP(pp_multiparam)
79017901
assert(!SvMAGICAL(defav));
79027902
size_t argc = (AvFILLp(defav) + 1);
79037903

7904-
S_check_argc(aTHX_ argc, nparams, nparams - aux->min_args, slurpy);
7904+
S_check_argc(aTHX_ argc, nparams, nparams - aux->min_args,
7905+
/* if there's no slurpy but we have named params, claim it to be '%' for argcheck */
7906+
slurpy ? slurpy : aux->n_named ? '%' : 0);
79057907

79067908
size_t parami;
79077909
for(parami = 0; parami < nparams; parami++) {
@@ -8026,6 +8028,9 @@ PP(pp_multiparam)
80268028
SvPADSTALE_off(*padentry);
80278029
SvSetMagicSV(*padentry, val);
80288030
}
8031+
else if(slurpy && !slurpypad) {
8032+
/* unnamed slurpy just ignores extra values */
8033+
}
80298034
else if(slurpypad && slurpy == '@') {
80308035
AV *av = (AV *)*slurpypad;
80318036

t/op/signatures.t

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,15 @@ is eval("tnamed05(w => 'W', x => 'X', y => 'Y', z => 'Z')"), "x=X y=Y w=W,z=Z";
956956
is eval("tnamed05(w => 'W', x => 'X', y => 'Y', 'single')"), undef;
957957
like $@, qr{^Odd name/value argument for subroutine 'main::tnamed05' at };
958958

959+
sub tnamed06 (:$x, :$y, @) { "x=$x y=$y"; }
960+
is prototype(\&tnamed06), undef;
961+
is eval("tnamed06(w => 'W', x => 'X', y => 'Y', z => 'Z')"), "x=X y=Y";
962+
is eval("tnamed06(w => 'W', x => 'X', y => 'Y', 'single')"), "x=X y=Y";
963+
964+
sub tnamed07 (:$x, :$y, %) { "x=$x y=$y"; }
965+
is prototype(\&tnamed07), undef;
966+
is eval("tnamed07(w => 'W', x => 'X', y => 'Y', z => 'Z')"), "x=X y=Y";
967+
959968
sub t085
960969
(
961970
$

0 commit comments

Comments
 (0)