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