diff options
-rw-r--r-- | compiler/backpack/RnModIface.hs | 2 | ||||
-rw-r--r-- | compiler/iface/IfaceSyn.hs | 19 | ||||
-rw-r--r-- | compiler/iface/MkIface.hs | 2 | ||||
-rw-r--r-- | compiler/iface/TcIface.hs | 4 | ||||
-rw-r--r-- | compiler/typecheck/TcCanonical.hs | 4 | ||||
-rw-r--r-- | compiler/typecheck/TcRnDriver.hs | 7 | ||||
-rw-r--r-- | compiler/typecheck/TcTyClsDecls.hs | 9 | ||||
-rw-r--r-- | compiler/types/TyCon.hs | 129 | ||||
-rw-r--r-- | testsuite/tests/backpack/should_fail/bkpfail10.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/backpack/should_fail/bkpfail23.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/backpack/should_fail/bkpfail25.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/backpack/should_fail/bkpfail26.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/backpack/should_fail/bkpfail27.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/roles/should_fail/Roles12.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/roles/should_fail/T9204.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/typecheck/should_fail/T12035.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/typecheck/should_fail/T12035j.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/typecheck/should_fail/T3468.stderr | 2 |
18 files changed, 84 insertions, 112 deletions
diff --git a/compiler/backpack/RnModIface.hs b/compiler/backpack/RnModIface.hs index d4af5cc4ab..7180918ff7 100644 --- a/compiler/backpack/RnModIface.hs +++ b/compiler/backpack/RnModIface.hs @@ -512,7 +512,7 @@ rnIfaceConDecls :: Rename IfaceConDecls rnIfaceConDecls (IfDataTyCon ds) = IfDataTyCon <$> mapM rnIfaceConDecl ds rnIfaceConDecls (IfNewTyCon d) = IfNewTyCon <$> rnIfaceConDecl d -rnIfaceConDecls (IfAbstractTyCon b) = pure (IfAbstractTyCon b) +rnIfaceConDecls IfAbstractTyCon = pure IfAbstractTyCon rnIfaceConDecl :: Rename IfaceConDecl rnIfaceConDecl d = do diff --git a/compiler/iface/IfaceSyn.hs b/compiler/iface/IfaceSyn.hs index 5ed30c9998..0a50e860a5 100644 --- a/compiler/iface/IfaceSyn.hs +++ b/compiler/iface/IfaceSyn.hs @@ -62,7 +62,7 @@ import Fingerprint import Binary import BooleanFormula ( BooleanFormula, pprBooleanFormula, isTrue ) import Var( TyVarBndr(..) ) -import TyCon ( Role (..), Injectivity(..), HowAbstract(..) ) +import TyCon ( Role (..), Injectivity(..) ) import Util( filterOut, filterByList ) import DataCon (SrcStrictness(..), SrcUnpackedness(..)) import Lexeme (isLexSym) @@ -207,7 +207,7 @@ data IfaceAxBranch = IfaceAxBranch { ifaxbTyVars :: [IfaceTvBndr] -- See Note [Storing compatibility] in CoAxiom data IfaceConDecls - = IfAbstractTyCon HowAbstract -- c.f TyCon.AbstractTyCon + = IfAbstractTyCon -- c.f TyCon.AbstractTyCon | IfDataTyCon [IfaceConDecl] -- Data type decls | IfNewTyCon IfaceConDecl -- Newtype decls @@ -367,9 +367,9 @@ See [http://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/RecompilationAvoid -} visibleIfConDecls :: IfaceConDecls -> [IfaceConDecl] -visibleIfConDecls (IfAbstractTyCon {}) = [] +visibleIfConDecls IfAbstractTyCon = [] visibleIfConDecls (IfDataTyCon cs) = cs -visibleIfConDecls (IfNewTyCon c) = [c] +visibleIfConDecls (IfNewTyCon c) = [c] ifaceDeclImplicitBndrs :: IfaceDecl -> [OccName] -- *Excludes* the 'main' name, but *includes* the implicitly-bound names @@ -385,7 +385,7 @@ ifaceDeclImplicitBndrs :: IfaceDecl -> [OccName] ifaceDeclImplicitBndrs (IfaceData {ifName = tc_name, ifCons = cons }) = case cons of - IfAbstractTyCon {} -> [] + IfAbstractTyCon -> [] IfNewTyCon cd -> mkNewTyCoOcc (occName tc_name) : ifaceConDeclImplicitBndrs cd IfDataTyCon cds -> concatMap ifaceConDeclImplicitBndrs cds @@ -712,10 +712,7 @@ pprIfaceDecl ss (IfaceData { ifName = tycon, ifCType = ctype, | otherwise = Nothing pp_nd = case condecls of - IfAbstractTyCon how -> - case how of - DistinctNominalAbstract -> text "{- abstract -} data" - SkolemAbstract -> text "{- skolem -} data" + IfAbstractTyCon{} -> text "data" IfDataTyCon{} -> text "data" IfNewTyCon{} -> text "newtype" @@ -1717,13 +1714,13 @@ instance Binary IfaceAxBranch where return (IfaceAxBranch a1 a2 a3 a4 a5 a6) instance Binary IfaceConDecls where - put_ bh (IfAbstractTyCon d) = putByte bh 0 >> put_ bh d + put_ bh IfAbstractTyCon = putByte bh 0 put_ bh (IfDataTyCon cs) = putByte bh 1 >> put_ bh cs put_ bh (IfNewTyCon c) = putByte bh 2 >> put_ bh c get bh = do h <- getByte bh case h of - 0 -> liftM IfAbstractTyCon $ get bh + 0 -> return IfAbstractTyCon 1 -> liftM IfDataTyCon (get bh) 2 -> liftM IfNewTyCon (get bh) _ -> error "Binary(IfaceConDecls).get: Invalid IfaceConDecls" diff --git a/compiler/iface/MkIface.hs b/compiler/iface/MkIface.hs index 158e48f24a..27bb9e0021 100644 --- a/compiler/iface/MkIface.hs +++ b/compiler/iface/MkIface.hs @@ -1626,7 +1626,7 @@ tyConToIfaceDecl env tycon ifaceConDecls (DataTyCon { data_cons = cons }) = IfDataTyCon (map ifaceConDecl cons) ifaceConDecls (TupleTyCon { data_con = con }) = IfDataTyCon [ifaceConDecl con] ifaceConDecls (SumTyCon { data_cons = cons }) = IfDataTyCon (map ifaceConDecl cons) - ifaceConDecls (AbstractTyCon distinct) = IfAbstractTyCon distinct + ifaceConDecls AbstractTyCon = IfAbstractTyCon -- The AbstractTyCon case happens when a TyCon has been trimmed -- during tidying. -- Furthermore, tyThingToIfaceDecl is also used in TcRnDriver diff --git a/compiler/iface/TcIface.hs b/compiler/iface/TcIface.hs index 5d41232cb2..ffe29c6ce7 100644 --- a/compiler/iface/TcIface.hs +++ b/compiler/iface/TcIface.hs @@ -207,7 +207,7 @@ typecheckIface iface -- | Returns true if an 'IfaceDecl' is for @data T@ (an abstract data type) isAbstractIfaceDecl :: IfaceDecl -> Bool -isAbstractIfaceDecl IfaceData{ ifCons = IfAbstractTyCon _ } = True +isAbstractIfaceDecl IfaceData{ ifCons = IfAbstractTyCon } = True isAbstractIfaceDecl IfaceClass{ ifCtxt = [], ifSigs = [], ifATs = [] } = True isAbstractIfaceDecl IfaceFamily{ ifFamFlav = IfaceAbstractClosedSynFamilyTyCon } = True isAbstractIfaceDecl _ = False @@ -804,7 +804,7 @@ tc_ax_branch prev_branches tcIfaceDataCons :: Name -> TyCon -> [TyConBinder] -> IfaceConDecls -> IfL AlgTyConRhs tcIfaceDataCons tycon_name tycon tc_tybinders if_cons = case if_cons of - IfAbstractTyCon dis -> return (AbstractTyCon dis) + IfAbstractTyCon -> return AbstractTyCon IfDataTyCon cons -> do { data_cons <- mapM tc_con_decl cons ; return (mkDataTyConRhs data_cons) } IfNewTyCon con -> do { data_con <- tc_con_decl con diff --git a/compiler/typecheck/TcCanonical.hs b/compiler/typecheck/TcCanonical.hs index c6682081db..8688c7702d 100644 --- a/compiler/typecheck/TcCanonical.hs +++ b/compiler/typecheck/TcCanonical.hs @@ -979,8 +979,8 @@ canTyConApp ev eq_rel tc1 tys1 tc2 tys2 ; stopWith ev "Decomposed TyConApp" } else canEqFailure ev eq_rel ty1 ty2 } - -- See Note [Skolem abstract data] (at SkolemAbstract) - | isSkolemAbstractTyCon tc1 || isSkolemAbstractTyCon tc2 + -- See Note [Skolem abstract data] (at tyConSkolem) + | tyConSkolem tc1 || tyConSkolem tc2 = do { traceTcS "canTyConApp: skolem abstract" (ppr tc1 $$ ppr tc2) ; continueWith (CIrredEvCan { cc_ev = ev }) } diff --git a/compiler/typecheck/TcRnDriver.hs b/compiler/typecheck/TcRnDriver.hs index 107162b31f..dafc4b8636 100644 --- a/compiler/typecheck/TcRnDriver.hs +++ b/compiler/typecheck/TcRnDriver.hs @@ -999,7 +999,7 @@ checkBootTyCon is_boot tc1 tc2 check (roles1 == roles2) roles_msg `andThenCheck` check (eqTypeX env syn_rhs1 syn_rhs2) empty -- nothing interesting to say - -- A skolem abstract TyCon can be implemented using a type synonym, but ONLY + -- An abstract TyCon can be implemented using a type synonym, but ONLY -- if the type synonym is nullary and has no type family applications. -- This arises from two properties of skolem abstract data: -- @@ -1011,7 +1011,8 @@ checkBootTyCon is_boot tc1 tc2 -- -- See also 'HowAbstract' and Note [Skolem abstract data]. -- - | isSkolemAbstractTyCon tc1 + | isAbstractTyCon tc1 + , not is_boot -- don't support for hs-boot yet , Just (tvs, ty) <- synTyConDefn_maybe tc2 , Just (tc2', args) <- tcSplitTyConApp_maybe ty = check (null (tcTyFamInsts ty)) @@ -1117,7 +1118,7 @@ checkBootTyCon is_boot tc1 tc2 (text "Roles on abstract types default to" <+> quotes (text "representational") <+> text "in boot files.") - eqAlgRhs _ (AbstractTyCon _) _rhs2 + eqAlgRhs _ AbstractTyCon _rhs2 = checkSuccess -- rhs2 is guaranteed to be injective, since it's an AlgTyCon eqAlgRhs _ tc1@DataTyCon{} tc2@DataTyCon{} = checkListBy eqCon (data_cons tc1) (data_cons tc2) (text "constructors") diff --git a/compiler/typecheck/TcTyClsDecls.hs b/compiler/typecheck/TcTyClsDecls.hs index 805120c088..a45df3ade6 100644 --- a/compiler/typecheck/TcTyClsDecls.hs +++ b/compiler/typecheck/TcTyClsDecls.hs @@ -965,13 +965,10 @@ tcDataDefn roles_info -- In hs-boot, a 'data' declaration with no constructors -- indicates an nominally distinct abstract data type. mk_tc_rhs HsBootFile _ [] - = return (AbstractTyCon DistinctNominalAbstract) + = return AbstractTyCon - -- In hsig, a 'data' declaration indicates a skolem - -- abstract data type. See 'HowAbstract' and Note - -- [Skolem abstract data] for more commentary. - mk_tc_rhs HsigFile _ [] - = return (AbstractTyCon SkolemAbstract) + mk_tc_rhs HsigFile _ [] -- ditto + = return AbstractTyCon mk_tc_rhs _ tycon data_cons = case new_or_data of diff --git a/compiler/types/TyCon.hs b/compiler/types/TyCon.hs index dadf1bafb2..f98da7b039 100644 --- a/compiler/types/TyCon.hs +++ b/compiler/types/TyCon.hs @@ -10,7 +10,7 @@ The @TyCon@ datatype module TyCon( -- * Main TyCon data types - TyCon, AlgTyConRhs(..), HowAbstract(..), visibleDataCons, + TyCon, AlgTyConRhs(..), visibleDataCons, AlgTyConFlav(..), isNoParent, FamTyConFlav(..), Role(..), Injectivity(..), RuntimeRepInfo(..), @@ -56,7 +56,6 @@ module TyCon( isDataSumTyCon_maybe, isEnumerationTyCon, isNewTyCon, isAbstractTyCon, - isSkolemAbstractTyCon, isFamilyTyCon, isOpenFamilyTyCon, isTypeFamilyTyCon, isDataFamilyTyCon, isOpenTypeFamilyTyCon, isClosedSynFamilyTyConWithAxiom_maybe, @@ -71,6 +70,7 @@ module TyCon( -- ** Extracting information out of TyCons tyConName, + tyConSkolem, tyConKind, tyConUnique, tyConTyVars, @@ -739,7 +739,6 @@ data AlgTyConRhs -- it's represented by a pointer. Used when we export a data type -- abstractly into an .hi file. = AbstractTyCon - HowAbstract -- | Information about those 'TyCon's derived from a @data@ -- declaration. This includes data types with no constructors at @@ -797,72 +796,6 @@ data AlgTyConRhs -- again check Trac #1072. } --- | An 'AbstractTyCon' represents some matchable type constructor (i.e., valid --- in instance heads), for which we do not know the implementation. We refer to --- these as "abstract data". --- --- At the moment, there are two flavors of abstract data, corresponding --- to whether or not the abstract data declaration occurred in an hs-boot --- file or an hsig file. --- -data HowAbstract - -- | Nominally distinct abstract data arises from abstract data - -- declarations in an hs-boot file. - -- - -- Abstract data of this form is guaranteed to be nominally distinct - -- from all other declarations in the system; e.g., if I have - -- a @data T@ and @data S@ in an hs-boot file, it is safe to - -- assume that they will never equal each other. This is something - -- of an implementation accident: it is a lot easier to assume that - -- @data T@ in @A.hs-boot@ indicates there will be @data T = ...@ - -- in @A.hs@, than to permit the possibility that @A.hs@ reexports - -- it from somewhere else. - = DistinctNominalAbstract - - -- Note [Skolem abstract data] - -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- Skolem abstract data arises from abstract data declarations - -- in an hsig file. - -- - -- The best analogy is to interpret the abstract types in Backpack - -- unit as elaborating to universally quantified type variables; - -- e.g., - -- - -- unit p where - -- signature H where - -- data T - -- data S - -- module M where - -- import H - -- f :: (T ~ S) => a -> b - -- f x = x - -- - -- elaborates as (with some fake structural types): - -- - -- p :: forall t s. { f :: forall a b. t ~ s => a -> b } - -- p = { f = \x -> x } -- ill-typed - -- - -- It is clear that inside p, t ~ s is not provable (and - -- if we tried to write a function to cast t to s, that - -- would not work), but if we call p @Int @Int, clearly Int ~ Int - -- is provable. The skolem variables are all distinct from - -- one another, but we can't make assumptions like "f is - -- inaccessible", because the skolem variables will get - -- instantiated eventually! - -- - -- Skolem abstract data still has the constraint that there - -- are no type family applications, to keep this data matchable. - | SkolemAbstract - -instance Binary HowAbstract where - put_ bh DistinctNominalAbstract = putByte bh 0 - put_ bh SkolemAbstract = putByte bh 1 - - get bh = do { h <- getByte bh - ; case h of - 0 -> return DistinctNominalAbstract - _ -> return SkolemAbstract } - -- | Some promoted datacons signify extra info relevant to GHC. For example, -- the @IntRep@ constructor of @RuntimeRep@ corresponds to the 'IntRep' -- constructor of 'PrimRep'. This data structure allows us to store this @@ -1642,15 +1575,9 @@ isFunTyCon _ = False -- | Test if the 'TyCon' is algebraic but abstract (invisible data constructors) isAbstractTyCon :: TyCon -> Bool -isAbstractTyCon (AlgTyCon { algTcRhs = AbstractTyCon {} }) = True +isAbstractTyCon (AlgTyCon { algTcRhs = AbstractTyCon }) = True isAbstractTyCon _ = False --- | Test if the 'TyCon' is totally abstract; i.e., it is not even certain --- to be nominally distinct. -isSkolemAbstractTyCon :: TyCon -> Bool -isSkolemAbstractTyCon (AlgTyCon { algTcRhs = AbstractTyCon SkolemAbstract }) = True -isSkolemAbstractTyCon _ = False - -- | Make an fake, recovery 'TyCon' from an existing one. -- Used when recovering from errors makeRecoveryTyCon :: TyCon -> TyCon @@ -2454,3 +2381,53 @@ checkRecTc (RC bound rec_nts) tc Nothing -> Just (RC bound (extendNameEnv rec_nts tc_name 1)) where tc_name = tyConName tc + +-- | Returns whether or not this 'TyCon' is definite, or a hole +-- that may be filled in at some later point. See Note [Skolem abstract data] +tyConSkolem :: TyCon -> Bool +tyConSkolem = isHoleName . tyConName + +-- Note [Skolem abstract data] +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- Skolem abstract data arises from data declarations in an hsig file. +-- +-- The best analogy is to interpret the types declared in signature files as +-- elaborating to universally quantified type variables; e.g., +-- +-- unit p where +-- signature H where +-- data T +-- data S +-- module M where +-- import H +-- f :: (T ~ S) => a -> b +-- f x = x +-- +-- elaborates as (with some fake structural types): +-- +-- p :: forall t s. { f :: forall a b. t ~ s => a -> b } +-- p = { f = \x -> x } -- ill-typed +-- +-- It is clear that inside p, t ~ s is not provable (and +-- if we tried to write a function to cast t to s, that +-- would not work), but if we call p @Int @Int, clearly Int ~ Int +-- is provable. The skolem variables are all distinct from +-- one another, but we can't make assumptions like "f is +-- inaccessible", because the skolem variables will get +-- instantiated eventually! +-- +-- Skolem abstractness can apply to "non-abstract" data as well): +-- +-- unit p where +-- signature H1 where +-- data T = MkT +-- signature H2 where +-- data T = MkT +-- module M where +-- import qualified H1 +-- import qualified H2 +-- f :: (H1.T ~ H2.T) => a -> b +-- f x = x +-- +-- This is why the test is on the original name of the TyCon, +-- not whether it is abstract or not. diff --git a/testsuite/tests/backpack/should_fail/bkpfail10.stderr b/testsuite/tests/backpack/should_fail/bkpfail10.stderr index c5214513b4..70b0853dc5 100644 --- a/testsuite/tests/backpack/should_fail/bkpfail10.stderr +++ b/testsuite/tests/backpack/should_fail/bkpfail10.stderr @@ -13,7 +13,7 @@ bkpfail10.bkp:8:9: error: • Type constructor ‘H’ has conflicting definitions in the module and its hsig file Main module: data H a = H a - Hsig file: {- skolem -} data H + Hsig file: data H The types have different kinds • while checking that q:H implements signature H in p[H=q:H] diff --git a/testsuite/tests/backpack/should_fail/bkpfail23.stderr b/testsuite/tests/backpack/should_fail/bkpfail23.stderr index de4026ad6a..00a19e2001 100644 --- a/testsuite/tests/backpack/should_fail/bkpfail23.stderr +++ b/testsuite/tests/backpack/should_fail/bkpfail23.stderr @@ -15,7 +15,7 @@ bkpfail23.bkp:14:9: error: and its hsig file Main module: type F a = () Hsig file: type role F phantom - {- skolem -} data F a + data F a Illegal parameterized type synonym in implementation of abstract data. (Try eta reducing your type synonym so that it is nullary.) • while checking that h:H implements signature H in p[H=h:H] diff --git a/testsuite/tests/backpack/should_fail/bkpfail25.stderr b/testsuite/tests/backpack/should_fail/bkpfail25.stderr index ef2d03554c..936fbb561b 100644 --- a/testsuite/tests/backpack/should_fail/bkpfail25.stderr +++ b/testsuite/tests/backpack/should_fail/bkpfail25.stderr @@ -19,5 +19,5 @@ bkpfail25.bkp:12:9: error: • Type constructor ‘T’ has conflicting definitions in the module and its hsig file Main module: type T a = a - Hsig file: {- skolem -} data T a + Hsig file: data T a • while checking that q:H implements signature H in p[H=q:H] diff --git a/testsuite/tests/backpack/should_fail/bkpfail26.stderr b/testsuite/tests/backpack/should_fail/bkpfail26.stderr index fa192c261a..01c8c32d1e 100644 --- a/testsuite/tests/backpack/should_fail/bkpfail26.stderr +++ b/testsuite/tests/backpack/should_fail/bkpfail26.stderr @@ -14,7 +14,7 @@ bkpfail26.bkp:15:9: error: • Type constructor ‘T’ has conflicting definitions in the module and its hsig file Main module: type T a = [a] - Hsig file: {- skolem -} data T a + Hsig file: data T a Illegal parameterized type synonym in implementation of abstract data. (Try eta reducing your type synonym so that it is nullary.) • while checking that q:H implements signature H in p[H=q:H] diff --git a/testsuite/tests/backpack/should_fail/bkpfail27.stderr b/testsuite/tests/backpack/should_fail/bkpfail27.stderr index 3d1446a77d..dfadb40773 100644 --- a/testsuite/tests/backpack/should_fail/bkpfail27.stderr +++ b/testsuite/tests/backpack/should_fail/bkpfail27.stderr @@ -14,6 +14,6 @@ bkpfail27.bkp:15:9: error: • Type constructor ‘T’ has conflicting definitions in the module and its hsig file Main module: type T = F - Hsig file: {- skolem -} data T + Hsig file: data T Illegal type family application in implementation of abstract data. • while checking that q:H implements signature H in p[H=q:H] diff --git a/testsuite/tests/roles/should_fail/Roles12.stderr b/testsuite/tests/roles/should_fail/Roles12.stderr index ac57e2bcbc..d1872f3350 100644 --- a/testsuite/tests/roles/should_fail/Roles12.stderr +++ b/testsuite/tests/roles/should_fail/Roles12.stderr @@ -4,6 +4,6 @@ Roles12.hs:5:1: error: and its hs-boot file Main module: type role T phantom data T a - Boot file: {- abstract -} data T a + Boot file: data T a The roles do not match. Roles on abstract types default to ‘representational’ in boot files. diff --git a/testsuite/tests/roles/should_fail/T9204.stderr b/testsuite/tests/roles/should_fail/T9204.stderr index e5e99253fc..998f17c284 100644 --- a/testsuite/tests/roles/should_fail/T9204.stderr +++ b/testsuite/tests/roles/should_fail/T9204.stderr @@ -4,6 +4,6 @@ T9204.hs:6:1: error: and its hs-boot file Main module: type role D phantom data D a - Boot file: {- abstract -} data D a + Boot file: data D a The roles do not match. Roles on abstract types default to ‘representational’ in boot files. diff --git a/testsuite/tests/typecheck/should_fail/T12035.stderr b/testsuite/tests/typecheck/should_fail/T12035.stderr index 9e5ff78b09..c6113ea207 100644 --- a/testsuite/tests/typecheck/should_fail/T12035.stderr +++ b/testsuite/tests/typecheck/should_fail/T12035.stderr @@ -3,4 +3,4 @@ T12035.hs-boot:2:1: error: Type constructor ‘T’ has conflicting definitions in the module and its hs-boot file Main module: type T = Bool - Boot file: {- abstract -} data T + Boot file: data T diff --git a/testsuite/tests/typecheck/should_fail/T12035j.stderr b/testsuite/tests/typecheck/should_fail/T12035j.stderr index 9e5ff78b09..c6113ea207 100644 --- a/testsuite/tests/typecheck/should_fail/T12035j.stderr +++ b/testsuite/tests/typecheck/should_fail/T12035j.stderr @@ -3,4 +3,4 @@ T12035.hs-boot:2:1: error: Type constructor ‘T’ has conflicting definitions in the module and its hs-boot file Main module: type T = Bool - Boot file: {- abstract -} data T + Boot file: data T diff --git a/testsuite/tests/typecheck/should_fail/T3468.stderr b/testsuite/tests/typecheck/should_fail/T3468.stderr index cae8eedefc..1f8bdcb11b 100644 --- a/testsuite/tests/typecheck/should_fail/T3468.stderr +++ b/testsuite/tests/typecheck/should_fail/T3468.stderr @@ -5,5 +5,5 @@ T3468.hs-boot:3:1: error: Main module: type role Tool phantom data Tool d where F :: a -> Tool d - Boot file: {- abstract -} data Tool + Boot file: data Tool The types have different kinds |