Buggy validity checks for built-in classes
Built-in classes such as Generic and HasField do not appear to have validity checks applied properly. In particular, it is possible to give impredicative instances without using ImpredicativeTypes.
The following obvious nonsense is accepted (with warnings) by GHC 8.8.1. In GHC 8.6.5 and earlier it asks for FlexibleInstances, but then fails with Illegal polymorphic type: forall a. a, which is a reasonable (if terse) response. Ideally it should fail with such an error without even requesting FlexibleInstances.
{-# LANGUAGE ExplicitForAll #-}
module M1 where
import GHC.Generics
instance Generic (forall a . a)
Here's another example that should not be accepted:
{-# LANGUAGE RankNTypes, DataKinds #-}
module M2 where
import GHC.Records
data Foo = Foo { poly :: forall a. a -> a }
instance HasField "myPoly" Foo (forall a. a -> a) where
getField (Foo x) = x
From a brief look, I suspect this may be related to fd0f0334, which refactored checkValidInstHead and AFAICS dropped the relevant checks.
(Thanks to @phadej for spotting this in https://github.com/ghc-proposals/ghc-proposals/pull/282#issuecomment-541518676, although it is broader than just HasField.)