Allow Any return in foreign prim, fixes #10460.
authorEdward Z. Yang <ezyang@cs.stanford.edu>
Mon, 1 Jun 2015 18:30:17 +0000 (11:30 -0700)
committerEdward Z. Yang <ezyang@cs.stanford.edu>
Wed, 3 Jun 2015 16:56:36 +0000 (09:56 -0700)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
Test Plan: validate

Reviewers: simonpj, goldfire, austin

Subscribers: bgamari, thomie

Differential Revision: https://phabricator.haskell.org/D935

GHC Trac Issues: #10460

compiler/typecheck/TcType.hs
docs/users_guide/ffi-chap.xml
testsuite/tests/ffi/should_compile/T10460.hs [new file with mode: 0644]
testsuite/tests/ffi/should_compile/all.T

index a131a05..485c1ba 100644 (file)
@@ -1658,9 +1658,11 @@ isFFIPrimArgumentTy dflags ty
 
 isFFIPrimResultTy :: DynFlags -> Type -> Validity
 -- Checks for valid result type for a 'foreign import prim'
--- Currently it must be an unlifted type, including unboxed tuples.
+-- Currently it must be an unlifted type, including unboxed tuples,
+-- or the well-known type Any.
 isFFIPrimResultTy dflags ty
-   = checkRepTyCon (legalFIPrimResultTyCon dflags) ty
+  | isAnyTy ty = IsValid
+  | otherwise = checkRepTyCon (legalFIPrimResultTyCon dflags) ty
 
 isFunPtrTy :: Type -> Bool
 isFunPtrTy ty
index a5ab9e7..38db2bf 100644 (file)
@@ -76,7 +76,8 @@ OK:
          internal GHC calling convention.  The arguments and results must
          be unboxed types, except that an argument may be of type
          <literal>Any</literal> (by way of <literal>unsafeCoerce#</literal>)
-         and the result type is allowed to be an unboxed tuple.
+         and the result type is allowed to be an unboxed tuple or the
+         type <literal>Any</literal>.
        </para>
        <para>
          This feature is not intended for
diff --git a/testsuite/tests/ffi/should_compile/T10460.hs b/testsuite/tests/ffi/should_compile/T10460.hs
new file mode 100644 (file)
index 0000000..7481453
--- /dev/null
@@ -0,0 +1,5 @@
+{-# LANGUAGE GHCForeignImportPrim #-}
+module T10460 where
+import GHC.Exts
+-- don't link me!
+foreign import prim "f" f :: Any -> Any
index 84c7e86..ec6326b 100644 (file)
@@ -29,3 +29,4 @@ test('T3624', normal, compile, [''])
 test('T3742', normal, compile, [''])
 test('cc015', normal, compile, [''])
 test('cc016', normal, compile, [''])
+test('T10460', normal, compile, [''])