summaryrefslogtreecommitdiff
path: root/compiler/GHC/Core/DataCon.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Core/DataCon.hs')
-rw-r--r--compiler/GHC/Core/DataCon.hs16
1 files changed, 10 insertions, 6 deletions
diff --git a/compiler/GHC/Core/DataCon.hs b/compiler/GHC/Core/DataCon.hs
index 2846fa7b33..043cb82574 100644
--- a/compiler/GHC/Core/DataCon.hs
+++ b/compiler/GHC/Core/DataCon.hs
@@ -1542,14 +1542,18 @@ dataConWrapperType (MkData { dcUserTyVarBinders = user_tvbs,
res_ty
dataConNonlinearType :: DataCon -> Type
+-- Just like dataConWrapperType, but with the
+-- linearity on the arguments all zapped to Many
dataConNonlinearType (MkData { dcUserTyVarBinders = user_tvbs,
dcOtherTheta = theta, dcOrigArgTys = arg_tys,
- dcOrigResTy = res_ty })
- = let arg_tys' = map (\(Scaled w t) -> Scaled (case w of OneTy -> ManyTy; _ -> w) t) arg_tys
- in mkInvisForAllTys user_tvbs $
- mkInvisFunTys theta $
- mkScaledFunTys arg_tys' $
- res_ty
+ dcOrigResTy = res_ty,
+ dcStupidTheta = stupid_theta })
+ = mkInvisForAllTys user_tvbs $
+ mkInvisFunTys (stupid_theta ++ theta) $
+ mkScaledFunTys arg_tys' $
+ res_ty
+ where
+ arg_tys' = map (\(Scaled w t) -> Scaled (case w of OneTy -> ManyTy; _ -> w) t) arg_tys
dataConDisplayType :: Bool -> DataCon -> Type
dataConDisplayType show_linear_types dc