[GHC] #16287: :kind accepts bogus type
GHC
ghc-devs at haskell.org
Tue Feb 5 11:33:27 UTC 2019
#16287: :kind accepts bogus type
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.6.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
Here's an even simpler example:
{{{
λ> data T :: (Type -> Type) -> Type
λ> type F a = a
λ> :k T F
T F :: *
}}}
I'm very surprised that `TcValidity` doesn't catch this. Now that I look
closer,
[https://gitlab.haskell.org/ghc/ghc/blob/406e43af2f12756c80d583b86326f760f2f584cc/compiler/typecheck/TcValidity.hs#L604-608
here's why]:
{{{#!hs
check_type ve ty@(TyConApp tc tys)
| isTypeSynonymTyCon tc || isTypeFamilyTyCon tc
= check_syn_tc_app ve ty tc tys
| isUnboxedTupleTyCon tc = check_ubx_tuple ve ty tys
| otherwise = mapM_ (check_arg_type ve) tys
}}}
If `T` were a type synonym, then we'd call `check_syn_tc_app`, which would
reject the unsaturated `F` argument. But since `T` isn't a type synonym,
we instead go down a different code path (`check_arg_type`), which doesn't
catch this.
FWIW,
[https://gitlab.haskell.org/ghc/ghc/blob/406e43af2f12756c80d583b86326f760f2f584cc/compiler/typecheck/TcValidity.hs#L716-723
this] is all that `check_syn_tc_app` does to ensure that unsaturated
arguments are rejected:
{{{#!hs
arg_ctxt :: UserTypeCtxt
arg_ctxt
| GhciCtxt _ <- ctxt = GhciCtxt False
-- When checking an argument, set the field of GhciCtxt to False
to
-- indicate that we are no longer in an outermost position (and
thus
-- unsaturated synonyms are no longer allowed).
-- See Note [Unsaturated type synonyms in GHCi]
| otherwise = ctxt
}}}
Perhaps we should just use this logic in `check_arg_type` as well? I think
that would catch the program in this ticket without too much fuss.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16287#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list