diff --git a/ghc/tests/lib/should_run/Makefile b/ghc/tests/lib/should_run/Makefile
index ca76c0fa2bc21f20144e3fa7759317db26332dc3..7ba97000a7d01d2f40ec112efd0b3767e6a93f77 100644
--- a/ghc/tests/lib/should_run/Makefile
+++ b/ghc/tests/lib/should_run/Makefile
@@ -1,5 +1,5 @@
 #-----------------------------------------------------------------------------
-# $Id: Makefile,v 1.5 1998/08/12 11:05:14 simonm Exp $
+# $Id: Makefile,v 1.6 1998/08/14 13:02:00 simonm Exp $
 
 TOP = ../..
 include $(TOP)/mk/boilerplate.mk
@@ -9,6 +9,7 @@ SRC_HC_OPTS += -dcore-lint
 
 packedstring001_HC_OPTS = -syslib misc
 exceptions001_HC_OPTS   = -fglasgow-exts
+stableptr002_HC_OPTS   = -fglasgow-exts
 
 stableptr001_RUNTEST_OPTS = +RTS -K4m
 dynamic001_HC_OPTS = -syslib exts
diff --git a/ghc/tests/lib/should_run/stableptr002.hs b/ghc/tests/lib/should_run/stableptr002.hs
new file mode 100644
index 0000000000000000000000000000000000000000..5d436ad4709d6da763f18d1a05a0591d65bf8581
--- /dev/null
+++ b/ghc/tests/lib/should_run/stableptr002.hs
@@ -0,0 +1,24 @@
+module Main where
+
+import PrelForeign
+
+-- Testing callbacks: the initial haskell thread calls out to C with
+-- the address of a Haskell callback.  The C function runs the callback
+-- (in a new thread) and returns.
+
+-- The stable pointer operation 'performIO' does the job of calling
+-- the callback for us.
+
+-- for an extra stressful test, the callback also does an explicit GC
+-- to make sure that the original thread saved away its state
+-- properly.
+
+main = do
+  io <- makeStablePtr hello
+  _ccall_GC_ performIO io
+  putStr "finished"
+
+hello :: IO ()
+hello  = do
+  _ccall_GC_ performGC
+  putStr "hello world!\n"
diff --git a/ghc/tests/lib/should_run/stableptr002.stdout b/ghc/tests/lib/should_run/stableptr002.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..4545b6b6fc67e65492ecd234cb735de76ec51d23
--- /dev/null
+++ b/ghc/tests/lib/should_run/stableptr002.stdout
@@ -0,0 +1,2 @@
+hello world!
+finished
\ No newline at end of file