This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
861371b47c6a72088cf838719856af7ec28301d9
[perl5.git] / t / op / signatures.t
1 #!perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     require './test.pl';
6     set_up_inc('../lib');
7 }
8
9 eval "#line 8 foo\nsub t004 :method (\$a) { }";
10 is $@, "Experimental subroutine signatures not enabled at foo line 8\.\n",
11     "error when not enabled";
12
13 eval "#line 8 foo\nsub t005 (\$) (\$a) { }";
14 is $@, "Experimental subroutine signatures not enabled at foo line 8\.\n",
15     "error when not enabled";
16
17 no warnings "illegalproto";
18
19 our $a = 123;
20 our $z;
21
22 sub t000 ($a) { $a || "z" }
23 is prototype(\&t000), "\$a", "(\$a) interpreted as protoype when not enabled";
24 is &t000(456), 123, "(\$a) not signature when not enabled";
25 is $a, 123;
26
27 no warnings "experimental::signatures";
28 use feature "signatures";
29
30 sub t001 { $a || "z" }
31 is prototype(\&t001), undef;
32 is eval("t001()"), 123;
33 is eval("t001(456)"), 123;
34 is eval("t001(456, 789)"), 123;
35 is $a, 123;
36
37 sub t002 () { $a || "z" }
38 is prototype(\&t002), undef;
39 is eval("t002()"), 123;
40 is eval("t002(456)"), undef;
41 like $@, qr/\AToo many arguments for subroutine at/;
42 is eval("t002(456, 789)"), undef;
43 like $@, qr/\AToo many arguments for subroutine at/;
44 is $a, 123;
45
46 sub t003 ( ) { $a || "z" }
47 is prototype(\&t003), undef;
48 is eval("t003()"), 123;
49 is eval("t003(456)"), undef;
50 like $@, qr/\AToo many arguments for subroutine at/;
51 is eval("t003(456, 789)"), undef;
52 like $@, qr/\AToo many arguments for subroutine at/;
53 is $a, 123;
54
55 sub t006 ($a) { $a || "z" }
56 is prototype(\&t006), undef;
57 is eval("t006()"), undef;
58 like $@, qr/\AToo few arguments for subroutine at/;
59 is eval("t006(0)"), "z";
60 is eval("t006(456)"), 456;
61 is eval("t006(456, 789)"), undef;
62 like $@, qr/\AToo many arguments for subroutine at/;
63 is eval("t006(456, 789, 987)"), undef;
64 like $@, qr/\AToo many arguments for subroutine at/;
65 is $a, 123;
66
67 sub t007 ($a, $b) { $a.$b }
68 is prototype(\&t007), undef;
69 is eval("t007()"), undef;
70 like $@, qr/\AToo few arguments for subroutine at/;
71 is eval("t007(456)"), undef;
72 like $@, qr/\AToo few arguments for subroutine at/;
73 is eval("t007(456, 789)"), "456789";
74 is eval("t007(456, 789, 987)"), undef;
75 like $@, qr/\AToo many arguments for subroutine at/;
76 is eval("t007(456, 789, 987, 654)"), undef;
77 like $@, qr/\AToo many arguments for subroutine at/;
78 is $a, 123;
79
80 sub t008 ($a, $b, $c) { $a.$b.$c }
81 is prototype(\&t008), undef;
82 is eval("t008()"), undef;
83 like $@, qr/\AToo few arguments for subroutine at/;
84 is eval("t008(456)"), undef;
85 like $@, qr/\AToo few arguments for subroutine at/;
86 is eval("t008(456, 789)"), undef;
87 like $@, qr/\AToo few arguments for subroutine at/;
88 is eval("t008(456, 789, 987)"), "456789987";
89 is eval("t008(456, 789, 987, 654)"), undef;
90 like $@, qr/\AToo many arguments for subroutine at/;
91 is $a, 123;
92
93 sub t009 ($abc, $def) { $abc.$def }
94 is prototype(\&t009), undef;
95 is eval("t009()"), undef;
96 like $@, qr/\AToo few arguments for subroutine at/;
97 is eval("t009(456)"), undef;
98 like $@, qr/\AToo few arguments for subroutine at/;
99 is eval("t009(456, 789)"), "456789";
100 is eval("t009(456, 789, 987)"), undef;
101 like $@, qr/\AToo many arguments for subroutine at/;
102 is eval("t009(456, 789, 987, 654)"), undef;
103 like $@, qr/\AToo many arguments for subroutine at/;
104 is $a, 123;
105
106 sub t010 ($a, $) { $a || "z" }
107 is prototype(\&t010), undef;
108 is eval("t010()"), undef;
109 like $@, qr/\AToo few arguments for subroutine at/;
110 is eval("t010(456)"), undef;
111 like $@, qr/\AToo few arguments for subroutine at/;
112 is eval("t010(0, 789)"), "z";
113 is eval("t010(456, 789)"), 456;
114 is eval("t010(456, 789, 987)"), undef;
115 like $@, qr/\AToo many arguments for subroutine at/;
116 is eval("t010(456, 789, 987, 654)"), undef;
117 like $@, qr/\AToo many arguments for subroutine at/;
118 is $a, 123;
119
120 sub t011 ($, $a) { $a || "z" }
121 is prototype(\&t011), undef;
122 is eval("t011()"), undef;
123 like $@, qr/\AToo few arguments for subroutine at/;
124 is eval("t011(456)"), undef;
125 like $@, qr/\AToo few arguments for subroutine at/;
126 is eval("t011(456, 0)"), "z";
127 is eval("t011(456, 789)"), 789;
128 is eval("t011(456, 789, 987)"), undef;
129 like $@, qr/\AToo many arguments for subroutine at/;
130 is eval("t011(456, 789, 987, 654)"), undef;
131 like $@, qr/\AToo many arguments for subroutine at/;
132 is $a, 123;
133
134 sub t012 ($, $) { $a || "z" }
135 is prototype(\&t012), undef;
136 is eval("t012()"), undef;
137 like $@, qr/\AToo few arguments for subroutine at/;
138 is eval("t012(456)"), undef;
139 like $@, qr/\AToo few arguments for subroutine at/;
140 is eval("t012(0, 789)"), 123;
141 is eval("t012(456, 789)"), 123;
142 is eval("t012(456, 789, 987)"), undef;
143 like $@, qr/\AToo many arguments for subroutine at/;
144 is eval("t012(456, 789, 987, 654)"), undef;
145 like $@, qr/\AToo many arguments for subroutine at/;
146 is $a, 123;
147
148 sub t013 ($) { $a || "z" }
149 is prototype(\&t013), undef;
150 is eval("t013()"), undef;
151 like $@, qr/\AToo few arguments for subroutine at/;
152 is eval("t013(0)"), 123;
153 is eval("t013(456)"), 123;
154 is eval("t013(456, 789)"), undef;
155 like $@, qr/\AToo many arguments for subroutine at/;
156 is eval("t013(456, 789, 987)"), undef;
157 like $@, qr/\AToo many arguments for subroutine at/;
158 is eval("t013(456, 789, 987, 654)"), undef;
159 like $@, qr/\AToo many arguments for subroutine at/;
160 is $a, 123;
161
162 sub t014 ($a = 222) { $a // "z" }
163 is prototype(\&t014), undef;
164 is eval("t014()"), 222;
165 is eval("t014(0)"), 0;
166 is eval("t014(undef)"), "z";
167 is eval("t014(456)"), 456;
168 is eval("t014(456, 789)"), undef;
169 like $@, qr/\AToo many arguments for subroutine at/;
170 is eval("t014(456, 789, 987)"), undef;
171 like $@, qr/\AToo many arguments for subroutine at/;
172 is $a, 123;
173
174 sub t015 ($a = undef) { $a // "z" }
175 is prototype(\&t015), undef;
176 is eval("t015()"), "z";
177 is eval("t015(0)"), 0;
178 is eval("t015(undef)"), "z";
179 is eval("t015(456)"), 456;
180 is eval("t015(456, 789)"), undef;
181 like $@, qr/\AToo many arguments for subroutine at/;
182 is eval("t015(456, 789, 987)"), undef;
183 like $@, qr/\AToo many arguments for subroutine at/;
184 is $a, 123;
185
186 sub t016 ($a = do { $z++; 222 }) { $a // "z" }
187 $z = 0;
188 is prototype(\&t016), undef;
189 is eval("t016()"), 222;
190 is $z, 1;
191 is eval("t016(0)"), 0;
192 is eval("t016(undef)"), "z";
193 is eval("t016(456)"), 456;
194 is eval("t016(456, 789)"), undef;
195 like $@, qr/\AToo many arguments for subroutine at/;
196 is eval("t016(456, 789, 987)"), undef;
197 like $@, qr/\AToo many arguments for subroutine at/;
198 is $z, 1;
199 is eval("t016()"), 222;
200 is $z, 2;
201 is $a, 123;
202
203 sub t018 { join("/", @_) }
204 sub t017 ($p = t018 222, $a = 333) { $p // "z" }
205 is prototype(\&t017), undef;
206 is eval("t017()"), "222/333";
207 is $a, 333;
208 $a = 123;
209 is eval("t017(0)"), 0;
210 is eval("t017(undef)"), "z";
211 is eval("t017(456)"), 456;
212 is eval("t017(456, 789)"), undef;
213 like $@, qr/\AToo many arguments for subroutine at/;
214 is eval("t017(456, 789, 987)"), undef;
215 like $@, qr/\AToo many arguments for subroutine at/;
216 is $a, 123;
217
218 sub t019 ($p = 222, $a = 333) { "$p/$a" }
219 is prototype(\&t019), undef;
220 is eval("t019()"), "222/333";
221 is eval("t019(0)"), "0/333";
222 is eval("t019(456)"), "456/333";
223 is eval("t019(456, 789)"), "456/789";
224 is eval("t019(456, 789, 987)"), undef;
225 like $@, qr/\AToo many arguments for subroutine at/;
226 is $a, 123;
227
228 sub t020 :prototype($) { $_[0]."z" }
229 sub t021 ($p = t020 222, $a = 333) { "$p/$a" }
230 is prototype(\&t021), undef;
231 is eval("t021()"), "222z/333";
232 is eval("t021(0)"), "0/333";
233 is eval("t021(456)"), "456/333";
234 is eval("t021(456, 789)"), "456/789";
235 is eval("t021(456, 789, 987)"), undef;
236 like $@, qr/\AToo many arguments for subroutine at/;
237 is $a, 123;
238
239 sub t022 ($p = do { $z += 10; 222 }, $a = do { $z++; 333 }) { "$p/$a" }
240 $z = 0;
241 is prototype(\&t022), undef;
242 is eval("t022()"), "222/333";
243 is $z, 11;
244 is eval("t022(0)"), "0/333";
245 is $z, 12;
246 is eval("t022(456)"), "456/333";
247 is $z, 13;
248 is eval("t022(456, 789)"), "456/789";
249 is eval("t022(456, 789, 987)"), undef;
250 like $@, qr/\AToo many arguments for subroutine at/;
251 is $z, 13;
252 is $a, 123;
253
254 sub t023 ($a = sub { $_[0]."z" }) { $a->("a")."y" }
255 is prototype(\&t023), undef;
256 is eval("t023()"), "azy";
257 is eval("t023(sub { \"x\".\$_[0].\"x\" })"), "xaxy";
258 is eval("t023(sub { \"x\".\$_[0].\"x\" }, 789)"), undef;
259 like $@, qr/\AToo many arguments for subroutine at/;
260 is $a, 123;
261
262 sub t036 ($a = $a."x") { $a."y" }
263 is prototype(\&t036), undef;
264 is eval("t036()"), "123xy";
265 is eval("t036(0)"), "0y";
266 is eval("t036(456)"), "456y";
267 is eval("t036(456, 789)"), undef;
268 like $@, qr/\AToo many arguments for subroutine at/;
269 is $a, 123;
270
271 sub t120 ($a = $_) { $a // "z" }
272 is prototype(\&t120), undef;
273 $_ = "___";
274 is eval("t120()"), "___";
275 $_ = "___";
276 is eval("t120(undef)"), "z";
277 $_ = "___";
278 is eval("t120(0)"), 0;
279 $_ = "___";
280 is eval("t120(456)"), 456;
281 $_ = "___";
282 is eval("t120(456, 789)"), undef;
283 like $@, qr/\AToo many arguments for subroutine at/;
284 is $a, 123;
285
286 sub t121 ($a = caller) { $a // "z" }
287 is prototype(\&t121), undef;
288 is eval("t121()"), "main";
289 is eval("t121(undef)"), "z";
290 is eval("t121(0)"), 0;
291 is eval("t121(456)"), 456;
292 is eval("t121(456, 789)"), undef;
293 like $@, qr/\AToo many arguments for subroutine at/;
294 is eval("package T121::Z; ::t121()"), "T121::Z";
295 is eval("package T121::Z; ::t121(undef)"), "z";
296 is eval("package T121::Z; ::t121(0)"), 0;
297 is eval("package T121::Z; ::t121(456)"), 456;
298 is eval("package T121::Z; ::t121(456, 789)"), undef;
299 like $@, qr/\AToo many arguments for subroutine at/;
300 is $a, 123;
301
302 sub t129 ($a = return 222) { $a."x" }
303 is prototype(\&t129), undef;
304 is eval("t129()"), "222";
305 is eval("t129(0)"), "0x";
306 is eval("t129(456)"), "456x";
307 is eval("t129(456, 789)"), undef;
308 like $@, qr/\AToo many arguments for subroutine at/;
309 is $a, 123;
310
311 use feature "current_sub";
312 sub t122 ($c = 5, $r = $c > 0 ? __SUB__->($c - 1) : "") { $c.$r }
313 is prototype(\&t122), undef;
314 is eval("t122()"), "543210";
315 is eval("t122(0)"), "0";
316 is eval("t122(1)"), "10";
317 is eval("t122(5)"), "543210";
318 is eval("t122(5, 789)"), "5789";
319 is eval("t122(5, 789, 987)"), undef;
320 like $@, qr/\AToo many arguments for subroutine at/;
321 is $a, 123;
322
323 sub t123 ($list = wantarray) { $list ? "list" : "scalar" }
324 is prototype(\&t123), undef;
325 is eval("scalar(t123())"), "scalar";
326 is eval("(t123())[0]"), "list";
327 is eval("scalar(t123(0))"), "scalar";
328 is eval("(t123(0))[0]"), "scalar";
329 is eval("scalar(t123(1))"), "list";
330 is eval("(t123(1))[0]"), "list";
331 is eval("t123(456, 789)"), undef;
332 like $@, qr/\AToo many arguments for subroutine at/;
333 is $a, 123;
334
335 sub t124 ($b = (local $a = $a + 1)) { "$a/$b" }
336 is prototype(\&t124), undef;
337 is eval("t124()"), "124/124";
338 is $a, 123;
339 is eval("t124(456)"), "123/456";
340 is $a, 123;
341 is eval("t124(456, 789)"), undef;
342 like $@, qr/\AToo many arguments for subroutine at/;
343 is $a, 123;
344
345 sub t125 ($c = (our $t125_counter)++) { $c }
346 is prototype(\&t125), undef;
347 is eval("t125()"), 0;
348 is eval("t125()"), 1;
349 is eval("t125()"), 2;
350 is eval("t125(456)"), 456;
351 is eval("t125(789)"), 789;
352 is eval("t125()"), 3;
353 is eval("t125()"), 4;
354 is eval("t125(456, 789)"), undef;
355 like $@, qr/\AToo many arguments for subroutine at/;
356 is $a, 123;
357
358 use feature "state";
359 sub t126 ($c = (state $s = $z++)) { $c }
360 is prototype(\&t126), undef;
361 $z = 222;
362 is eval("t126(456)"), 456;
363 is $z, 222;
364 is eval("t126()"), 222;
365 is $z, 223;
366 is eval("t126(456)"), 456;
367 is $z, 223;
368 is eval("t126()"), 222;
369 is $z, 223;
370 is eval("t126(456, 789)"), undef;
371 like $@, qr/\AToo many arguments for subroutine at/;
372 is $z, 223;
373 is $a, 123;
374
375 sub t127 ($c = do { state $s = $z++; $s++ }) { $c }
376 is prototype(\&t127), undef;
377 $z = 222;
378 is eval("t127(456)"), 456;
379 is $z, 222;
380 is eval("t127()"), 222;
381 is $z, 223;
382 is eval("t127()"), 223;
383 is eval("t127()"), 224;
384 is $z, 223;
385 is eval("t127(456)"), 456;
386 is eval("t127(789)"), 789;
387 is eval("t127()"), 225;
388 is eval("t127()"), 226;
389 is eval("t127(456, 789)"), undef;
390 like $@, qr/\AToo many arguments for subroutine at/;
391 is $z, 223;
392 is $a, 123;
393
394 sub t037 ($a = 222, $b = $a."x") { "$a/$b" }
395 is prototype(\&t037), undef;
396 is eval("t037()"), "222/222x";
397 is eval("t037(0)"), "0/0x";
398 is eval("t037(456)"), "456/456x";
399 is eval("t037(456, 789)"), "456/789";
400 is eval("t037(456, 789, 987)"), undef;
401 like $@, qr/\AToo many arguments for subroutine at/;
402 is $a, 123;
403
404 sub t128 ($a = 222, $b = ($a = 333)) { "$a/$b" }
405 is prototype(\&t128), undef;
406 is eval("t128()"), "333/333";
407 is eval("t128(0)"), "333/333";
408 is eval("t128(456)"), "333/333";
409 is eval("t128(456, 789)"), "456/789";
410 is eval("t128(456, 789, 987)"), undef;
411 like $@, qr/\AToo many arguments for subroutine at/;
412 is $a, 123;
413
414 sub t130 { join(",", @_).";".scalar(@_) }
415 sub t131 ($a = 222, $b = goto &t130) { "$a/$b" }
416 is prototype(\&t131), undef;
417 is eval("t131()"), ";0";
418 is eval("t131(0)"), "0;1";
419 is eval("t131(456)"), "456;1";
420 is eval("t131(456, 789)"), "456/789";
421 is eval("t131(456, 789, 987)"), undef;
422 like $@, qr/\AToo many arguments for subroutine at/;
423 is $a, 123;
424
425 eval "#line 8 foo\nsub t024 (\$a =) { }";
426 is $@, "Optional parameter lacks default expression at foo line 8\.\n";
427
428 sub t025 ($ = undef) { $a // "z" }
429 is prototype(\&t025), undef;
430 is eval("t025()"), 123;
431 is eval("t025(0)"), 123;
432 is eval("t025(456)"), 123;
433 is eval("t025(456, 789)"), undef;
434 like $@, qr/\AToo many arguments for subroutine at/;
435 is eval("t025(456, 789, 987)"), undef;
436 like $@, qr/\AToo many arguments for subroutine at/;
437 is eval("t025(456, 789, 987, 654)"), undef;
438 like $@, qr/\AToo many arguments for subroutine at/;
439 is $a, 123;
440
441 sub t026 ($ = 222) { $a // "z" }
442 is prototype(\&t026), undef;
443 is eval("t026()"), 123;
444 is eval("t026(0)"), 123;
445 is eval("t026(456)"), 123;
446 is eval("t026(456, 789)"), undef;
447 like $@, qr/\AToo many arguments for subroutine at/;
448 is eval("t026(456, 789, 987)"), undef;
449 like $@, qr/\AToo many arguments for subroutine at/;
450 is eval("t026(456, 789, 987, 654)"), undef;
451 like $@, qr/\AToo many arguments for subroutine at/;
452 is $a, 123;
453
454 sub t032 ($ = do { $z++; 222 }) { $a // "z" }
455 $z = 0;
456 is prototype(\&t032), undef;
457 is eval("t032()"), 123;
458 is $z, 1;
459 is eval("t032(0)"), 123;
460 is eval("t032(456)"), 123;
461 is eval("t032(456, 789)"), undef;
462 like $@, qr/\AToo many arguments for subroutine at/;
463 is eval("t032(456, 789, 987)"), undef;
464 like $@, qr/\AToo many arguments for subroutine at/;
465 is eval("t032(456, 789, 987, 654)"), undef;
466 like $@, qr/\AToo many arguments for subroutine at/;
467 is $z, 1;
468 is $a, 123;
469
470 sub t027 ($ =) { $a // "z" }
471 is prototype(\&t027), undef;
472 is eval("t027()"), 123;
473 is eval("t027(0)"), 123;
474 is eval("t027(456)"), 123;
475 is eval("t027(456, 789)"), undef;
476 like $@, qr/\AToo many arguments for subroutine at/;
477 is eval("t027(456, 789, 987)"), undef;
478 like $@, qr/\AToo many arguments for subroutine at/;
479 is eval("t027(456, 789, 987, 654)"), undef;
480 like $@, qr/\AToo many arguments for subroutine at/;
481 is $a, 123;
482
483 sub t119 ($ =, $a = 333) { $a // "z" }
484 is prototype(\&t119), undef;
485 is eval("t119()"), 333;
486 is eval("t119(0)"), 333;
487 is eval("t119(456)"), 333;
488 is eval("t119(456, 789)"), 789;
489 is eval("t119(456, 789, 987)"), undef;
490 like $@, qr/\AToo many arguments for subroutine at/;
491 is eval("t119(456, 789, 987, 654)"), undef;
492 like $@, qr/\AToo many arguments for subroutine at/;
493 is $a, 123;
494
495 sub t028 ($a, $b = 333) { "$a/$b" }
496 is prototype(\&t028), undef;
497 is eval("t028()"), undef;
498 like $@, qr/\AToo few arguments for subroutine at/;
499 is eval("t028(0)"), "0/333";
500 is eval("t028(456)"), "456/333";
501 is eval("t028(456, 789)"), "456/789";
502 is eval("t028(456, 789, 987)"), undef;
503 like $@, qr/\AToo many arguments for subroutine at/;
504 is $a, 123;
505
506 sub t045 ($a, $ = 333) { "$a/" }
507 is prototype(\&t045), undef;
508 is eval("t045()"), undef;
509 like $@, qr/\AToo few arguments for subroutine at/;
510 is eval("t045(0)"), "0/";
511 is eval("t045(456)"), "456/";
512 is eval("t045(456, 789)"), "456/";
513 is eval("t045(456, 789, 987)"), undef;
514 like $@, qr/\AToo many arguments for subroutine at/;
515 is $a, 123;
516
517 sub t046 ($, $b = 333) { "$a/$b" }
518 is prototype(\&t046), undef;
519 is eval("t046()"), undef;
520 like $@, qr/\AToo few arguments for subroutine at/;
521 is eval("t046(0)"), "123/333";
522 is eval("t046(456)"), "123/333";
523 is eval("t046(456, 789)"), "123/789";
524 is eval("t046(456, 789, 987)"), undef;
525 like $@, qr/\AToo many arguments for subroutine at/;
526 is $a, 123;
527
528 sub t047 ($, $ = 333) { "$a/" }
529 is prototype(\&t047), undef;
530 is eval("t047()"), undef;
531 like $@, qr/\AToo few arguments for subroutine at/;
532 is eval("t047(0)"), "123/";
533 is eval("t047(456)"), "123/";
534 is eval("t047(456, 789)"), "123/";
535 is eval("t047(456, 789, 987)"), undef;
536 like $@, qr/\AToo many arguments for subroutine at/;
537 is $a, 123;
538
539 sub t029 ($a, $b, $c = 222, $d = 333) { "$a/$b/$c/$d" }
540 is prototype(\&t029), undef;
541 is eval("t029()"), undef;
542 like $@, qr/\AToo few arguments for subroutine at/;
543 is eval("t029(0)"), undef;
544 like $@, qr/\AToo few arguments for subroutine at/;
545 is eval("t029(456)"), undef;
546 like $@, qr/\AToo few arguments for subroutine at/;
547 is eval("t029(456, 789)"), "456/789/222/333";
548 is eval("t029(456, 789, 987)"), "456/789/987/333";
549 is eval("t029(456, 789, 987, 654)"), "456/789/987/654";
550 is eval("t029(456, 789, 987, 654, 321)"), undef;
551 like $@, qr/\AToo many arguments for subroutine at/;
552 is eval("t029(456, 789, 987, 654, 321, 111)"), undef;
553 like $@, qr/\AToo many arguments for subroutine at/;
554 is $a, 123;
555
556 sub t038 ($a, $b = $a."x") { "$a/$b" }
557 is prototype(\&t038), undef;
558 is eval("t038()"), undef;
559 like $@, qr/\AToo few arguments for subroutine at/;
560 is eval("t038(0)"), "0/0x";
561 is eval("t038(456)"), "456/456x";
562 is eval("t038(456, 789)"), "456/789";
563 is eval("t038(456, 789, 987)"), undef;
564 like $@, qr/\AToo many arguments for subroutine at/;
565 is $a, 123;
566
567 eval "#line 8 foo\nsub t030 (\$a = 222, \$b) { }";
568 is $@, "Mandatory parameter follows optional parameter at foo line 8\.\n";
569
570 eval "#line 8 foo\nsub t031 (\$a = 222, \$b = 333, \$c, \$d) { }";
571 is $@, "Mandatory parameter follows optional parameter at foo line 8\.\n";
572
573 sub t034 (@abc) { join("/", @abc).";".scalar(@abc) }
574 is prototype(\&t034), undef;
575 is eval("t034()"), ";0";
576 is eval("t034(0)"), "0;1";
577 is eval("t034(456)"), "456;1";
578 is eval("t034(456, 789)"), "456/789;2";
579 is eval("t034(456, 789, 987)"), "456/789/987;3";
580 is eval("t034(456, 789, 987, 654)"), "456/789/987/654;4";
581 is eval("t034(456, 789, 987, 654, 321)"), "456/789/987/654/321;5";
582 is eval("t034(456, 789, 987, 654, 321, 111)"), "456/789/987/654/321/111;6";
583 is $a, 123;
584
585 eval "#line 8 foo\nsub t136 (\@abc = 222) { }";
586 like $@, qr/\AParse error at foo line 8\.\n/;
587
588 eval "#line 8 foo\nsub t137 (\@abc =) { }";
589 like $@, qr/\AParse error at foo line 8\.\n/;
590
591 sub t035 (@) { $a }
592 is prototype(\&t035), undef;
593 is eval("t035()"), 123;
594 is eval("t035(0)"), 123;
595 is eval("t035(456)"), 123;
596 is eval("t035(456, 789)"), 123;
597 is eval("t035(456, 789, 987)"), 123;
598 is eval("t035(456, 789, 987, 654)"), 123;
599 is eval("t035(456, 789, 987, 654, 321)"), 123;
600 is eval("t035(456, 789, 987, 654, 321, 111)"), 123;
601 is $a, 123;
602
603 eval "#line 8 foo\nsub t138 (\@ = 222) { }";
604 like $@, qr/\AParse error at foo line 8\.\n/;
605
606 eval "#line 8 foo\nsub t139 (\@ =) { }";
607 like $@, qr/\AParse error at foo line 8\.\n/;
608
609 sub t039 (%abc) { join("/", map { $_."=".$abc{$_} } sort keys %abc) }
610 is prototype(\&t039), undef;
611 is eval("t039()"), "";
612 is eval("t039(0)"), undef;
613 like $@, qr#\AOdd name/value argument for subroutine at#;
614 is eval("t039(456)"), undef;
615 like $@, qr#\AOdd name/value argument for subroutine at#;
616 is eval("t039(456, 789)"), "456=789";
617 is eval("t039(456, 789, 987)"), undef;
618 like $@, qr#\AOdd name/value argument for subroutine at#;
619 is eval("t039(456, 789, 987, 654)"), "456=789/987=654";
620 is eval("t039(456, 789, 987, 654, 321)"), undef;
621 like $@, qr#\AOdd name/value argument for subroutine at#;
622 is eval("t039(456, 789, 987, 654, 321, 111)"), "321=111/456=789/987=654";
623 is $a, 123;
624
625 eval "#line 8 foo\nsub t140 (\%abc = 222) { }";
626 like $@, qr/\AParse error at foo line 8\.\n/;
627
628 eval "#line 8 foo\nsub t141 (\%abc =) { }";
629 like $@, qr/\AParse error at foo line 8\.\n/;
630
631 sub t040 (%) { $a }
632 is prototype(\&t040), undef;
633 is eval("t040()"), 123;
634 is eval("t040(0)"), undef;
635 like $@, qr#\AOdd name/value argument for subroutine at#;
636 is eval("t040(456)"), undef;
637 like $@, qr#\AOdd name/value argument for subroutine at#;
638 is eval("t040(456, 789)"), 123;
639 is eval("t040(456, 789, 987)"), undef;
640 like $@, qr#\AOdd name/value argument for subroutine at#;
641 is eval("t040(456, 789, 987, 654)"), 123;
642 is eval("t040(456, 789, 987, 654, 321)"), undef;
643 like $@, qr#\AOdd name/value argument for subroutine at#;
644 is eval("t040(456, 789, 987, 654, 321, 111)"), 123;
645 is $a, 123;
646
647 eval "#line 8 foo\nsub t142 (\% = 222) { }";
648 like $@, qr/\AParse error at foo line 8\.\n/;
649
650 eval "#line 8 foo\nsub t143 (\% =) { }";
651 like $@, qr/\AParse error at foo line 8\.\n/;
652
653 sub t041 ($a, @b) { $a.";".join("/", @b) }
654 is prototype(\&t041), undef;
655 is eval("t041()"), undef;
656 like $@, qr/\AToo few arguments for subroutine at/;
657 is eval("t041(0)"), "0;";
658 is eval("t041(456)"), "456;";
659 is eval("t041(456, 789)"), "456;789";
660 is eval("t041(456, 789, 987)"), "456;789/987";
661 is eval("t041(456, 789, 987, 654)"), "456;789/987/654";
662 is eval("t041(456, 789, 987, 654, 321)"), "456;789/987/654/321";
663 is eval("t041(456, 789, 987, 654, 321, 111)"), "456;789/987/654/321/111";
664 is $a, 123;
665
666 sub t042 ($a, @) { $a.";" }
667 is prototype(\&t042), undef;
668 is eval("t042()"), undef;
669 like $@, qr/\AToo few arguments for subroutine at/;
670 is eval("t042(0)"), "0;";
671 is eval("t042(456)"), "456;";
672 is eval("t042(456, 789)"), "456;";
673 is eval("t042(456, 789, 987)"), "456;";
674 is eval("t042(456, 789, 987, 654)"), "456;";
675 is eval("t042(456, 789, 987, 654, 321)"), "456;";
676 is eval("t042(456, 789, 987, 654, 321, 111)"), "456;";
677 is $a, 123;
678
679 sub t043 ($, @b) { $a.";".join("/", @b) }
680 is prototype(\&t043), undef;
681 is eval("t043()"), undef;
682 like $@, qr/\AToo few arguments for subroutine at/;
683 is eval("t043(0)"), "123;";
684 is eval("t043(456)"), "123;";
685 is eval("t043(456, 789)"), "123;789";
686 is eval("t043(456, 789, 987)"), "123;789/987";
687 is eval("t043(456, 789, 987, 654)"), "123;789/987/654";
688 is eval("t043(456, 789, 987, 654, 321)"), "123;789/987/654/321";
689 is eval("t043(456, 789, 987, 654, 321, 111)"), "123;789/987/654/321/111";
690 is $a, 123;
691
692 sub t044 ($, @) { $a.";" }
693 is prototype(\&t044), undef;
694 is eval("t044()"), undef;
695 like $@, qr/\AToo few arguments for subroutine at/;
696 is eval("t044(0)"), "123;";
697 is eval("t044(456)"), "123;";
698 is eval("t044(456, 789)"), "123;";
699 is eval("t044(456, 789, 987)"), "123;";
700 is eval("t044(456, 789, 987, 654)"), "123;";
701 is eval("t044(456, 789, 987, 654, 321)"), "123;";
702 is eval("t044(456, 789, 987, 654, 321, 111)"), "123;";
703 is $a, 123;
704
705 sub t049 ($a, %b) { $a.";".join("/", map { $_."=".$b{$_} } sort keys %b) }
706 is prototype(\&t049), undef;
707 is eval("t049()"), undef;
708 like $@, qr/\AToo few arguments for subroutine at/;
709 is eval("t049(222)"), "222;";
710 is eval("t049(222, 456)"), undef;
711 like $@, qr#\AOdd name/value argument for subroutine at#;
712 is eval("t049(222, 456, 789)"), "222;456=789";
713 is eval("t049(222, 456, 789, 987)"), undef;
714 like $@, qr#\AOdd name/value argument for subroutine at#;
715 is eval("t049(222, 456, 789, 987, 654)"), "222;456=789/987=654";
716 is eval("t049(222, 456, 789, 987, 654, 321)"), undef;
717 like $@, qr#\AOdd name/value argument for subroutine at#;
718 is eval("t049(222, 456, 789, 987, 654, 321, 111)"),
719     "222;321=111/456=789/987=654";
720 is $a, 123;
721
722 sub t051 ($a, $b, $c, @d) { "$a;$b;$c;".join("/", @d).";".scalar(@d) }
723 is prototype(\&t051), undef;
724 is eval("t051()"), undef;
725 like $@, qr/\AToo few arguments for subroutine at/;
726 is eval("t051(456)"), undef;
727 like $@, qr/\AToo few arguments for subroutine at/;
728 is eval("t051(456, 789)"), undef;
729 like $@, qr/\AToo few arguments for subroutine at/;
730 is eval("t051(456, 789, 987)"), "456;789;987;;0";
731 is eval("t051(456, 789, 987, 654)"), "456;789;987;654;1";
732 is eval("t051(456, 789, 987, 654, 321)"), "456;789;987;654/321;2";
733 is eval("t051(456, 789, 987, 654, 321, 111)"), "456;789;987;654/321/111;3";
734 is $a, 123;
735
736 sub t052 ($a, $b, %c) { "$a;$b;".join("/", map { $_."=".$c{$_} } sort keys %c) }
737 is prototype(\&t052), undef;
738 is eval("t052()"), undef;
739 like $@, qr/\AToo few arguments for subroutine at/;
740 is eval("t052(222)"), undef;
741 like $@, qr/\AToo few arguments for subroutine at/;
742 is eval("t052(222, 333)"), "222;333;";
743 is eval("t052(222, 333, 456)"), undef;
744 like $@, qr#\AOdd name/value argument for subroutine at#;
745 is eval("t052(222, 333, 456, 789)"), "222;333;456=789";
746 is eval("t052(222, 333, 456, 789, 987)"), undef;
747 like $@, qr#\AOdd name/value argument for subroutine at#;
748 is eval("t052(222, 333, 456, 789, 987, 654)"), "222;333;456=789/987=654";
749 is eval("t052(222, 333, 456, 789, 987, 654, 321)"), undef;
750 like $@, qr#\AOdd name/value argument for subroutine at#;
751 is eval("t052(222, 333, 456, 789, 987, 654, 321, 111)"),
752     "222;333;321=111/456=789/987=654";
753 is $a, 123;
754
755 sub t053 ($a, $b, $c, %d) {
756     "$a;$b;$c;".join("/", map { $_."=".$d{$_} } sort keys %d)
757 }
758 is prototype(\&t053), undef;
759 is eval("t053()"), undef;
760 like $@, qr/\AToo few arguments for subroutine at/;
761 is eval("t053(222)"), undef;
762 like $@, qr/\AToo few arguments for subroutine at/;
763 is eval("t053(222, 333)"), undef;
764 like $@, qr/\AToo few arguments for subroutine at/;
765 is eval("t053(222, 333, 444)"), "222;333;444;";
766 is eval("t053(222, 333, 444, 456)"), undef;
767 like $@, qr#\AOdd name/value argument for subroutine at#;
768 is eval("t053(222, 333, 444, 456, 789)"), "222;333;444;456=789";
769 is eval("t053(222, 333, 444, 456, 789, 987)"), undef;
770 like $@, qr#\AOdd name/value argument for subroutine at#;
771 is eval("t053(222, 333, 444, 456, 789, 987, 654)"),
772     "222;333;444;456=789/987=654";
773 is eval("t053(222, 333, 444, 456, 789, 987, 654, 321)"), undef;
774 like $@, qr#\AOdd name/value argument for subroutine at#;
775 is eval("t053(222, 333, 444, 456, 789, 987, 654, 321, 111)"),
776     "222;333;444;321=111/456=789/987=654";
777 is $a, 123;
778
779 sub t048 ($a = 222, @b) { $a.";".join("/", @b).";".scalar(@b) }
780 is prototype(\&t048), undef;
781 is eval("t048()"), "222;;0";
782 is eval("t048(0)"), "0;;0";
783 is eval("t048(456)"), "456;;0";
784 is eval("t048(456, 789)"), "456;789;1";
785 is eval("t048(456, 789, 987)"), "456;789/987;2";
786 is eval("t048(456, 789, 987, 654)"), "456;789/987/654;3";
787 is eval("t048(456, 789, 987, 654, 321)"), "456;789/987/654/321;4";
788 is eval("t048(456, 789, 987, 654, 321, 111)"), "456;789/987/654/321/111;5";
789 is $a, 123;
790
791 sub t054 ($a = 222, $b = 333, @c) { "$a;$b;".join("/", @c).";".scalar(@c) }
792 is prototype(\&t054), undef;
793 is eval("t054()"), "222;333;;0";
794 is eval("t054(456)"), "456;333;;0";
795 is eval("t054(456, 789)"), "456;789;;0";
796 is eval("t054(456, 789, 987)"), "456;789;987;1";
797 is eval("t054(456, 789, 987, 654)"), "456;789;987/654;2";
798 is eval("t054(456, 789, 987, 654, 321)"), "456;789;987/654/321;3";
799 is eval("t054(456, 789, 987, 654, 321, 111)"), "456;789;987/654/321/111;4";
800 is $a, 123;
801
802 sub t055 ($a = 222, $b = 333, $c = 444, @d) {
803     "$a;$b;$c;".join("/", @d).";".scalar(@d)
804 }
805 is prototype(\&t055), undef;
806 is eval("t055()"), "222;333;444;;0";
807 is eval("t055(456)"), "456;333;444;;0";
808 is eval("t055(456, 789)"), "456;789;444;;0";
809 is eval("t055(456, 789, 987)"), "456;789;987;;0";
810 is eval("t055(456, 789, 987, 654)"), "456;789;987;654;1";
811 is eval("t055(456, 789, 987, 654, 321)"), "456;789;987;654/321;2";
812 is eval("t055(456, 789, 987, 654, 321, 111)"), "456;789;987;654/321/111;3";
813 is $a, 123;
814
815 sub t050 ($a = 211, %b) { $a.";".join("/", map { $_."=".$b{$_} } sort keys %b) }
816 is prototype(\&t050), undef;
817 is eval("t050()"), "211;";
818 is eval("t050(222)"), "222;";
819 is eval("t050(222, 456)"), undef;
820 like $@, qr#\AOdd name/value argument for subroutine at#;
821 is eval("t050(222, 456, 789)"), "222;456=789";
822 is eval("t050(222, 456, 789, 987)"), undef;
823 like $@, qr#\AOdd name/value argument for subroutine at#;
824 is eval("t050(222, 456, 789, 987, 654)"), "222;456=789/987=654";
825 is eval("t050(222, 456, 789, 987, 654, 321)"), undef;
826 like $@, qr#\AOdd name/value argument for subroutine at#;
827 is eval("t050(222, 456, 789, 987, 654, 321, 111)"),
828     "222;321=111/456=789/987=654";
829 is $a, 123;
830
831 sub t056 ($a = 211, $b = 311, %c) {
832     "$a;$b;".join("/", map { $_."=".$c{$_} } sort keys %c)
833 }
834 is prototype(\&t056), undef;
835 is eval("t056()"), "211;311;";
836 is eval("t056(222)"), "222;311;";
837 is eval("t056(222, 333)"), "222;333;";
838 is eval("t056(222, 333, 456)"), undef;
839 like $@, qr#\AOdd name/value argument for subroutine at#;
840 is eval("t056(222, 333, 456, 789)"), "222;333;456=789";
841 is eval("t056(222, 333, 456, 789, 987)"), undef;
842 like $@, qr#\AOdd name/value argument for subroutine at#;
843 is eval("t056(222, 333, 456, 789, 987, 654)"), "222;333;456=789/987=654";
844 is eval("t056(222, 333, 456, 789, 987, 654, 321)"), undef;
845 like $@, qr#\AOdd name/value argument for subroutine at#;
846 is eval("t056(222, 333, 456, 789, 987, 654, 321, 111)"),
847     "222;333;321=111/456=789/987=654";
848 is $a, 123;
849
850 sub t057 ($a = 211, $b = 311, $c = 411, %d) {
851     "$a;$b;$c;".join("/", map { $_."=".$d{$_} } sort keys %d)
852 }
853 is prototype(\&t057), undef;
854 is eval("t057()"), "211;311;411;";
855 is eval("t057(222)"), "222;311;411;";
856 is eval("t057(222, 333)"), "222;333;411;";
857 is eval("t057(222, 333, 444)"), "222;333;444;";
858 is eval("t057(222, 333, 444, 456)"), undef;
859 like $@, qr#\AOdd name/value argument for subroutine at#;
860 is eval("t057(222, 333, 444, 456, 789)"), "222;333;444;456=789";
861 is eval("t057(222, 333, 444, 456, 789, 987)"), undef;
862 like $@, qr#\AOdd name/value argument for subroutine at#;
863 is eval("t057(222, 333, 444, 456, 789, 987, 654)"),
864     "222;333;444;456=789/987=654";
865 is eval("t057(222, 333, 444, 456, 789, 987, 654, 321)"), undef;
866 like $@, qr#\AOdd name/value argument for subroutine at#;
867 is eval("t057(222, 333, 444, 456, 789, 987, 654, 321, 111)"),
868     "222;333;444;321=111/456=789/987=654";
869 is $a, 123;
870
871 sub t058 ($a, $b = 333, @c) { "$a;$b;".join("/", @c).";".scalar(@c) }
872 is prototype(\&t058), undef;
873 is eval("t058()"), undef;
874 like $@, qr/\AToo few arguments for subroutine at/;
875 is eval("t058(456)"), "456;333;;0";
876 is eval("t058(456, 789)"), "456;789;;0";
877 is eval("t058(456, 789, 987)"), "456;789;987;1";
878 is eval("t058(456, 789, 987, 654)"), "456;789;987/654;2";
879 is eval("t058(456, 789, 987, 654, 321)"), "456;789;987/654/321;3";
880 is eval("t058(456, 789, 987, 654, 321, 111)"), "456;789;987/654/321/111;4";
881 is $a, 123;
882
883 eval "#line 8 foo\nsub t059 (\@a, \$b) { }";
884 is $@, "Slurpy parameter not last at foo line 8\.\n";
885
886 eval "#line 8 foo\nsub t060 (\@a, \$b = 222) { }";
887 is $@, "Slurpy parameter not last at foo line 8\.\n";
888
889 eval "#line 8 foo\nsub t061 (\@a, \@b) { }";
890 is $@, "Slurpy parameter not last at foo line 8\.\n";
891
892 eval "#line 8 foo\nsub t062 (\@a, \%b) { }";
893 is $@, "Slurpy parameter not last at foo line 8\.\n";
894
895 eval "#line 8 foo\nsub t063 (\@, \$b) { }";
896 is $@, "Slurpy parameter not last at foo line 8\.\n";
897
898 eval "#line 8 foo\nsub t064 (\@, \$b = 222) { }";
899 is $@, "Slurpy parameter not last at foo line 8\.\n";
900
901 eval "#line 8 foo\nsub t065 (\@, \@b) { }";
902 is $@, "Slurpy parameter not last at foo line 8\.\n";
903
904 eval "#line 8 foo\nsub t066 (\@, \%b) { }";
905 is $@, "Slurpy parameter not last at foo line 8\.\n";
906
907 eval "#line 8 foo\nsub t067 (\@a, \$) { }";
908 is $@, "Slurpy parameter not last at foo line 8\.\n";
909
910 eval "#line 8 foo\nsub t068 (\@a, \$ = 222) { }";
911 is $@, "Slurpy parameter not last at foo line 8\.\n";
912
913 eval "#line 8 foo\nsub t069 (\@a, \@) { }";
914 is $@, "Slurpy parameter not last at foo line 8\.\n";
915
916 eval "#line 8 foo\nsub t070 (\@a, \%) { }";
917 is $@, "Slurpy parameter not last at foo line 8\.\n";
918
919 eval "#line 8 foo\nsub t071 (\@, \$) { }";
920 is $@, "Slurpy parameter not last at foo line 8\.\n";
921
922 eval "#line 8 foo\nsub t072 (\@, \$ = 222) { }";
923 is $@, "Slurpy parameter not last at foo line 8\.\n";
924
925 eval "#line 8 foo\nsub t073 (\@, \@) { }";
926 is $@, "Slurpy parameter not last at foo line 8\.\n";
927
928 eval "#line 8 foo\nsub t074 (\@, \%) { }";
929 is $@, "Slurpy parameter not last at foo line 8\.\n";
930
931 eval "#line 8 foo\nsub t075 (\%a, \$b) { }";
932 is $@, "Slurpy parameter not last at foo line 8\.\n";
933
934 eval "#line 8 foo\nsub t076 (\%, \$b) { }";
935 is $@, "Slurpy parameter not last at foo line 8\.\n";
936
937 eval "#line 8 foo\nsub t077 (\$a, \@b, \$c) { }";
938 is $@, "Slurpy parameter not last at foo line 8\.\n";
939
940 eval "#line 8 foo\nsub t078 (\$a, \%b, \$c) { }";
941 is $@, "Slurpy parameter not last at foo line 8\.\n";
942
943 eval "#line 8 foo\nsub t079 (\$a, \@b, \$c, \$d) { }";
944 is $@, "Slurpy parameter not last at foo line 8\.\n";
945
946 sub t080 ($a,,, $b) { $a.$b }
947 is prototype(\&t080), undef;
948 is eval("t080()"), undef;
949 like $@, qr/\AToo few arguments for subroutine at/;
950 is eval("t080(456)"), undef;
951 like $@, qr/\AToo few arguments for subroutine at/;
952 is eval("t080(456, 789)"), "456789";
953 is eval("t080(456, 789, 987)"), undef;
954 like $@, qr/\AToo many arguments for subroutine at/;
955 is eval("t080(456, 789, 987, 654)"), undef;
956 like $@, qr/\AToo many arguments for subroutine at/;
957 is $a, 123;
958
959 sub t081 ($a, $b,,) { $a.$b }
960 is prototype(\&t081), undef;
961 is eval("t081()"), undef;
962 like $@, qr/\AToo few arguments for subroutine at/;
963 is eval("t081(456)"), undef;
964 like $@, qr/\AToo few arguments for subroutine at/;
965 is eval("t081(456, 789)"), "456789";
966 is eval("t081(456, 789, 987)"), undef;
967 like $@, qr/\AToo many arguments for subroutine at/;
968 is eval("t081(456, 789, 987, 654)"), undef;
969 like $@, qr/\AToo many arguments for subroutine at/;
970 is $a, 123;
971
972 eval "#line 8 foo\nsub t082 (, \$a) { }";
973 like $@, qr/\AParse error at foo line 8\.\n/;
974
975 eval "#line 8 foo\nsub t083 (,) { }";
976 like $@, qr/\AParse error at foo line 8\.\n/;
977
978 sub t084($a,$b){ $a.$b }
979 is prototype(\&t084), undef;
980 is eval("t084()"), undef;
981 like $@, qr/\AToo few arguments for subroutine at/;
982 is eval("t084(456)"), undef;
983 like $@, qr/\AToo few arguments for subroutine at/;
984 is eval("t084(456, 789)"), "456789";
985 is eval("t084(456, 789, 987)"), undef;
986 like $@, qr/\AToo many arguments for subroutine at/;
987 is eval("t084(456, 789, 987, 654)"), undef;
988 like $@, qr/\AToo many arguments for subroutine at/;
989 is $a, 123;
990
991 sub t085
992     (
993     $
994     a
995     ,
996     ,
997     $
998     b
999     =
1000     333
1001     ,
1002     ,
1003     )
1004     { $a.$b }
1005 is prototype(\&t085), undef;
1006 is eval("t085()"), undef;
1007 like $@, qr/\AToo few arguments for subroutine at/;
1008 is eval("t085(456)"), "456333";
1009 is eval("t085(456, 789)"), "456789";
1010 is eval("t085(456, 789, 987)"), undef;
1011 like $@, qr/\AToo many arguments for subroutine at/;
1012 is eval("t085(456, 789, 987, 654)"), undef;
1013 like $@, qr/\AToo many arguments for subroutine at/;
1014 is $a, 123;
1015
1016 sub t086
1017     ( #foo)))
1018     $ #foo)))
1019     a #foo)))
1020     , #foo)))
1021     , #foo)))
1022     $ #foo)))
1023     b #foo)))
1024     = #foo)))
1025     333 #foo)))
1026     , #foo)))
1027     , #foo)))
1028     ) #foo)))
1029     { $a.$b }
1030 is prototype(\&t086), undef;
1031 is eval("t086()"), undef;
1032 like $@, qr/\AToo few arguments for subroutine at/;
1033 is eval("t086(456)"), "456333";
1034 is eval("t086(456, 789)"), "456789";
1035 is eval("t086(456, 789, 987)"), undef;
1036 like $@, qr/\AToo many arguments for subroutine at/;
1037 is eval("t086(456, 789, 987, 654)"), undef;
1038 like $@, qr/\AToo many arguments for subroutine at/;
1039 is $a, 123;
1040
1041 sub t087
1042     (#foo)))
1043     $ #foo)))
1044     a#foo)))
1045     ,#foo)))
1046     ,#foo)))
1047     $ #foo)))
1048     b#foo)))
1049     =#foo)))
1050     333#foo)))
1051     ,#foo)))
1052     ,#foo)))
1053     )#foo)))
1054     { $a.$b }
1055 is prototype(\&t087), undef;
1056 is eval("t087()"), undef;
1057 like $@, qr/\AToo few arguments for subroutine at/;
1058 is eval("t087(456)"), "456333";
1059 is eval("t087(456, 789)"), "456789";
1060 is eval("t087(456, 789, 987)"), undef;
1061 like $@, qr/\AToo many arguments for subroutine at/;
1062 is eval("t087(456, 789, 987, 654)"), undef;
1063 like $@, qr/\AToo many arguments for subroutine at/;
1064 is $a, 123;
1065
1066 eval "#line 8 foo\nsub t088 (\$ #foo\na) { }";
1067 is $@, "";
1068
1069 eval "#line 8 foo\nsub t089 (\$#foo\na) { }";
1070 like $@, qr/\AParse error at foo line 8\.\n/;
1071
1072 eval "#line 8 foo\nsub t090 (\@ #foo\na) { }";
1073 is $@, "";
1074
1075 eval "#line 8 foo\nsub t091 (\@#foo\na) { }";
1076 like $@, qr/\AParse error at foo line 8\.\n/;
1077
1078 eval "#line 8 foo\nsub t092 (\% #foo\na) { }";
1079 is $@, "";
1080
1081 eval "#line 8 foo\nsub t093 (\%#foo\na) { }";
1082 like $@, qr/\AParse error at foo line 8\.\n/;
1083
1084 eval "#line 8 foo\nsub t094 (123) { }";
1085 like $@, qr/\AParse error at foo line 8\.\n/;
1086
1087 eval "#line 8 foo\nsub t095 (\$a, 123) { }";
1088 like $@, qr/\AParse error at foo line 8\.\n/;
1089
1090 eval "#line 8 foo\nsub t096 (\$a 123) { }";
1091 like $@, qr/\AParse error at foo line 8\.\n/;
1092
1093 eval "#line 8 foo\nsub t097 (\$a { }) { }";
1094 like $@, qr/\AParse error at foo line 8\.\n/;
1095
1096 eval "#line 8 foo\nsub t098 (\$a; \$b) { }";
1097 like $@, qr/\AParse error at foo line 8\.\n/;
1098
1099 eval "#line 8 foo\nsub t099 (\$\$) { }";
1100 like $@, qr/\AParse error at foo line 8\.\n/;
1101
1102 no warnings "experimental::lexical_topic";
1103 sub t100 ($_) { "$::_/$_" }
1104 is prototype(\&t100), undef;
1105 $_ = "___";
1106 is eval("t100()"), undef;
1107 like $@, qr/\AToo few arguments for subroutine at/;
1108 $_ = "___";
1109 is eval("t100(0)"), "___/0";
1110 $_ = "___";
1111 is eval("t100(456)"), "___/456";
1112 $_ = "___";
1113 is eval("t100(456, 789)"), undef;
1114 like $@, qr/\AToo many arguments for subroutine at/;
1115 $_ = "___";
1116 is eval("t100(456, 789, 987)"), undef;
1117 like $@, qr/\AToo many arguments for subroutine at/;
1118 is $a, 123;
1119
1120 eval "#line 8 foo\nsub t101 (\@_) { }";
1121 like $@, qr/\ACan't use global \@_ in "my" at foo line 8/;
1122
1123 eval "#line 8 foo\nsub t102 (\%_) { }";
1124 like $@, qr/\ACan't use global \%_ in "my" at foo line 8/;
1125
1126 my $t103 = sub ($a) { $a || "z" };
1127 is prototype($t103), undef;
1128 is eval("\$t103->()"), undef;
1129 like $@, qr/\AToo few arguments for subroutine at/;
1130 is eval("\$t103->(0)"), "z";
1131 is eval("\$t103->(456)"), 456;
1132 is eval("\$t103->(456, 789)"), undef;
1133 like $@, qr/\AToo many arguments for subroutine at/;
1134 is eval("\$t103->(456, 789, 987)"), undef;
1135 like $@, qr/\AToo many arguments for subroutine at/;
1136 is $a, 123;
1137
1138 my $t118 = sub :prototype($) ($a) { $a || "z" };
1139 is prototype($t118), "\$";
1140 is eval("\$t118->()"), undef;
1141 like $@, qr/\AToo few arguments for subroutine at/;
1142 is eval("\$t118->(0)"), "z";
1143 is eval("\$t118->(456)"), 456;
1144 is eval("\$t118->(456, 789)"), undef;
1145 like $@, qr/\AToo many arguments for subroutine at/;
1146 is eval("\$t118->(456, 789, 987)"), undef;
1147 like $@, qr/\AToo many arguments for subroutine at/;
1148 is $a, 123;
1149
1150 sub t033 ($a = sub ($a) { $a."z" }) { $a->("a")."y" }
1151 is prototype(\&t033), undef;
1152 is eval("t033()"), "azy";
1153 is eval("t033(sub { \"x\".\$_[0].\"x\" })"), "xaxy";
1154 is eval("t033(sub { \"x\".\$_[0].\"x\" }, 789)"), undef;
1155 like $@, qr/\AToo many arguments for subroutine at/;
1156 is $a, 123;
1157
1158 sub t133 ($a = sub ($a = 222) { $a."z" }) { $a->()."/".$a->("a") }
1159 is prototype(\&t133), undef;
1160 is eval("t133()"), "222z/az";
1161 is eval("t133(sub { \"x\".(\$_[0] // \"u\").\"x\" })"), "xux/xax";
1162 is eval("t133(sub { \"x\".(\$_[0] // \"u\").\"x\" }, 789)"), undef;
1163 like $@, qr/\AToo many arguments for subroutine at/;
1164 is $a, 123;
1165
1166 sub t134 ($a = sub ($a, $t = sub { $_[0]."p" }) { $t->($a)."z" }) {
1167     $a->("a")."/".$a->("b", sub { $_[0]."q" } )
1168 }
1169 is prototype(\&t134), undef;
1170 is eval("t134()"), "apz/bqz";
1171 is eval("t134(sub { \"x\".(\$_[1] // sub{\$_[0]})->(\$_[0]).\"x\" })"),
1172     "xax/xbqx";
1173 is eval("t134(sub { \"x\".(\$_[1] // sub{\$_[0]})->(\$_[0]).\"x\" }, 789)"),
1174     undef;
1175 like $@, qr/\AToo many arguments for subroutine at/;
1176 is $a, 123;
1177
1178 sub t135 ($a = sub ($a, $t = sub ($p) { $p."p" }) { $t->($a)."z" }) {
1179     $a->("a")."/".$a->("b", sub { $_[0]."q" } )
1180 }
1181 is prototype(\&t135), undef;
1182 is eval("t135()"), "apz/bqz";
1183 is eval("t135(sub { \"x\".(\$_[1] // sub{\$_[0]})->(\$_[0]).\"x\" })"),
1184     "xax/xbqx";
1185 is eval("t135(sub { \"x\".(\$_[1] // sub{\$_[0]})->(\$_[0]).\"x\" }, 789)"),
1186     undef;
1187 like $@, qr/\AToo many arguments for subroutine at/;
1188 is $a, 123;
1189
1190 sub t132 (
1191     $a = sub ($a, $t = sub ($p = 222) { $p."p" }) { $t->($a)."z".$t->() },
1192 ) {
1193     $a->("a")."/".$a->("b", sub { ($_[0] // "u")."q" } )
1194 }
1195 is prototype(\&t132), undef;
1196 is eval("t132()"), "apz222p/bqzuq";
1197 is eval("t132(sub { \"x\".(\$_[1] // sub{\$_[0]})->(\$_[0]).\"x\" })"),
1198     "xax/xbqx";
1199 is eval("t132(sub { \"x\".(\$_[1] // sub{\$_[0]})->(\$_[0]).\"x\" }, 789)"),
1200     undef;
1201 like $@, qr/\AToo many arguments for subroutine at/;
1202 is $a, 123;
1203
1204 sub t104 :method ($a) { $a || "z" }
1205 is prototype(\&t104), undef;
1206 is eval("t104()"), undef;
1207 like $@, qr/\AToo few arguments for subroutine at/;
1208 is eval("t104(0)"), "z";
1209 is eval("t104(456)"), 456;
1210 is eval("t104(456, 789)"), undef;
1211 like $@, qr/\AToo many arguments for subroutine at/;
1212 is eval("t104(456, 789, 987)"), undef;
1213 like $@, qr/\AToo many arguments for subroutine at/;
1214 is $a, 123;
1215
1216 sub t105 :prototype($) ($a) { $a || "z" }
1217 is prototype(\&t105), "\$";
1218 is eval("t105()"), undef;
1219 like $@, qr/\ANot enough arguments for main::t105 /;
1220 is eval("t105(0)"), "z";
1221 is eval("t105(456)"), 456;
1222 is eval("t105(456, 789)"), undef;
1223 like $@, qr/\AToo many arguments for main::t105 at/;
1224 is eval("t105(456, 789, 987)"), undef;
1225 like $@, qr/\AToo many arguments for main::t105 at/;
1226 is $a, 123;
1227
1228 sub t106 :prototype(@) ($a) { $a || "z" }
1229 is prototype(\&t106), "\@";
1230 is eval("t106()"), undef;
1231 like $@, qr/\AToo few arguments for subroutine at/;
1232 is eval("t106(0)"), "z";
1233 is eval("t106(456)"), 456;
1234 is eval("t106(456, 789)"), undef;
1235 like $@, qr/\AToo many arguments for subroutine at/;
1236 is eval("t106(456, 789, 987)"), undef;
1237 like $@, qr/\AToo many arguments for subroutine at/;
1238 is $a, 123;
1239
1240 eval "#line 8 foo\nsub t107 (\$a) :method { }";
1241 isnt $@, "";
1242
1243 eval "#line 8 foo\nsub t108 (\$a) :prototype(\$) { }";
1244 isnt $@, "";
1245
1246 sub t109 { }
1247 is prototype(\&t109), undef;
1248 is scalar(@{[ t109() ]}), 0;
1249 is scalar(t109()), undef;
1250
1251 sub t110 () { }
1252 is prototype(\&t110), undef;
1253 is scalar(@{[ t110() ]}), 0;
1254 is scalar(t110()), undef;
1255
1256 sub t111 ($a) { }
1257 is prototype(\&t111), undef;
1258 is scalar(@{[ t111(222) ]}), 0;
1259 is scalar(t111(222)), undef;
1260
1261 sub t112 ($) { }
1262 is prototype(\&t112), undef;
1263 is scalar(@{[ t112(222) ]}), 0;
1264 is scalar(t112(222)), undef;
1265
1266 sub t114 ($a = undef) { }
1267 is prototype(\&t114), undef;
1268 is scalar(@{[ t114() ]}), 0;
1269 is scalar(t114()), undef;
1270 is scalar(@{[ t114(333) ]}), 0;
1271 is scalar(t114(333)), undef;
1272
1273 sub t113 ($a = 222) { }
1274 is prototype(\&t113), undef;
1275 is scalar(@{[ t113() ]}), 0;
1276 is scalar(t113()), undef;
1277 is scalar(@{[ t113(333) ]}), 0;
1278 is scalar(t113(333)), undef;
1279
1280 sub t115 ($a = do { $z++; 222 }) { }
1281 is prototype(\&t115), undef;
1282 $z = 0;
1283 is scalar(@{[ t115() ]}), 0;
1284 is $z, 1;
1285 is scalar(t115()), undef;
1286 is $z, 2;
1287 is scalar(@{[ t115(333) ]}), 0;
1288 is scalar(t115(333)), undef;
1289 is $z, 2;
1290
1291 sub t116 (@a) { }
1292 is prototype(\&t116), undef;
1293 is scalar(@{[ t116() ]}), 0;
1294 is scalar(t116()), undef;
1295 is scalar(@{[ t116(333) ]}), 0;
1296 is scalar(t116(333)), undef;
1297
1298 sub t117 (%a) { }
1299 is prototype(\&t117), undef;
1300 is scalar(@{[ t117() ]}), 0;
1301 is scalar(t117()), undef;
1302 is scalar(@{[ t117(333, 444) ]}), 0;
1303 is scalar(t117(333, 444)), undef;
1304
1305 use File::Spec::Functions;
1306 my $keywords_file = catfile(updir,'regen','keywords.pl');
1307 open my $kh, $keywords_file
1308    or die "$0 cannot open $keywords_file: $!";
1309 while(<$kh>) {
1310     if (m?__END__?..${\0} and /^[+-]/) {
1311         chomp(my $word = $');
1312         # $y should be an error after $x=foo.  The exact error we get may
1313         # differ if this is __END__ or s or some other special keyword.
1314         eval 'sub ($x = ' . $word . ', $y) {}';
1315         local $::TODO = 'does not work yet'
1316           if $word =~ /^(?:chmod|chown|die|exec|glob|kill|mkdir|print
1317                           |printf|return|reverse|select|setpgrp|sort|split
1318                           |system|unlink|utime|warn)\z/x;
1319         isnt $@, "", "$word does not swallow trailing comma";
1320     }
1321 }
1322
1323 done_testing;
1324
1325 1;