Add a test for #4891
authorIan Lynagh <igloo@earth.li>
Sun, 3 Apr 2011 14:36:57 +0000 (15:36 +0100)
committerIan Lynagh <igloo@earth.li>
Sun, 3 Apr 2011 14:36:57 +0000 (15:36 +0100)
testsuite/tests/ghc-regress/ghc-api/T4891/Makefile [new file with mode: 0644]
testsuite/tests/ghc-regress/ghc-api/T4891/T4891.hs [new file with mode: 0644]
testsuite/tests/ghc-regress/ghc-api/T4891/T4891.stdout [new file with mode: 0644]
testsuite/tests/ghc-regress/ghc-api/T4891/X.hs [new file with mode: 0644]
testsuite/tests/ghc-regress/ghc-api/T4891/all.T [new file with mode: 0644]

diff --git a/testsuite/tests/ghc-regress/ghc-api/T4891/Makefile b/testsuite/tests/ghc-regress/ghc-api/T4891/Makefile
new file mode 100644 (file)
index 0000000..592bde0
--- /dev/null
@@ -0,0 +1,13 @@
+TOP=../../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+clean:
+       rm -f *.o *.hi
+
+T4891: clean
+       '$(TEST_HC)' --make -v0 -package ghc T4891
+       ./T4891 "`'$(TEST_HC)' --print-libdir | tr -d '\r'`"
+
+.PHONY: clean T4891
+
diff --git a/testsuite/tests/ghc-regress/ghc-api/T4891/T4891.hs b/testsuite/tests/ghc-regress/ghc-api/T4891/T4891.hs
new file mode 100644 (file)
index 0000000..8dd3686
--- /dev/null
@@ -0,0 +1,64 @@
+{-# LANGUAGE BangPatterns #-}
+module Main where
+
+import ByteCodeLink
+import CoreMonad
+import Data.Array
+import DataCon
+import GHC
+import HscTypes
+import Linker
+import RtClosureInspect
+import TcEnv
+import Type
+import TcRnMonad
+import TcType
+import Control.Applicative
+import Name (getOccString)
+import Unsafe.Coerce
+import Control.Monad
+import Data.Maybe
+import Bag
+import PrelNames (iNTERACTIVE)
+import Outputable
+import GhcMonad
+import X
+
+main :: IO ()
+main = runGhc (Just "/home/ian/ghc/git/ghc/inplace/lib") $ do
+  dflags' <- getSessionDynFlags
+  primPackages <- setSessionDynFlags dflags'
+  dflags <- getSessionDynFlags
+  defaultCleanupHandler dflags $ do
+    target <- guessTarget "X.hs" Nothing
+    setTargets [target]
+    load LoadAllTargets
+
+    () <- chaseConstructor (unsafeCoerce False)
+    () <- chaseConstructor (unsafeCoerce [1,2,3])
+    () <- chaseConstructor (unsafeCoerce (3 :-> 2))
+    () <- chaseConstructor (unsafeCoerce (4 :->. 4))
+    () <- chaseConstructor (unsafeCoerce (4 :->.+ 4))
+    return ()
+
+chaseConstructor :: (GhcMonad m) => HValue -> m ()
+chaseConstructor !hv = do
+  liftIO $ putStrLn "====="
+  closure <- liftIO $ getClosureData hv
+  case tipe closure  of
+    Indirection _ -> chaseConstructor (ptrs closure ! 0)
+    Constr -> do
+      withSession $ \hscEnv -> liftIO $ initTcForLookup hscEnv $ do
+        eDcname <- dataConInfoPtrToName (infoPtr closure)
+        case eDcname of
+          Left _       -> return ()
+          Right dcName -> do
+            liftIO $ putStrLn $ "Name: "      ++ showPpr dcName
+            liftIO $ putStrLn $ "OccString: " ++ "'" ++ getOccString dcName ++ "'"
+            dc <- tcLookupDataCon dcName
+            liftIO $ putStrLn $ "DataCon: "   ++ showPpr dc
+    _ -> return ()
+
+initTcForLookup :: HscEnv -> TcM a -> IO a
+initTcForLookup hsc_env = liftM (\(msg, mValue) -> fromMaybe (error . show . bagToList . snd $ msg) mValue) . initTc hsc_env HsSrcFile False iNTERACTIVE
+
diff --git a/testsuite/tests/ghc-regress/ghc-api/T4891/T4891.stdout b/testsuite/tests/ghc-regress/ghc-api/T4891/T4891.stdout
new file mode 100644 (file)
index 0000000..47eb152
--- /dev/null
@@ -0,0 +1,20 @@
+=====
+Name: GHC.Types.False
+OccString: 'False'
+DataCon: GHC.Types.False
+=====
+Name: :
+OccString: ':'
+DataCon: :
+=====
+Name: X.:->
+OccString: ':->'
+DataCon: X.:->
+=====
+Name: X.:->.
+OccString: ':->.'
+DataCon: X.:->.
+=====
+Name: X.:->.+
+OccString: ':->.+'
+DataCon: X.:->.+
diff --git a/testsuite/tests/ghc-regress/ghc-api/T4891/X.hs b/testsuite/tests/ghc-regress/ghc-api/T4891/X.hs
new file mode 100644 (file)
index 0000000..aca63ee
--- /dev/null
@@ -0,0 +1,5 @@
+module X where
+
+data X =  Int :-> Int
+       |  Int :->. Int
+       |  Int :->.+ Int
diff --git a/testsuite/tests/ghc-regress/ghc-api/T4891/all.T b/testsuite/tests/ghc-regress/ghc-api/T4891/all.T
new file mode 100644 (file)
index 0000000..5217e53
--- /dev/null
@@ -0,0 +1,3 @@
+test('T4891', [skip_if_fast, extra_clean(['X.hi', 'X.o'])],
+              run_command,
+              ['$MAKE -s --no-print-directory T4891'])