summaryrefslogtreecommitdiff
path: root/testsuite/tests/deSugar/should_compile/ds046.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/deSugar/should_compile/ds046.hs')
-rw-r--r--testsuite/tests/deSugar/should_compile/ds046.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/testsuite/tests/deSugar/should_compile/ds046.hs b/testsuite/tests/deSugar/should_compile/ds046.hs
new file mode 100644
index 0000000000..7096f2bdf0
--- /dev/null
+++ b/testsuite/tests/deSugar/should_compile/ds046.hs
@@ -0,0 +1,41 @@
+module ShouldCompile where
+
+-- Strict field unpacking tests: compile with -O -funbox-strict-fields.
+
+-- test 1: simple unboxed int field
+data T = T !Int
+t (T i) = i + 1
+
+-- test 2: mutual recursion (should back off from unboxing either field)
+data R = R !S
+data S = S !R
+
+r (R s) = s
+
+-- test 3: multi-level unboxing
+data A = A Int !B Int
+data B = B !Int
+
+f = A 1 (B 2) 1
+g (A x (B y) z) = A x (B (y+2)) z
+h (A x (B y) z) = y + 2
+
+-- test 4: flattening nested tuples
+data C = C !(Int,Int)
+j (C (a,b)) = a + b
+
+-- test 5: polymorphism, multiple strict fields
+data D a b = D Int !(a,b) !(E Int)
+data E a = E a
+k (D a (b,c) (E d)) = a + b + c + d
+
+-- test 6: records
+data F a b = F { x :: !Int, y :: !(Float,Float), z :: !(a,b) }
+l F{x = a} = a
+m (F a b c) = a
+n F{z = (a,b)} = a
+
+-- test 7: newtypes
+newtype G a b = G (F a b)
+data H a b = H !Int !(G a b) !Int
+o (H y (G (F{ x=x })) z) = x + z