summaryrefslogtreecommitdiff
path: root/testsuite/tests/quantified-constraints
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2018-06-11 13:55:56 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2018-06-11 16:29:11 +0100
commita169149ce80de3676adb3ece43d5164b6a875b9c (patch)
treedffd1b66718bf95917ffeb925d517a815113b968 /testsuite/tests/quantified-constraints
parent25597a97174990b49b4005497473b417888a7a64 (diff)
downloadhaskell-a169149ce80de3676adb3ece43d5164b6a875b9c.tar.gz
Remove duplicate quantified constraints
This is an easy fix for Trac #15244: just avoid adding the same quantified Given constraint to the inert set twice. See TcSMonad Note [Do not add duplicate quantified instances].
Diffstat (limited to 'testsuite/tests/quantified-constraints')
-rw-r--r--testsuite/tests/quantified-constraints/T15244.hs69
-rw-r--r--testsuite/tests/quantified-constraints/all.T1
2 files changed, 70 insertions, 0 deletions
diff --git a/testsuite/tests/quantified-constraints/T15244.hs b/testsuite/tests/quantified-constraints/T15244.hs
new file mode 100644
index 0000000000..16d2b65d53
--- /dev/null
+++ b/testsuite/tests/quantified-constraints/T15244.hs
@@ -0,0 +1,69 @@
+{-# LANGUAGE QuantifiedConstraints, TypeFamilies #-}
+
+module T15244 where
+class (forall t . Eq (c t)) => Blah c
+
+-- Unquantified works
+foo :: (Eq (a t), Eq (b t), a ~ b) => a t -> b t -> Bool
+foo a b = a == b
+-- Works
+
+-- Two quantified instances fail with double ambiguity check errors
+bar :: (forall t . Eq (a t), forall t . Eq (b t), a ~ b) => a t -> b t -> Bool
+bar a b = a == b
+-- Minimal.hs:11:8: error:
+-- • Could not deduce (Eq (b t1))
+-- from the context: (forall t1. Eq (a t1), forall t1. Eq (b t1),
+-- a ~ b)
+-- bound by the type signature for:
+-- bar :: forall (a :: * -> *) (b :: * -> *) t.
+-- (forall t1. Eq (a t1), forall t1. Eq (b t1), a ~ b) =>
+-- a t -> b t -> Bool
+-- at Minimal.hs:11:8-78
+-- • In the ambiguity check for ‘bar’
+-- To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
+-- In the type signature:
+-- bar :: (forall t. Eq (a t), forall t. Eq (b t), a ~ b) =>
+-- a t -> b t -> Bool
+-- |
+-- 11 | bar :: (forall t . Eq (a t), forall t . Eq (b t), a ~ b) => a t -> b t -> Bool
+-- |
+-- [And then another copy of the same error]
+
+-- Two copies from superclass instances fail
+baz :: (Blah a, Blah b, a ~ b) => a t -> b t -> Bool
+baz a b = a == b
+-- Minimal.hs:34:11: error:
+-- • Could not deduce (Eq (b t)) arising from a use of ‘==’
+-- from the context: (Blah a, Blah b, a ~ b)
+-- bound by the type signature for:
+-- baz :: forall (a :: * -> *) (b :: * -> *) t.
+-- (Blah a, Blah b, a ~ b) =>
+-- a t -> b t -> Bool
+-- at Minimal.hs:33:1-52
+-- • In the expression: a == b
+-- In an equation for ‘baz’: baz a b = a == b
+-- |
+-- 34 | baz a b = a == b
+-- |
+
+-- Two copies from superclass from same declaration also fail
+mugga :: (Blah a, Blah a) => a t -> a t -> Bool
+mugga a b = a == b
+-- • Could not deduce (Eq (a t)) arising from a use of ‘==’
+-- from the context: (Blah a, Blah a)
+-- bound by the type signature for:
+-- mugga :: forall (a :: * -> *) t.
+-- (Blah a, Blah a) =>
+-- a t -> a t -> Bool
+-- at Minimal.hs:50:1-47
+-- • In the expression: a == b
+-- In an equation for ‘mugga’: mugga a b = a == b
+-- |
+-- 51 | mugga a b = a == b
+-- |
+
+-- One copy works
+quux :: (Blah a, a ~ b) => a t -> b t -> Bool
+quux a b = a == b
+-- Works
diff --git a/testsuite/tests/quantified-constraints/all.T b/testsuite/tests/quantified-constraints/all.T
index 71f5b9159a..e546a7c495 100644
--- a/testsuite/tests/quantified-constraints/all.T
+++ b/testsuite/tests/quantified-constraints/all.T
@@ -8,3 +8,4 @@ test('T9123', normal, compile, [''])
test('T14863', normal, compile, [''])
test('T14961', normal, compile, [''])
test('T9123a', normal, compile, [''])
+test('T15244', normal, compile, [''])