diff --git a/tests/run/test_call.py b/tests/run/test_call.py
new file mode 100644
index 0000000000000000000000000000000000000000..3433003fe1859ee4a87dd6c999f3aa741ce6cf7c
--- /dev/null
+++ b/tests/run/test_call.py
@@ -0,0 +1,127 @@
+import unittest
+
+# The test cases here cover several paths through the function calling
+# code.  They depend on the METH_XXX flag that is used to define a C
+# function, which can't be verified from Python.  If the METH_XXX decl
+# for a C function changes, these tests may not cover the right paths.
+
+class CFunctionCalls(unittest.TestCase):
+
+    def test_varargs0(self):
+        self.assertRaises(TypeError, {}.__contains__)
+
+    def test_varargs1(self):
+        {}.__contains__(0)
+
+    def test_varargs2(self):
+        self.assertRaises(TypeError, {}.__contains__, 0, 1)
+
+    def test_varargs0_ext(self):
+        try:
+            {}.__contains__(*())
+        except TypeError:
+            pass
+
+    def test_varargs1_ext(self):
+        {}.__contains__(*(0,))
+
+    def test_varargs2_ext(self):
+        try:
+            {}.__contains__(*(1, 2))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_varargs0_kw(self):
+        self.assertRaises(TypeError, {}.__contains__, x=2)
+
+    def test_varargs1_kw(self):
+        self.assertRaises(TypeError, {}.__contains__, x=2)
+
+    def test_varargs2_kw(self):
+        self.assertRaises(TypeError, {}.__contains__, x=2, y=2)
+
+    def test_oldargs0_0(self):
+        {}.keys()
+
+    def test_oldargs0_1(self):
+        self.assertRaises(TypeError, {}.keys, 0)
+
+    def test_oldargs0_2(self):
+        self.assertRaises(TypeError, {}.keys, 0, 1)
+
+    def test_oldargs0_0_ext(self):
+        {}.keys(*())
+
+    def test_oldargs0_1_ext(self):
+        try:
+            {}.keys(*(0,))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs0_2_ext(self):
+        try:
+            {}.keys(*(1, 2))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    ### Cython makes this a compile time error
+    # def test_oldargs0_0_kw(self):
+    #     try:
+    #         {}.keys(x=2)
+    #     except TypeError:
+    #         pass
+    #     else:
+    #         raise RuntimeError
+
+    def test_oldargs0_1_kw(self):
+        self.assertRaises(TypeError, {}.keys, x=2)
+
+    def test_oldargs0_2_kw(self):
+        self.assertRaises(TypeError, {}.keys, x=2, y=2)
+
+    def test_oldargs1_0(self):
+        self.assertRaises(TypeError, [].count)
+
+    def test_oldargs1_1(self):
+        [].count(1)
+
+    def test_oldargs1_2(self):
+        self.assertRaises(TypeError, [].count, 1, 2)
+
+    def test_oldargs1_0_ext(self):
+        try:
+            [].count(*())
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs1_1_ext(self):
+        [].count(*(1,))
+
+    def test_oldargs1_2_ext(self):
+        try:
+            [].count(*(1, 2))
+        except TypeError:
+            pass
+        else:
+            raise RuntimeError
+
+    def test_oldargs1_0_kw(self):
+        self.assertRaises(TypeError, [].count, x=2)
+
+    def test_oldargs1_1_kw(self):
+        self.assertRaises(TypeError, [].count, {}, x=2)
+
+    def test_oldargs1_2_kw(self):
+        self.assertRaises(TypeError, [].count, x=2, y=2)
+
+
+if __name__ == "__main__":
+    unittest.main()