diff options
author | Ryan Scott <ryan.gl.scott@gmail.com> | 2020-04-05 12:10:10 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-04-08 16:43:44 -0400 |
commit | 7802fa17a9a1a0f02fbf95170c13d7a9711a681e (patch) | |
tree | 6d43a4767833369ac59b1de7cf2841d074aea78a | |
parent | 04b6cf947ea065a210a216cc91f918cc1660d430 (diff) | |
download | haskell-7802fa17a9a1a0f02fbf95170c13d7a9711a681e.tar.gz |
Handle promoted data constructors in typeToLHsType correctly
Instead of using `nlHsTyVar`, which hardcodes `NotPromoted`, have
`typeToLHsType` pick between `Promoted` and `NotPromoted` by checking
if a type constructor is promoted using `isPromotedDataCon`.
Fixes #18020.
-rw-r--r-- | compiler/GHC/Hs/Utils.hs | 7 | ||||
-rw-r--r-- | testsuite/tests/deriving/should_compile/T14578.stderr | 30 | ||||
-rw-r--r-- | testsuite/tests/deriving/should_compile/T14579.stderr | 12 | ||||
-rw-r--r-- | testsuite/tests/deriving/should_fail/T15073.stderr | 2 |
4 files changed, 28 insertions, 23 deletions
diff --git a/compiler/GHC/Hs/Utils.hs b/compiler/GHC/Hs/Utils.hs index 99a5de9365..75d9219cbf 100644 --- a/compiler/GHC/Hs/Utils.hs +++ b/compiler/GHC/Hs/Utils.hs @@ -113,6 +113,7 @@ import GHC.Tc.Types.Evidence import GHC.Types.Name.Reader import GHC.Types.Var import GHC.Core.TyCo.Rep +import GHC.Core.TyCon import GHC.Core.Type ( appTyArgFlags, splitAppTys, tyConArgFlags, tyConAppNeedsKindSig ) import TysWiredIn ( unitTy ) import GHC.Tc.Utils.TcType @@ -686,7 +687,11 @@ typeToLHsType ty | otherwise = ty' where ty' :: LHsType GhcPs - ty' = go_app (nlHsTyVar (getRdrName tc)) args (tyConArgFlags tc args) + ty' = go_app (noLoc $ HsTyVar noExtField prom $ noLoc $ getRdrName tc) + args (tyConArgFlags tc args) + + prom :: PromotionFlag + prom = if isPromotedDataCon tc then IsPromoted else NotPromoted go ty@(AppTy {}) = go_app (go head) args (appTyArgFlags head args) where head :: Type diff --git a/testsuite/tests/deriving/should_compile/T14578.stderr b/testsuite/tests/deriving/should_compile/T14578.stderr index 25480b836c..58376989db 100644 --- a/testsuite/tests/deriving/should_compile/T14578.stderr +++ b/testsuite/tests/deriving/should_compile/T14578.stderr @@ -9,7 +9,7 @@ Derived class instances: GHC.Base.sconcat :: GHC.Base.NonEmpty (T14578.Wat f g a) -> T14578.Wat f g a GHC.Base.stimes :: - forall (b :: TYPE GHC.Types.LiftedRep). + forall (b :: TYPE 'GHC.Types.LiftedRep). GHC.Real.Integral b => b -> T14578.Wat f g a -> T14578.Wat f g a (GHC.Base.<>) = GHC.Prim.coerce @@ -37,12 +37,12 @@ Derived class instances: instance GHC.Base.Functor f => GHC.Base.Functor (T14578.App f) where GHC.Base.fmap :: - forall (a :: TYPE GHC.Types.LiftedRep) - (b :: TYPE GHC.Types.LiftedRep). + forall (a :: TYPE 'GHC.Types.LiftedRep) + (b :: TYPE 'GHC.Types.LiftedRep). (a -> b) -> T14578.App f a -> T14578.App f b (GHC.Base.<$) :: - forall (a :: TYPE GHC.Types.LiftedRep) - (b :: TYPE GHC.Types.LiftedRep). + forall (a :: TYPE 'GHC.Types.LiftedRep) + (b :: TYPE 'GHC.Types.LiftedRep). a -> T14578.App f b -> T14578.App f a GHC.Base.fmap = GHC.Prim.coerce @@ -56,23 +56,23 @@ Derived class instances: instance GHC.Base.Applicative f => GHC.Base.Applicative (T14578.App f) where GHC.Base.pure :: - forall (a :: TYPE GHC.Types.LiftedRep). a -> T14578.App f a + forall (a :: TYPE 'GHC.Types.LiftedRep). a -> T14578.App f a (GHC.Base.<*>) :: - forall (a :: TYPE GHC.Types.LiftedRep) - (b :: TYPE GHC.Types.LiftedRep). + forall (a :: TYPE 'GHC.Types.LiftedRep) + (b :: TYPE 'GHC.Types.LiftedRep). T14578.App f (a -> b) -> T14578.App f a -> T14578.App f b GHC.Base.liftA2 :: - forall (a :: TYPE GHC.Types.LiftedRep) - (b :: TYPE GHC.Types.LiftedRep) - (c :: TYPE GHC.Types.LiftedRep). + forall (a :: TYPE 'GHC.Types.LiftedRep) + (b :: TYPE 'GHC.Types.LiftedRep) + (c :: TYPE 'GHC.Types.LiftedRep). (a -> b -> c) -> T14578.App f a -> T14578.App f b -> T14578.App f c (GHC.Base.*>) :: - forall (a :: TYPE GHC.Types.LiftedRep) - (b :: TYPE GHC.Types.LiftedRep). + forall (a :: TYPE 'GHC.Types.LiftedRep) + (b :: TYPE 'GHC.Types.LiftedRep). T14578.App f a -> T14578.App f b -> T14578.App f b (GHC.Base.<*) :: - forall (a :: TYPE GHC.Types.LiftedRep) - (b :: TYPE GHC.Types.LiftedRep). + forall (a :: TYPE 'GHC.Types.LiftedRep) + (b :: TYPE 'GHC.Types.LiftedRep). T14578.App f a -> T14578.App f b -> T14578.App f a GHC.Base.pure = GHC.Prim.coerce diff --git a/testsuite/tests/deriving/should_compile/T14579.stderr b/testsuite/tests/deriving/should_compile/T14579.stderr index 18e64f7bb6..81212022ef 100644 --- a/testsuite/tests/deriving/should_compile/T14579.stderr +++ b/testsuite/tests/deriving/should_compile/T14579.stderr @@ -8,16 +8,16 @@ Derived class instances: T14579.Glurp a -> T14579.Glurp a -> GHC.Types.Bool (GHC.Classes.==) = GHC.Prim.coerce - @(T14579.Wat @a (Data.Proxy.Proxy @a) - -> T14579.Wat @a (Data.Proxy.Proxy @a) -> GHC.Types.Bool) + @(T14579.Wat @a ('Data.Proxy.Proxy @a) + -> T14579.Wat @a ('Data.Proxy.Proxy @a) -> GHC.Types.Bool) @(T14579.Glurp a -> T14579.Glurp a -> GHC.Types.Bool) - ((GHC.Classes.==) @(T14579.Wat @a (Data.Proxy.Proxy @a))) + ((GHC.Classes.==) @(T14579.Wat @a ('Data.Proxy.Proxy @a))) (GHC.Classes./=) = GHC.Prim.coerce - @(T14579.Wat @a (Data.Proxy.Proxy @a) - -> T14579.Wat @a (Data.Proxy.Proxy @a) -> GHC.Types.Bool) + @(T14579.Wat @a ('Data.Proxy.Proxy @a) + -> T14579.Wat @a ('Data.Proxy.Proxy @a) -> GHC.Types.Bool) @(T14579.Glurp a -> T14579.Glurp a -> GHC.Types.Bool) - ((GHC.Classes./=) @(T14579.Wat @a (Data.Proxy.Proxy @a))) + ((GHC.Classes./=) @(T14579.Wat @a ('Data.Proxy.Proxy @a))) instance forall a (x :: Data.Proxy.Proxy a). GHC.Classes.Eq a => diff --git a/testsuite/tests/deriving/should_fail/T15073.stderr b/testsuite/tests/deriving/should_fail/T15073.stderr index d27ff4d216..5c1d99768f 100644 --- a/testsuite/tests/deriving/should_fail/T15073.stderr +++ b/testsuite/tests/deriving/should_fail/T15073.stderr @@ -3,7 +3,7 @@ T15073.hs:8:12: error: • Illegal unboxed tuple type as function argument: (# Foo a #) Perhaps you intended to use UnboxedTuples • In the type signature: - p :: Foo a -> Unit# @GHC.Types.LiftedRep (Foo a) + p :: Foo a -> Unit# @'GHC.Types.LiftedRep (Foo a) When typechecking the code for ‘p’ in a derived instance for ‘P (Foo a)’: To see the code I am typechecking, use -ddump-deriv |