diff options
| author | Gabriel Kerneis | 2014-01-14 18:17:18 +0100 |
|---|---|---|
| committer | Gabriel Kerneis | 2014-01-14 18:57:47 +0100 |
| commit | 048256944331ed646225e856fca56728a074f3a6 (patch) | |
| tree | b04a297de796a1a19061cf4ec213e43cac199856 /src | |
| parent | 3a2d580deda67a57c3bf29f5fbd350e366c8562b (diff) | |
Fix vector concat pattern matching
The concatenation list was reversed.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lem_interp/interp.lem | 4 | ||||
| -rw-r--r-- | src/test/pattern.sail | 2 | ||||
| -rw-r--r-- | src/test/vectors.sail | 12 |
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 }; |
