Issue #28086: Single var-positional argument of tuple subtype was passed
unscathed to the C-defined function.  Now it is converted to exact tuple.
diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py
index 5750bfa..8a194aa 100644
--- a/Lib/test/test_getargs2.py
+++ b/Lib/test/test_getargs2.py
@@ -471,7 +471,7 @@
 
         ret = get_args(*TupleSubclass([1, 2]))
         self.assertEqual(ret, (1, 2))
-        self.assertIsInstance(ret, tuple)
+        self.assertIs(type(ret), tuple)
 
         ret = get_args()
         self.assertIn(ret, ((), None))
diff --git a/Misc/NEWS b/Misc/NEWS
index aca0ba0..2f531a8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #28086: Single var-positional argument of tuple subtype was passed
+  unscathed to the C-defined function.  Now it is converted to exact tuple.
+
 - Issue #28214: Now __set_name__ is looked up on the class instead of the
   instance.
 
diff --git a/Python/ceval.c b/Python/ceval.c
index ff36d36..39cf330 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3310,7 +3310,7 @@
             }
             callargs = POP();
             func = TOP();
-            if (!PyTuple_Check(callargs)) {
+            if (!PyTuple_CheckExact(callargs)) {
                 if (Py_TYPE(callargs)->tp_iter == NULL &&
                         !PySequence_Check(callargs)) {
                     PyErr_Format(PyExc_TypeError,
@@ -3327,7 +3327,7 @@
                     goto error;
                 }
             }
-            assert(PyTuple_Check(callargs));
+            assert(PyTuple_CheckExact(callargs));
 
             result = do_call_core(func, callargs, kwargs);
             Py_DECREF(func);