diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2018-06-11 13:55:56 +0100 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2018-06-11 16:29:11 +0100 |
commit | a169149ce80de3676adb3ece43d5164b6a875b9c (patch) | |
tree | dffd1b66718bf95917ffeb925d517a815113b968 /testsuite/tests/quantified-constraints | |
parent | 25597a97174990b49b4005497473b417888a7a64 (diff) | |
download | haskell-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.hs | 69 | ||||
-rw-r--r-- | testsuite/tests/quantified-constraints/all.T | 1 |
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, ['']) |