Export a tiny bit more info with AbstractTyCon (fixes #5424)
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 2 Sep 2011 16:43:53 +0000 (17:43 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 2 Sep 2011 16:43:53 +0000 (17:43 +0100)
commitde9b85fa3fb6d4cd593366e1f2383cd0b492c056
tree54a702ef88a894f6aebfd2463a82185412cd49a5
parentf5c0851a72f7a9cb8a7349eec7a6d4262be7295d
Export a tiny bit more info with AbstractTyCon (fixes #5424)

When we compile -O0 we put type constructors in the interface file
without their data constructors -- an AbstractTyCon.  But in a
client module, to give good pattern-match exhaustiveness warnings,
we need to know the difference between a data type and a newtype.
(The latter can be coerced to another type, but a data type can't.)
See Note [Pruning dead case alternatives] in Unify.

Because we weren't conveying this info, we were getting bogus
warnings about inexhaustive patterm matches with GADTs, and
(confusingly) these warnings woudl come and go depending on
whether you were compiling with -O.

This patch makes AbstractTyCon carry a flag indicating whether
the type constructor is "distinct"; two distinct TyCons cannot
be coerced into eachother (except by unsafeCoerce, in which case
all bets are off).

HEADS UP: interface file format changes slightly, so you need
to make clean.
compiler/iface/BinIface.hs
compiler/iface/BuildTyCl.lhs
compiler/iface/IfaceSyn.lhs
compiler/iface/MkIface.lhs
compiler/iface/TcIface.lhs
compiler/typecheck/TcDeriv.lhs
compiler/typecheck/TcRnDriver.lhs
compiler/typecheck/TcTyClsDecls.lhs
compiler/types/TyCon.lhs
compiler/types/Unify.lhs