summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBrian Campbell2018-01-15 14:57:52 +0000
committerBrian Campbell2018-01-15 14:57:52 +0000
commitfb8e8ce65d5ea13b92ec731820ed6c7a9a89f6a0 (patch)
treea7f9f9454a24204ab2b2bf59253e47931463c994 /test
parent83538020553691efe472984ee16ebd04eb252f82 (diff)
Support non-trivial literal patterns
Previously we only did top-level literal pattern to guard conversion, this does it throughout any pattern
Diffstat (limited to 'test')
-rw-r--r--test/mono/set2.sail29
1 files changed, 29 insertions, 0 deletions
diff --git a/test/mono/set2.sail b/test/mono/set2.sail
new file mode 100644
index 00000000..3bb76870
--- /dev/null
+++ b/test/mono/set2.sail
@@ -0,0 +1,29 @@
+default Order dec
+
+(* A function which is merely parametrised by a size does not need to be
+ monomorphised *)
+
+val forall 'n, 'n in {32,64}. ([:'n:], bit[32]) -> bit[64] effect pure parametric
+
+function parametric(n,v) = {
+ let (bit['n]) x = exts(v) in
+ extz(x)
+}
+
+(* But if we do a calculation on the size then we'll need to case split *)
+
+val forall 'n, 'n in {16,32}. ([:'n:], bit[32]) -> bit[64] effect pure depends
+
+function depends(n,v) = {
+ let 'm = 2 * n in
+ let (bit['m]) x = exts(v) in
+ extz(x)
+}
+
+val unit -> bool effect pure run
+
+function run () =
+ parametric(32,0x80000000) == 0x0000000080000000 &
+ parametric(64,0x80000000) == 0xffffffff80000000 &
+ depends(16,0x80000000) == 0x0000000080000000 &
+ depends(32,0x80000000) == 0xffffffff80000000