This patch implements primitive unboxed sum types, as described in https://ghc.haskell.org/trac/ghc/wiki/UnpackedSumTypes.
Main changes are:
- Add new syntax for unboxed sums types, terms and patterns. Hidden behind -XUnboxedSums.
- Add unlifted unboxed sum type constructors and data constructors, extend type and pattern checkers and desugarer.
- Add new RuntimeRep for unboxed sums.
- Extend unarise pass to translate unboxed sums to unboxed tuples right before code generation.
- Add StgRubbishArg to StgArg, and a new type CmmArg for better code generation when sum values are involved.
- Add user manual section for unboxed sums.
Some other changes:
- Generalize UbxTupleRep to MultiRep and UbxTupAlt to MultiValAlt to be able to use those with both sums and tuples.
- Don't use tyConPrimRep in isVoidTy: tyConPrimRep is really wrong, given an Any TyCon, there's no way to tell what its kind is, but kindPrimRep and in turn tyConPrimRep returns PtrRep.
- Fix some bugs on the way: Trac #12375.
Not included in this patch:
- Update Haddock for new the new unboxed sum syntax.
- TemplateHaskell support is left as future work.
- Front-end code is mostly trivial and adapted from unboxed tuple code for type checking, pattern checking, renaming, desugaring etc.
- Main translation routines are in RepType and UnariseStg. Documentation in UnariseStg should be enough for understanding what's going on.
- Johan Tibell wrote the initial front-end and interface file extensions.
- Simon Peyton Jones reviewed this patch many times, wrote some code, and helped with debugging.