1 | #!./perl |
---|
2 | |
---|
3 | # |
---|
4 | # Verify which OP= operators warn if their targets are undefined. |
---|
5 | # Based on redef.t, contributed by Graham Barr <Graham.Barr@tiuk.ti.com> |
---|
6 | # -- Robin Barker <rmb@cise.npl.co.uk> |
---|
7 | # |
---|
8 | |
---|
9 | BEGIN { |
---|
10 | chdir 't' if -d 't'; |
---|
11 | @INC = '../lib'; |
---|
12 | require './test.pl'; |
---|
13 | } |
---|
14 | |
---|
15 | use strict; |
---|
16 | use warnings; |
---|
17 | |
---|
18 | my $warn = ""; |
---|
19 | $SIG{q(__WARN__)} = sub { print $warn; $warn .= join("",@_) }; |
---|
20 | |
---|
21 | sub uninitialized { $warn =~ s/Use of uninitialized value[^\n]+\n//s; } |
---|
22 | sub tiex { tie $_[0], 'main' } |
---|
23 | sub TIESCALAR { my $x; bless \$x } |
---|
24 | sub FETCH { ${$_[0]} } |
---|
25 | sub STORE { ${$_[0]} = $_[1] } |
---|
26 | our $TODO; |
---|
27 | |
---|
28 | print "1..63\n"; |
---|
29 | |
---|
30 | # go through all tests once normally and once with tied $x |
---|
31 | for my $tie ("", ", tied") { |
---|
32 | |
---|
33 | { my $x; tiex $x if $tie; $x ++; ok ! uninitialized, "postinc$tie"; } |
---|
34 | { my $x; tiex $x if $tie; $x --; ok ! uninitialized, "postdec$tie"; } |
---|
35 | { my $x; tiex $x if $tie; ++ $x; ok ! uninitialized, "preinc$tie"; } |
---|
36 | { my $x; tiex $x if $tie; -- $x; ok ! uninitialized, "predec$tie"; } |
---|
37 | |
---|
38 | { my $x; tiex $x if $tie; $x **= 1; ok uninitialized, "**=$tie"; } |
---|
39 | |
---|
40 | { local $TODO = $tie && '[perl #17809] pp_add & pp_subtract'; |
---|
41 | { my $x; tiex $x if $tie; $x += 1; ok ! uninitialized, "+=$tie"; } |
---|
42 | { my $x; tiex $x if $tie; $x -= 1; ok ! uninitialized, "-=$tie"; } |
---|
43 | } |
---|
44 | |
---|
45 | { my $x; tiex $x if $tie; $x .= 1; ok ! uninitialized, ".=$tie"; } |
---|
46 | |
---|
47 | { my $x; tiex $x if $tie; $x *= 1; ok uninitialized, "*=$tie"; } |
---|
48 | { my $x; tiex $x if $tie; $x /= 1; ok uninitialized, "/=$tie"; } |
---|
49 | { my $x; tiex $x if $tie; $x %= 1; ok uninitialized, "\%=$tie"; } |
---|
50 | |
---|
51 | { my $x; tiex $x if $tie; $x x= 1; ok uninitialized, "x=$tie"; } |
---|
52 | |
---|
53 | { my $x; tiex $x if $tie; $x &= 1; ok uninitialized, "&=$tie"; } |
---|
54 | |
---|
55 | { local $TODO = $tie && '[perl #17809] pp_bit_or & pp_bit_xor'; |
---|
56 | { my $x; tiex $x if $tie; $x |= 1; ok ! uninitialized, "|=$tie"; } |
---|
57 | { my $x; tiex $x if $tie; $x ^= 1; ok ! uninitialized, "^=$tie"; } |
---|
58 | } |
---|
59 | |
---|
60 | { my $x; tiex $x if $tie; $x &&= 1; ok ! uninitialized, "&&=$tie"; } |
---|
61 | { my $x; tiex $x if $tie; $x ||= 1; ok ! uninitialized, "||=$tie"; } |
---|
62 | |
---|
63 | { my $x; tiex $x if $tie; $x <<= 1; ok uninitialized, "<<=$tie"; } |
---|
64 | { my $x; tiex $x if $tie; $x >>= 1; ok uninitialized, ">>=$tie"; } |
---|
65 | |
---|
66 | { my $x; tiex $x if $tie; $x &= "x"; ok uninitialized, "&=$tie, string"; } |
---|
67 | |
---|
68 | { local $TODO = $tie && '[perl #17809] pp_bit_or & pp_bit_xor'; |
---|
69 | { my $x; tiex $x if $tie; $x |= "x"; ok ! uninitialized, "|=$tie, string"; } |
---|
70 | { my $x; tiex $x if $tie; $x ^= "x"; ok ! uninitialized, "^=$tie, string"; } |
---|
71 | } |
---|
72 | |
---|
73 | { use integer; |
---|
74 | |
---|
75 | { local $TODO = $tie && '[perl #17809] pp_i_add & pp_i_subtract'; |
---|
76 | { my $x; tiex $x if $tie; $x += 1; ok ! uninitialized, "+=$tie, int"; } |
---|
77 | { my $x; tiex $x if $tie; $x -= 1; ok ! uninitialized, "-=$tie, int"; } |
---|
78 | } |
---|
79 | |
---|
80 | { my $x; tiex $x if $tie; $x *= 1; ok uninitialized, "*=$tie, int"; } |
---|
81 | { my $x; tiex $x if $tie; $x /= 1; ok uninitialized, "/=$tie, int"; } |
---|
82 | { my $x; tiex $x if $tie; $x %= 1; ok uninitialized, "\%=$tie, int"; } |
---|
83 | |
---|
84 | { my $x; tiex $x if $tie; $x ++; ok ! uninitialized, "postinc$tie, int"; } |
---|
85 | { my $x; tiex $x if $tie; $x --; ok ! uninitialized, "postdec$tie, int"; } |
---|
86 | { my $x; tiex $x if $tie; ++ $x; ok ! uninitialized, "preinc$tie, int"; } |
---|
87 | { my $x; tiex $x if $tie; -- $x; ok ! uninitialized, "predec$tie, int"; } |
---|
88 | |
---|
89 | } # end of use integer; |
---|
90 | |
---|
91 | } # end of for $tie |
---|
92 | |
---|
93 | is $warn, '', "no spurious warnings"; |
---|