Tyepchecker generates top-level unboxed coercion
Consider this code
{-# OPTIONS_GHC -fdefer-out-of-scope-variables #-}
module Foo where
import Data.Coerce
f :: Bool
f = coerce (k :: Int)
It generates a lint error:
*** Core Lint errors : in result of Desugar (after optimization) ***
<no location info>: warning:
[RHS of cobox_a11N :: (Int :: *) ~R# (Bool :: *)]
The type of this binder is unlifted: cobox_a11N
Binder's type: (Int :: *) ~R# (Bool :: *)
*** Offending Program ***
$trModule :: Module
[LclIdX]
$trModule = Module (TrNameS "main"#) (TrNameS "Foo"#)
cobox_a11N :: (Int :: *) ~R# (Bool :: *)
[LclId[CoVarId]]
cobox_a11N
= typeError
@ ('TupleRep '[])
@ ((Int :: *) ~R# (Bool :: *))
"Foo.hs:8:5: error:\n\
\ \\226\\128\\162 Couldn't match representation of type \\226\\128\\152Int\\226\\128\\153 with that of \\226\\128\\152Bool\\226\\128\\153\n\
\ arising from a use of \\226\\128\\152coerce\\226\\128\\153\n\
\ \\226\\128\\162 In the expression: coerce (k :: Int)\n\
\ In an equation for \\226\\128\\152f\\226\\128\\153: f = coerce (k :: Int)\n\
\(deferred type error)"#
f :: Bool
[LclIdX]
f = (typeError
@ 'LiftedRep
@ Int
"Foo.hs:8:13: error: Variable not in scope: k :: Int\n\
\(deferred type error)"#)
`cast` (cobox_a11N :: (Int :: *) ~R# (Bool :: *))
*** End of Offense ***
Reason: this rather hacky test in TcUnify.buildImplication
; if null skol_tvs && null given && (not deferred_type_errors ||
not (isTopTcLevel tc_lvl))
did take account of Opt_DeferOutOfScopeVariables
.
Trac metadata
Trac field | Value |
---|---|
Version | 8.2.1 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |