[GHC] #15918: GHC panic from QuantifiedConstraints(?)

GHC ghc-devs at haskell.org
Thu Feb 7 19:16:45 UTC 2019


#15918: GHC panic from QuantifiedConstraints(?)
-------------------------------------+-------------------------------------
        Reporter:  Iceland_jack      |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.2
      Resolution:                    |             Keywords:
                                     |  QuantifiedConstraints
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 goldfire):

 The type-checker might conceivably not produce an error for a coercion
 like that. For example, if we have

 {{{#!hs
 class Def a where
   meth :: a
 }}}

 then we get `axDef :: Def a ~R# a`, and thus `KindCo axDef :: Constraint
 ~# Type`. Would this happen in practice? Most likely not, but we can't
 rule it out.

 One possible route is to have `mkCastTy` carefully not discard
 `Type`/`Constraint` coercions... and do nothing else. This would violate
 property `(EQ)` of `Note [Non-trivial definitional equality]`. But
 (assuming the type-checker never maliciously produces `KindCo axDef`),
 this would come up only in ill-typed programs. Still, I can't rule out the
 possibility of a panic or poor error message in such a scenario. Perhaps
 worse, any misbehavior would be terribly fragile, based as it would be on
 an arbitrary choice between two things that GHC thinks are equal.

 As we're thinking about this, it's not just coercions between `Type` and
 `Constraint` that are in play: it's all coercions that are reflexive
 except for variations between `Type` and `Constraint`. For example, a
 coercion between `Type -> Constraint` and `Type -> Type`. So the
 simplistic check proposed in comment:9 would be insufficient.

 One other possible solution: introduce a `TcCastTy :: Type -> Coercion ->
 Type` constructor in `Type`, with the following invariant: the coercion
 stored is reflexive in Core but irreflexive in Haskell. That is, the
 coercion would relate something that mentions `Type` to something that
 mentions `Constraint`. `mkCastTy` could cleverly figure out whether to
 make a `CastTy` or a `TcCastTy`. `coreView` could discard `TcCastTy`s;
 `tcView` wouldn't. This is similar to the plan Simon expands in comment:9,
 but caching the decision of whether to discard.

 It's still all a bit distasteful, though.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15918#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list