summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabriel Kerneis2014-01-14 18:17:18 +0100
committerGabriel Kerneis2014-01-14 18:57:47 +0100
commit048256944331ed646225e856fca56728a074f3a6 (patch)
treeb04a297de796a1a19061cf4ec213e43cac199856 /src
parent3a2d580deda67a57c3bf29f5fbd350e366c8562b (diff)
Fix vector concat pattern matching
The concatenation list was reversed.
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp.lem4
-rw-r--r--src/test/pattern.sail2
-rw-r--r--src/test/vectors.sail12
3 files changed, 9 insertions, 9 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem
index 8b801bee..39793bb5 100644
--- a/src/lem_interp/interp.lem
+++ b/src/lem_interp/interp.lem
@@ -406,8 +406,8 @@ let rec match_pattern p value =
match value with
| V_vector n inc vals ->
let (matched_p,bounds,remaining_vals) =
- List.foldr
- (fun pat (matched_p,bounds,r_vals) ->
+ List.foldl
+ (fun (matched_p,bounds,r_vals) pat ->
match pat with
| P_vector pats -> vec_concat_match pats r_vals
| P_id id -> (false,[],[]) (*Need to have at least a guess of how many to consume*)
diff --git a/src/test/pattern.sail b/src/test/pattern.sail
index 22f0bcc4..e8fc1705 100644
--- a/src/test/pattern.sail
+++ b/src/test/pattern.sail
@@ -14,7 +14,7 @@ function unit main _ = {
case x -> { x := 99; x }
});
- (* doesn't work - main returns 1 instead of 42 *)
+ (* doesn't work - main returns 1 instead of 99 *)
n := 3;
switch n {
case 0 -> { 21 }
diff --git a/src/test/vectors.sail b/src/test/vectors.sail
index f51b5d93..f6e0c532 100644
--- a/src/test/vectors.sail
+++ b/src/test/vectors.sail
@@ -21,17 +21,17 @@ function unit main _ = {
case _ -> match_success := i
};
- (* XXX function clause match fail *)
- (* parameter is wrapped in a 1-tuple upon call, but probably not
- unwrapped for the pattern-matching *)
decode(i);
(* concatenation *)
switch i {
- (* XXX match fails *)
case ([bitzero] : [bitzero, bitone] : [bitzero]) -> match_success := 1
- (* but this works *)
- case ([bitzero] : [bitzero] : [bitone] : [bitzero]) -> match_success := 2
+ case _ -> match_success := i
+ };
+ switch i {
+ (* check order of concatenation *)
+ case ([bitzero] : [bitone] : [bitzero] : [bitzero]) -> match_success := 99
+ case ([bitzero] : [bitzero] : [bitone] : [bitzero]) -> match_success := 1
case _ -> match_success := i
};