dsCImport (CLabel): drop foralls when checking for FunPtr
authorSimon Marlow <marlowsd@gmail.com>
Wed, 4 Jan 2012 13:29:14 +0000 (13:29 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Wed, 4 Jan 2012 14:28:56 +0000 (14:28 +0000)
We were mislabelling some foreign imports as IsData rather than
IsFunction, because the type was forall a. FunPtr (... a ...).

Eventually this gave rise to these obscure error when compiling
unregisterised:

libraries/base/Foreign/Marshal/Alloc.hc:473:0:
     warning: built-in function ‘free’ declared as non-function

libraries/base/Foreign/Marshal/Alloc.hc:1004:0:
     error: ‘free’ redeclared as different kind of symbol

compiler/deSugar/DsForeign.lhs

index 30d4af9..cce8ba7 100644 (file)
@@ -138,7 +138,7 @@ dsCImport :: Id
           -> DsM ([Binding], SDoc, SDoc)
 dsCImport id co (CLabel cid) cconv _ _ = do
    let ty = pFst $ coercionKind co
-       fod = case tyConAppTyCon_maybe ty of
+       fod = case tyConAppTyCon_maybe (dropForAlls ty) of
              Just tycon
               | tyConUnique tycon == funPtrTyConKey ->
                  IsFunction