This patch modifies error, undefined, and assertError to use implicit call-stacks to provide better error messages to users.
There are a few knock-on effects:
- GHC.Classes.IP is now wired-in so it can be used in the wired-in types for error and undefined.
- TysPrim.tyVarList has been replaced with a new function TysPrim.mkTemplateTyVars. tyVarList made it easy to introduce subtle bugs when you need tyvars of different kinds. The naive
tv1 = head $ tyVarList kind1 tv2 = head $ tyVarList kind2
would result in tv1 and tv2 sharing a Unique, thus substitutions would be applied incorrectly, treating tv1 and tv2 as the same tyvar. mkTemplateTyVars avoids this pitfall by taking a list of kinds and producing a single tyvar of each kind.
- The types GHC.SrcLoc.SrcLoc and GHC.Stack.CallStack now live in ghc-prim.
- The type GHC.Exception.ErrorCall has a new constructor ErrorCallWithLocation that takes two Strings instead of one, the 2nd one being arbitrary metadata about the error (but usually the call-stack). A bi-directional pattern synonym ErrorCall continues to provide the old API.