summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--op.c12
-rw-r--r--t/op/smartmatch.t26
2 files changed, 37 insertions, 1 deletions
diff --git a/op.c b/op.c
index 5ca1823d44..f49ce82c5f 100644
--- a/op.c
+++ b/op.c
@@ -5542,6 +5542,18 @@ S_ref_array_or_hash(pTHX_ OP *cond)
return newUNOP(OP_REFGEN,
0, mod(cond, OP_REFGEN));
+ else if(cond
+ && (cond->op_type == OP_ASLICE
+ || cond->op_type == OP_HSLICE)) {
+
+ /* anonlist now needs a list from this op, was previously used in
+ * scalar context */
+ cond->op_flags |= ~(OPf_WANT_SCALAR | OPf_REF);
+ cond->op_flags |= OPf_WANT_LIST;
+
+ return newANONLIST(mod(cond, OP_ANONLIST));
+ }
+
else
return cond;
}
diff --git a/t/op/smartmatch.t b/t/op/smartmatch.t
index f8a073be56..f14e91ca94 100644
--- a/t/op/smartmatch.t
+++ b/t/op/smartmatch.t
@@ -73,7 +73,7 @@ my %keyandmore = map { $_ => 0 } @keyandmore;
my %fooormore = map { $_ => 0 } @fooormore;
# Load and run the tests
-plan tests => 335;
+plan tests => 351;
while (<DATA>) {
SKIP: {
@@ -484,6 +484,30 @@ __DATA__
@nums { 1, '', 12, '' }
! @nums { 11, '', 12, '' }
+# array slices
+ @nums[0..-1] []
+ @nums[0..0] [1]
+! @nums[0..1] [0..2]
+ @nums[0..4] [1..5]
+
+! undef @nums[0..-1]
+ 1 @nums[0..0]
+ 2 @nums[0..1]
+! @nums[0..1] 2
+
+ @nums[0..1] @nums[0..1]
+
+# hash slices
+ @keyandmore{qw(not)} [undef]
+ @keyandmore{qw(key)} [0]
+
+ undef @keyandmore{qw(not)}
+ 0 @keyandmore{qw(key and more)}
+! 2 @keyandmore{qw(key and)}
+
+ @fooormore{qw(foo)} @keyandmore{qw(key)}
+ @fooormore{qw(foo or more)} @keyandmore{qw(key and more)}
+
# UNDEF
! 3 undef
! 1 undef