Merge remote-tracking branch 'origin/master' into type-nats
[ghc.git] / compiler / typecheck / TcForeign.lhs
index 10de6ac..7379ca2 100644 (file)
@@ -122,15 +122,10 @@ normaliseFfiType' env ty0 = go [] ty0
                                                   panic "normaliseFfiType': Got more GREs than expected"
                                       _ ->
                                           return False
-                  when (not newtypeOK) $
-                     -- later: stop_here
-                    addWarnTc (ptext (sLit "newtype") <+> quotes (ppr tc) <+>
-                               ptext (sLit "is used in an FFI declaration,") $$
-                               ptext (sLit "but its constructor is not in scope.") $$
-                               ptext (sLit "This will become an error in GHC 7.6.1."))
-
-                  let nt_co = mkAxInstCo (newTyConCo tc) tys
-                  add_co nt_co rec_nts' nt_rhs
+                  if newtypeOK
+                      then do let nt_co = mkAxInstCo (newTyConCo tc) tys
+                              add_co nt_co rec_nts' nt_rhs
+                      else children_only
 
         | isFamilyTyCon tc              -- Expand open tycons
         , (co, ty) <- normaliseTcApp env tc tys
@@ -138,11 +133,7 @@ normaliseFfiType' env ty0 = go [] ty0
         = add_co co rec_nts ty
 
         | otherwise
-        = return (mkReflCo ty, ty)
-            -- If we have reached an ordinary (non-newtype) type constructor,
-            -- we are done.  Note that we don't need to normalise the arguments,
-            -- because whether an FFI type is legal or not depends only on
-            -- the top-level type constructor (e.g. "Ptr a" is valid for all a).
+        = children_only
         where
           tc_key = getUnique tc
           children_only = do xs <- mapM (go rec_nts) tys
@@ -272,13 +263,18 @@ tcCheckFIType sig_ty arg_tys res_ty idecl@(CImport cconv safety _ (CFunction tar
       checkForeignArgs (isFFIArgumentTy dflags safety) arg_tys
       checkForeignRes nonIOok checkSafe (isFFIImportResultTy dflags) res_ty
       checkMissingAmpersand dflags arg_tys res_ty
+      case target of
+          StaticTarget _ _ False
+           | not (null arg_tys) ->
+              addErrTc (text "`value' imports cannot have function types")
+          _ -> return ()
       return idecl
 
 
 -- This makes a convenient place to check
 -- that the C identifier is valid for C
 checkCTarget :: CCallTarget -> TcM ()
-checkCTarget (StaticTarget str _) = do
+checkCTarget (StaticTarget str _ _) = do
     checkCg checkCOrAsmOrLlvmOrDotNetOrInterp
     check (isCLabelString str) (badCName str)