Skip to content

Commit 33c5d63

Browse files
committed
fixup forbid duplicate parameter names
1 parent c640087 commit 33c5d63

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

op.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16990,8 +16990,21 @@ Perl_subsignature_append_named(pTHX_ const char *paramname, PADOFFSET padix, OPC
1699016990
return;
1699116991
}
1699216992

16993+
SV *namesv = newSVpvn_utf8(paramname, strlen(paramname), true);
16994+
16995+
for(size_t parami = 0; parami < signature->named_params; parami++) {
16996+
struct yy_parser_signature_param *param = signature->params + parami;
16997+
16998+
if(!param->paramname || !sv_streq(param->paramname, namesv))
16999+
continue;
17000+
17001+
SvREFCNT_dec(namesv);
17002+
yyerror("Duplicated subroutine parameter name");
17003+
return;
17004+
}
17005+
1699317006
struct yy_parser_signature_param *param = subsignature_push_param();
16994-
param->paramname = newSVpvn_utf8(paramname, strlen(paramname), true);
17007+
param->paramname = namesv;
1699517008

1699617009
signature->named_params++;
1699717010

pod/perldiag.pod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,6 +2356,12 @@ already been freed.
23562356
(W unpack) You have applied the same modifier more than once after a
23572357
type in a pack template. See L<perlfunc/pack>.
23582358

2359+
=item Duplicated subroutine parameter name
2360+
2361+
(F) You have attempted to use a subroutine parameter name a second time.
2362+
2363+
sub f ( :$name, :$name ) { ... }
2364+
23592365
=item each on anonymous %s will always start from the beginning
23602366

23612367
(W syntax) You called L<each|perlfunc/each> on an anonymous hash or

t/lib/croak/signatures

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ sub t060 (@a, $b = 222) { }
8181
EXPECT
8282
Slurpy parameter not last at - line 2, near "222) "
8383
########
84+
# NAME duplicated named parameter
85+
no warnings 'experimental::signature_named_parameters';
86+
sub f (:$x, :$x) { }
87+
EXPECT
88+
Duplicated subroutine parameter name at - line 3, near ":$x) "
89+
########
8490
sub t061 (@a, @b) { }
8591
EXPECT
8692
Multiple slurpy parameters not allowed at - line 2, near "@b) "

0 commit comments

Comments
 (0)