Consolidated lvalue sub changes
[p5sagit/p5-mst-13.2.git] / t / pragma / sub_lval.t
CommitLineData
78f9721b 1print "1..63\n";
cd06dffe 2
3BEGIN {
4 chdir 't' if -d 't';
20822f61 5 @INC = '../lib';
cd06dffe 6}
7
78f9721b 8sub a : lvalue { my $a = 34; ${\(bless \$a)} } # Return a temporary
9sub b : lvalue { ${\shift} }
cd06dffe 10
11my $out = a(b()); # Check that temporaries are allowed.
12print "# `$out'\nnot " unless ref $out eq 'main'; # Not reached if error.
13print "ok 1\n";
14
15my @out = grep /main/, a(b()); # Check that temporaries are allowed.
16print "# `@out'\nnot " unless @out==1; # Not reached if error.
17print "ok 2\n";
18
19my $in;
20
21# Check that we can return localized values from subroutines:
22
a98df962 23sub in : lvalue { $in = shift; }
24sub neg : lvalue { #(num_str) return num_str
cd06dffe 25 local $_ = shift;
26 s/^\+/-/;
27 $_;
28}
29in(neg("+2"));
30
31
32print "# `$in'\nnot " unless $in eq '-2';
33print "ok 3\n";
34
a98df962 35sub get_lex : lvalue { $in }
36sub get_st : lvalue { $blah }
78f9721b 37sub id : lvalue { ${\shift} }
a98df962 38sub id1 : lvalue { $_[0] }
78f9721b 39sub inc : lvalue { ${\++$_[0]} }
cd06dffe 40
41$in = 5;
42$blah = 3;
43
44get_st = 7;
45
46print "# `$blah' ne 7\nnot " unless $blah eq 7;
47print "ok 4\n";
48
49get_lex = 7;
50
51print "# `$in' ne 7\nnot " unless $in eq 7;
52print "ok 5\n";
53
54++get_st;
55
56print "# `$blah' ne 8\nnot " unless $blah eq 8;
57print "ok 6\n";
58
59++get_lex;
60
61print "# `$in' ne 8\nnot " unless $in eq 8;
62print "ok 7\n";
63
64id(get_st) = 10;
65
66print "# `$blah' ne 10\nnot " unless $blah eq 10;
67print "ok 8\n";
68
69id(get_lex) = 10;
70
71print "# `$in' ne 10\nnot " unless $in eq 10;
72print "ok 9\n";
73
74++id(get_st);
75
76print "# `$blah' ne 11\nnot " unless $blah eq 11;
77print "ok 10\n";
78
79++id(get_lex);
80
81print "# `$in' ne 11\nnot " unless $in eq 11;
82print "ok 11\n";
83
84id1(get_st) = 20;
85
86print "# `$blah' ne 20\nnot " unless $blah eq 20;
87print "ok 12\n";
88
89id1(get_lex) = 20;
90
91print "# `$in' ne 20\nnot " unless $in eq 20;
92print "ok 13\n";
93
94++id1(get_st);
95
96print "# `$blah' ne 21\nnot " unless $blah eq 21;
97print "ok 14\n";
98
99++id1(get_lex);
100
101print "# `$in' ne 21\nnot " unless $in eq 21;
102print "ok 15\n";
103
104inc(get_st);
105
106print "# `$blah' ne 22\nnot " unless $blah eq 22;
107print "ok 16\n";
108
109inc(get_lex);
110
111print "# `$in' ne 22\nnot " unless $in eq 22;
112print "ok 17\n";
113
114inc(id(get_st));
115
116print "# `$blah' ne 23\nnot " unless $blah eq 23;
117print "ok 18\n";
118
119inc(id(get_lex));
120
121print "# `$in' ne 23\nnot " unless $in eq 23;
122print "ok 19\n";
123
124++inc(id1(id(get_st)));
125
126print "# `$blah' ne 25\nnot " unless $blah eq 25;
127print "ok 20\n";
128
129++inc(id1(id(get_lex)));
130
131print "# `$in' ne 25\nnot " unless $in eq 25;
132print "ok 21\n";
133
134@a = (1) x 3;
135@b = (undef) x 2;
136$#c = 3; # These slots are not fillable.
137
138# Explanation: empty slots contain &sv_undef.
139
140=for disabled constructs
141
a98df962 142sub a3 :lvalue {@a}
143sub b2 : lvalue {@b}
144sub c4: lvalue {@c}
cd06dffe 145
146$_ = '';
147
148eval <<'EOE' or $_ = $@;
149 ($x, a3, $y, b2, $z, c4, $t) = (34 .. 78);
150 1;
151EOE
152
153#@out = ($x, a3, $y, b2, $z, c4, $t);
154#@in = (34 .. 41, (undef) x 4, 46);
155#print "# `@out' ne `@in'\nnot " unless "@out" eq "@in";
156
157print "# '$_'.\nnot "
158 unless /Can\'t return an uninitialized value from lvalue subroutine/;
159=cut
160
161print "ok 22\n";
162
163my $var;
164
a98df962 165sub a::var : lvalue { $var }
cd06dffe 166
167"a"->var = 45;
168
169print "# `$var' ne 45\nnot " unless $var eq 45;
170print "ok 23\n";
171
172my $oo;
173$o = bless \$oo, "a";
174
175$o->var = 47;
176
177print "# `$var' ne 47\nnot " unless $var eq 47;
178print "ok 24\n";
179
a98df962 180sub o : lvalue { $o }
cd06dffe 181
182o->var = 49;
183
184print "# `$var' ne 49\nnot " unless $var eq 49;
185print "ok 25\n";
186
187sub nolv () { $x0, $x1 } # Not lvalue
188
189$_ = '';
190
191eval <<'EOE' or $_ = $@;
192 nolv = (2,3);
193 1;
194EOE
195
196print "not "
197 unless /Can\'t modify non-lvalue subroutine call in scalar assignment/;
198print "ok 26\n";
199
200$_ = '';
201
202eval <<'EOE' or $_ = $@;
203 nolv = (2,3) if $_;
204 1;
205EOE
206
207print "not "
208 unless /Can\'t modify non-lvalue subroutine call in scalar assignment/;
209print "ok 27\n";
210
211$_ = '';
212
213eval <<'EOE' or $_ = $@;
214 &nolv = (2,3) if $_;
215 1;
216EOE
217
218print "not "
219 unless /Can\'t modify non-lvalue subroutine call in scalar assignment/;
220print "ok 28\n";
221
222$x0 = $x1 = $_ = undef;
223$nolv = \&nolv;
224
225eval <<'EOE' or $_ = $@;
226 $nolv->() = (2,3) if $_;
227 1;
228EOE
229
230print "# '$_', '$x0', '$x1'.\nnot " if defined $_;
231print "ok 29\n";
232
233$x0 = $x1 = $_ = undef;
234$nolv = \&nolv;
235
236eval <<'EOE' or $_ = $@;
237 $nolv->() = (2,3);
238 1;
239EOE
240
241print "# '$_', '$x0', '$x1'.\nnot "
5c0bc887 242 unless /Can\'t modify non-lvalue subroutine call/;
cd06dffe 243print "ok 30\n";
244
a98df962 245sub lv0 : lvalue { } # Converted to lv10 in scalar context
cd06dffe 246
247$_ = undef;
248eval <<'EOE' or $_ = $@;
249 lv0 = (2,3);
250 1;
251EOE
252
253print "# '$_'.\nnot "
254 unless /Can\'t return a readonly value from lvalue subroutine/;
255print "ok 31\n";
256
a98df962 257sub lv10 : lvalue {}
cd06dffe 258
259$_ = undef;
260eval <<'EOE' or $_ = $@;
261 (lv0) = (2,3);
262 1;
263EOE
264
265print "# '$_'.\nnot " if defined $_;
266print "ok 32\n";
267
a98df962 268sub lv1u :lvalue { undef }
cd06dffe 269
270$_ = undef;
271eval <<'EOE' or $_ = $@;
272 lv1u = (2,3);
273 1;
274EOE
275
276print "# '$_'.\nnot "
277 unless /Can\'t return a readonly value from lvalue subroutine/;
278print "ok 33\n";
279
280$_ = undef;
281eval <<'EOE' or $_ = $@;
282 (lv1u) = (2,3);
283 1;
284EOE
285
286print "# '$_'.\nnot "
287 unless /Can\'t return an uninitialized value from lvalue subroutine/;
288print "ok 34\n";
289
290$x = '1234567';
cd06dffe 291
292$_ = undef;
293eval <<'EOE' or $_ = $@;
78f9721b 294 sub lv1t : lvalue { index $x, 2 }
cd06dffe 295 lv1t = (2,3);
296 1;
297EOE
298
299print "# '$_'.\nnot "
78f9721b 300 unless /Can\'t modify index in lvalue subroutine return/;
cd06dffe 301print "ok 35\n";
302
303$_ = undef;
304eval <<'EOE' or $_ = $@;
78f9721b 305 sub lv2t : lvalue { shift }
306 (lv2t) = (2,3);
cd06dffe 307 1;
308EOE
309
310print "# '$_'.\nnot "
78f9721b 311 unless /Can\'t modify shift in lvalue subroutine return/;
cd06dffe 312print "ok 36\n";
313
314$xxx = 'xxx';
315sub xxx () { $xxx } # Not lvalue
cd06dffe 316
317$_ = undef;
318eval <<'EOE' or $_ = $@;
78f9721b 319 sub lv1tmp : lvalue { xxx } # is it a TEMP?
cd06dffe 320 lv1tmp = (2,3);
321 1;
322EOE
323
324print "# '$_'.\nnot "
78f9721b 325 unless /Can\'t modify non-lvalue subroutine call in lvalue subroutine return/;
cd06dffe 326print "ok 37\n";
327
328$_ = undef;
329eval <<'EOE' or $_ = $@;
330 (lv1tmp) = (2,3);
331 1;
332EOE
333
334print "# '$_'.\nnot "
335 unless /Can\'t return a temporary from lvalue subroutine/;
336print "ok 38\n";
337
9a049f1c 338sub yyy () { 'yyy' } # Const, not lvalue
cd06dffe 339
340$_ = undef;
341eval <<'EOE' or $_ = $@;
78f9721b 342 sub lv1tmpr : lvalue { yyy } # is it read-only?
cd06dffe 343 lv1tmpr = (2,3);
344 1;
345EOE
346
347print "# '$_'.\nnot "
78f9721b 348 unless /Can\'t modify constant item in lvalue subroutine return/;
cd06dffe 349print "ok 39\n";
350
351$_ = undef;
352eval <<'EOE' or $_ = $@;
353 (lv1tmpr) = (2,3);
354 1;
355EOE
356
357print "# '$_'.\nnot "
358 unless /Can\'t return a readonly value from lvalue subroutine/;
359print "ok 40\n";
360
a98df962 361sub lva : lvalue {@a}
cd06dffe 362
363$_ = undef;
364@a = ();
365$a[1] = 12;
366eval <<'EOE' or $_ = $@;
367 (lva) = (2,3);
368 1;
369EOE
370
78f9721b 371print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
cd06dffe 372print "ok 41\n";
373
374$_ = undef;
375@a = ();
376$a[0] = undef;
377$a[1] = 12;
378eval <<'EOE' or $_ = $@;
379 (lva) = (2,3);
380 1;
381EOE
382
383print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
384print "ok 42\n";
385
386$_ = undef;
387@a = ();
388$a[0] = undef;
389$a[1] = 12;
390eval <<'EOE' or $_ = $@;
391 (lva) = (2,3);
392 1;
393EOE
394
395print "# '$_'.\nnot " unless "'@a' $_" eq "'2 3' ";
396print "ok 43\n";
397
a98df962 398sub lv1n : lvalue { $newvar }
cd06dffe 399
400$_ = undef;
401eval <<'EOE' or $_ = $@;
402 lv1n = (3,4);
403 1;
404EOE
405
406print "# '$_', '$newvar'.\nnot " unless "'$newvar' $_" eq "'4' ";
407print "ok 44\n";
408
a98df962 409sub lv1nn : lvalue { $nnewvar }
cd06dffe 410
411$_ = undef;
412eval <<'EOE' or $_ = $@;
413 (lv1nn) = (3,4);
414 1;
415EOE
416
417print "# '$_'.\nnot " unless "'$nnewvar' $_" eq "'3' ";
418print "ok 45\n";
419
420$a = \&lv1nn;
421$a->() = 8;
422print "# '$nnewvar'.\nnot " unless $nnewvar eq '8';
423print "ok 46\n";
d32f2495 424
425# This must happen at run time
426eval {
427 sub AUTOLOAD : lvalue { $newvar };
428};
429foobar() = 12;
430print "# '$newvar'.\nnot " unless $newvar eq "12";
431print "ok 47\n";
432
26191e78 433# Testing DWIM of foo = bar;
434sub foo : lvalue {
435 $a;
436}
437$a = "not ok 48\n";
438foo = "ok 48\n";
439print $a;
440
441open bar, ">nothing" or die $!;
442bar = *STDOUT;
443print bar "ok 49\n";
444unlink "nothing";
445
78f9721b 446{
447my %hash; my @array;
448sub alv : lvalue { $array[1] }
449sub alv2 : lvalue { $array[$_[0]] }
450sub hlv : lvalue { $hash{"foo"} }
451sub hlv2 : lvalue { $hash{$_[0]} }
452$array[1] = "not ok 51\n";
453alv() = "ok 50\n";
454print alv();
455
456alv2(20) = "ok 51\n";
457print $array[20];
458
459$hash{"foo"} = "not ok 52\n";
460hlv() = "ok 52\n";
461print $hash{foo};
462
463$hash{bar} = "not ok 53\n";
464hlv("bar") = "ok 53\n";
465print hlv("bar");
466
467sub array : lvalue { @array }
468sub array2 : lvalue { @array2 } # This is a global.
469sub hash : lvalue { %hash }
470sub hash2 : lvalue { %hash2 } # So's this.
471@array2 = qw(foo bar);
472%hash2 = qw(foo bar);
473
474(array()) = qw(ok 54);
475print "not " unless "@array" eq "ok 54";
476print "ok 54\n";
477
478(array2()) = qw(ok 55);
479print "not " unless "@array2" eq "ok 55";
480print "ok 55\n";
481
482(hash()) = qw(ok 56);
483print "not " unless $hash{ok} == 56;
484print "ok 56\n";
485
486(hash2()) = qw(ok 57);
487print "not " unless $hash2{ok} == 57;
488print "ok 57\n";
489
490@array = qw(a b c d);
491sub aslice1 : lvalue { @array[0,2] };
492(aslice1()) = ("ok", "already");
493print "# @array\nnot " unless "@array" eq "ok b already d";
494print "ok 58\n";
495
496@array2 = qw(a B c d);
497sub aslice2 : lvalue { @array2[0,2] };
498(aslice2()) = ("ok", "already");
499print "not " unless "@array2" eq "ok B already d";
500print "ok 59\n";
501
502%hash = qw(a Alpha b Beta c Gamma);
503sub hslice : lvalue { @hash{"c", "b"} }
504(hslice()) = ("CISC", "BogoMIPS");
505print "not " unless join("/",@hash{"c","a","b"}) eq "CISC/Alpha/BogoMIPS";
506print "ok 60\n";
507}
508
509$str = "Hello, world!";
510sub sstr : lvalue { substr($str, 1, 4) }
511sstr() = "i";
512print "not " unless $str eq "Hi, world!";
513print "ok 61\n";
514
515$str = "Made w/ JavaScript";
516sub veclv : lvalue { vec($str, 2, 32) }
517veclv() = 0x5065726C;
518print "# $str\nnot " unless $str eq "Made w/ PerlScript";
519print "ok 62\n";
520
521sub position : lvalue { pos }
522@p = ();
523$_ = "fee fi fo fum";
524while (/f/g) {
525 push @p, position;
526 position() += 6;
527}
528print "# @p\nnot " unless "@p" eq "1 8";
529print "ok 63\n";