[GHC] #12670: Representation polymorphism validity check is too strict

GHC ghc-devs at haskell.org
Fri Oct 7 12:22:24 UTC 2016


#12670: Representation polymorphism validity check is too strict
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.2.1
       Component:  Compiler (Type    |              Version:  8.0.1
  checker)                           |
      Resolution:                    |             Keywords:  typeable
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 bgamari):

 Well, I'm not quite sure that is sufficient; afterall the kind of `a` in
 the above example indeed has the form `TYPE blah`.

 Rather, it seems like we need some way of determining whether a particular
 `RuntimeRep` variable affects the runtime representation of a type. It
 would seem at first glance that given a function type, e.g. `a -> b`, we
 would want to check that the kinds of `a` and `b` both have no free
 `RuntimeRep` variables. I suspect this is the only check necessary. We can
 assume that applications of any other tycon to `RuntimeRep` variables is
 safe since the type has already been subject to the
 `checkForRepresentationPolymorphism` check. Consequently, we have already
 determined that none of the type's type arguments will affect its
 representation and therefore any well-kinded application is safe.

 Therefore, I propose that `checkForRepresentationPolymorphism` is simply
 the following,
 {{{#!hs
 checkForRepresentationPolymorphism :: SDoc -> Type -> TcM ()
 checkForRepresentationPolymorphism extra ty
   | Just (tc, tys) <- splitTyConApp_maybe ty
   , isUnboxedTupleTyCon tc || isUnboxedSumTyCon tc
   = mapM_ (checkForRepresentationPolymorphism extra) (dropRuntimeRepArgs
 tys)

   | tuple_rep || sum_rep
   = {- fail -}

   | (args, res) <- splitFunTys ty
   , not $ all is_safe_arrow_argument (res:args)
   = {- fail -}

   | otherwise
   = return ()
   where
     tuple_rep    = runtime_rep `eqType` unboxedTupleRepDataConTy
     sum_rep      = runtime_rep `eqType` unboxedSumRepDataConTy
     tuple_or_sum = text (if tuple_rep then "tuple" else "sum")

     ki          = typeKind ty
     runtime_rep = getRuntimeRepFromKind "check_type" ki
     is_safe_arrow_argument =
           isEmptyVarSet . tyCoVarsOfType
         . getRuntimeRepFromKind "check_type" . typeKind
 }}}

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


More information about the ghc-tickets mailing list