Commit edec6a6c authored by Ryan Scott's avatar Ryan Scott Committed by Marge Bot
Browse files

Make isTauTy detect higher-rank contexts

Previously, `isTauTy` would only detect higher-rank `forall`s, not
higher-rank contexts, which led to some minor bugs observed
in #18127. Easily fixed by adding a case for
`(FunTy InvisArg _ _)`.

Fixes #18127.
parent 9f3e6884
Pipeline #19000 passed with stages
in 770 minutes and 56 seconds
......@@ -1857,17 +1857,19 @@ fun_kind_arg_flags = go emptyTCvSubst
-- something is ill-kinded. But this can happen
-- when printing errors. Assume everything is Required.
-- @isTauTy@ tests if a type has no foralls
-- @isTauTy@ tests if a type has no foralls or (=>)
isTauTy :: Type -> Bool
isTauTy ty | Just ty' <- coreView ty = isTauTy ty'
isTauTy (TyVarTy _) = True
isTauTy (LitTy {}) = True
isTauTy (TyConApp tc tys) = all isTauTy tys && isTauTyCon tc
isTauTy (AppTy a b) = isTauTy a && isTauTy b
isTauTy (FunTy _ a b) = isTauTy a && isTauTy b
isTauTy (ForAllTy {}) = False
isTauTy (CastTy ty _) = isTauTy ty
isTauTy (CoercionTy _) = False -- Not sure about this
isTauTy (TyVarTy _) = True
isTauTy (LitTy {}) = True
isTauTy (TyConApp tc tys) = all isTauTy tys && isTauTyCon tc
isTauTy (AppTy a b) = isTauTy a && isTauTy b
isTauTy (FunTy af a b) = case af of
InvisArg -> False -- e.g., Eq a => b
VisArg -> isTauTy a && isTauTy b -- e.g., a -> b
isTauTy (ForAllTy {}) = False
isTauTy (CastTy ty _) = isTauTy ty
isTauTy (CoercionTy _) = False -- Not sure about this
{-
%************************************************************************
......
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RankNTypes #-}
module T18127b where
import GHC.Generics
data T1 = MkT1 (forall a. a) deriving (Eq, Generic)
data T2 a = MkT2 (Show a => a) deriving (Eq, Generic)
T18127b.hs:7:40: error:
• Can't make a derived instance of ‘Eq T1’:
Constructor ‘MkT1’ has a higher-rank type
Possible fix: use a standalone deriving declaration instead
• In the data declaration for ‘T1’
T18127b.hs:7:44: error:
• Can't make a derived instance of ‘Generic T1’:
MkT1 must not have exotic unlifted or polymorphic arguments
• In the data declaration for ‘T1’
T18127b.hs:8:42: error:
• Can't make a derived instance of ‘Eq (T2 a)’:
Constructor ‘MkT2’ has a higher-rank type
Possible fix: use a standalone deriving declaration instead
• In the data declaration for ‘T2’
T18127b.hs:8:46: error:
• Can't make a derived instance of ‘Generic (T2 a)’:
MkT2 must not have exotic unlifted or polymorphic arguments
• In the data declaration for ‘T2’
......@@ -76,6 +76,7 @@ test('T15073', [extra_files(['T15073a.hs'])], multimod_compile_fail,
['T15073', '-v0'])
test('T16181', normal, compile_fail, [''])
test('T16923', normal, compile_fail, [''])
test('T18127b', normal, compile_fail, [''])
test('deriving-via-fail', normal, compile_fail, [''])
test('deriving-via-fail2', normal, compile_fail, [''])
test('deriving-via-fail3', normal, compile_fail, [''])
......
{-# LANGUAGE RankNTypes #-}
module T18127a where
a :: (forall a. a) -> ()
a = undefined
b :: (Show a => a) -> ()
b = undefined
type C = forall a. a
c :: C -> ()
c = undefined
type D a = Show a => a
d :: D a -> ()
d = undefined
T18127a.hs:5:5: error:
• Cannot instantiate unification variable ‘a1’
with a type involving polytypes: (forall a. a) -> ()
GHC doesn't yet support impredicative polymorphism
• In the expression: undefined
In an equation for ‘a’: a = undefined
T18127a.hs:8:5: error:
• Cannot instantiate unification variable ‘a3’
with a type involving polytypes: (Show a => a) -> ()
GHC doesn't yet support impredicative polymorphism
• In the expression: undefined
In an equation for ‘b’: b = undefined
• Relevant bindings include
b :: (Show a => a) -> () (bound at T18127a.hs:8:1)
T18127a.hs:12:5: error:
• Cannot instantiate unification variable ‘a0’
with a type involving polytypes: C -> ()
GHC doesn't yet support impredicative polymorphism
• In the expression: undefined
In an equation for ‘c’: c = undefined
T18127a.hs:16:5: error:
• Cannot instantiate unification variable ‘a2’
with a type involving polytypes: D a -> ()
GHC doesn't yet support impredicative polymorphism
• In the expression: undefined
In an equation for ‘d’: d = undefined
• Relevant bindings include
d :: D a -> () (bound at T18127a.hs:16:1)
......@@ -563,3 +563,4 @@ test('T17021', normal, compile_fail, [''])
test('T17021b', normal, compile_fail, [''])
test('T17955', normal, compile_fail, [''])
test('T17173', normal, compile_fail, [''])
test('T18127a', normal, compile_fail, [''])
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment