Skip to content
  • Richard Eisenberg's avatar
    Remove the type-checking knot. · f8618a9b
    Richard Eisenberg authored
    Bug #15380 hangs because a knot-tied TyCon ended up in a kind.
    Looking at the code in tcInferApps, I'm amazed this hasn't happened
    before! I couldn't think of a good way to fix it (with dependent
    types, we can't really keep types out of kinds, after all), so
    I just went ahead and removed the knot.
    
    This was remarkably easy to do. In tcTyVar, when we find a TcTyCon,
    just use it. (Previously, we looked up the knot-tied TyCon and used
    that.) Then, during the final zonk, replace TcTyCons with the real,
    full-blooded TyCons in the global environment. It's all very easy.
    
    The new bit is explained in the existing
    Note [Type checking recursive type and class declarations]
    in TcTyClsDecls.
    
    Naturally, I removed various references to the knot and the
    zonkTcTypeInKnot (and related) functions. Now, we can print types
    during type checking with abandon!
    
    NB: There is a teensy error message regression with this patch,
    around the ordering of quantified type variables. This ordering
    problem is fixed (I believe) with the patch for #14880. The ordering
    affects only internal variables that cannot be instantiated with
    any kind of visible type application.
    
    There is also a teensy regression around the printing of types
    in TH splices. I think this is really a TH bug and will file
    separately.
    
    Test case: dependent/should_fail/T15380
    f8618a9b