Note [Eagerly expand given superclasses]
In step (1) of Note [The superclass story], why do we eagerly expand Given superclasses by one layer? (By "one layer" we mean expand transitively until you meet the same class again -- the conservative criterion embodied in expandSuperClasses. So a "layer" might be a whole stack of superclasses.) We do this eagerly for Givens mainly because of some very obscure cases like this: instance Bad a => Eq (T a) f :: (Ord (T a)) => blah f x = ....needs Eq (T a), Ord (T a).... Here if we can't satisfy (Eq (T a)) from the givens we'll use the instance declaration; but then we are stuck with (Bad a). Sigh. This is really a case of non-confluent proofs, but to stop our users complaining we expand one layer in advance. See Note [Instance and Given overlap]. We also want to do this if we have f :: F (T a) => blah where type instance F (T a) = Ord (T a) So we may need to do a little work on the givens to expose the class that has the superclasses. That's why the superclass expansion for Givens happens in canDictCt. This same scenario happens with quantified constraints, whose superclasses are also eagerly expanded. Test case: typecheck/should_compile/T16502b These are handled in canForAllNC, analogously to canDictCt.
References 2
- Instance and Given overlap GHC.Tc.Solver.Dict
- The superclass story GHC.Tc.Solver.Dict
Referenced by 5
- The superclass story GHC.Tc.Solver.Dict ×2
- GHC.Tc.Solver.Dict call site
- GHC.Tc.Solver.Solve call site
- Expanding Recursive Superclasses and ExpansionFuel GHC.Tc.Solver.Solve