This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #128204] Fix crash with @a &.= etc.
authorFather Chrysostomos <sprout@cpan.org>
Sat, 21 May 2016 04:55:40 +0000 (21:55 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 21 May 2016 05:17:34 +0000 (22:17 -0700)
The new bitwise operators in their assignment forms were not correctly
catching things like arrays on the lhs at compile time.

At run time, they would either crash or croak with ‘Can’t coerce
ARRAY...’.

This commit puts in the correct compile-time check, simply by flagging
these as scalar modifiers.

op.c
t/lib/croak/op

diff --git a/op.c b/op.c
index c921c15..619c6e3 100644 (file)
--- a/op.c
+++ b/op.c
@@ -3229,6 +3229,12 @@ S_scalar_mod_type(const OP *o, I32 type)
     case OP_BIT_AND:
     case OP_BIT_XOR:
     case OP_BIT_OR:
+    case OP_NBIT_AND:
+    case OP_NBIT_XOR:
+    case OP_NBIT_OR:
+    case OP_SBIT_AND:
+    case OP_SBIT_XOR:
+    case OP_SBIT_OR:
     case OP_CONCAT:
     case OP_SUBST:
     case OP_TRANS:
index 6e19ff8..a243a1f 100644 (file)
@@ -65,6 +65,54 @@ my main $f;
 EXPECT
 No such class field "c" in variable $f of type main at - line 3.
 ########
+# NAME Num-specific &= on @array
+use feature 'bitwise';
+@a &= 1;
+EXPECT
+The bitwise feature is experimental at - line 2.
+Can't modify array dereference in numeric bitwise and (&) at - line 2, near "1;"
+Execution of - aborted due to compilation errors.
+########
+# NAME Num-specific |= on @array
+use feature 'bitwise';
+@a |= 1;
+EXPECT
+The bitwise feature is experimental at - line 2.
+Can't modify array dereference in numeric bitwise or (|) at - line 2, near "1;"
+Execution of - aborted due to compilation errors.
+########
+# NAME Num-specific ^= on @array
+use feature 'bitwise';
+@a ^= 1;
+EXPECT
+The bitwise feature is experimental at - line 2.
+Can't modify array dereference in numeric bitwise xor (^) at - line 2, near "1;"
+Execution of - aborted due to compilation errors.
+########
+# NAME &.= on @array
+use feature 'bitwise';
+@a &.= 1;
+EXPECT
+The bitwise feature is experimental at - line 2.
+Can't modify array dereference in string bitwise and (&.) at - line 2, near "1;"
+Execution of - aborted due to compilation errors.
+########
+# NAME |.= on @array
+use feature 'bitwise';
+@a |.= 1;
+EXPECT
+The bitwise feature is experimental at - line 2.
+Can't modify array dereference in string bitwise or (|.) at - line 2, near "1;"
+Execution of - aborted due to compilation errors.
+########
+# NAME ^.= on @array
+use feature 'bitwise';
+@a ^.= 1;
+EXPECT
+The bitwise feature is experimental at - line 2.
+Can't modify array dereference in string bitwise xor (^.) at - line 2, near "1;"
+Execution of - aborted due to compilation errors.
+########
 # NAME Can't declare conditional
 my($a?$b:$c)
 EXPECT