Issue #5330: C functions called with keyword arguments were not reported by
the various profiling modules (profile, cProfile). Patch by Hagen Fürstenau.
diff --git a/Lib/test/test_cprofile.py b/Lib/test/test_cprofile.py
index 13c1060..831895c 100755
--- a/Lib/test/test_cprofile.py
+++ b/Lib/test/test_cprofile.py
@@ -9,6 +9,7 @@
 
 class CProfileTest(ProfileTest):
     profilerclass = cProfile.Profile
+    expected_list_sort_output = "{method 'sort' of 'list' objects}"
 
     # Issue 3895.
     def test_bad_counter_during_dealloc(self):
diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py
index 0bd2530..421aa1b 100755
--- a/Lib/test/test_profile.py
+++ b/Lib/test/test_profile.py
@@ -16,6 +16,7 @@
     profilerclass = profile.Profile
     methodnames = ['print_stats', 'print_callers', 'print_callees']
     expected_output = {}
+    expected_list_sort_output = ':0(sort)'
 
     @classmethod
     def do_profiling(cls):
@@ -40,6 +41,25 @@
                              "Stats.%s output for %s doesn't fit expectation!" %
                              (method, self.profilerclass.__name__))
 
+    def test_calling_conventions(self):
+        # Issue #5330: profile and cProfile wouldn't report C functions called
+        # with keyword arguments. We test all calling conventions.
+        prof = self.profilerclass(timer, 0.001)
+        stmts = [
+            "[].sort()",
+            "[].sort(reverse=True)",
+            "[].sort(*(None, None, True))",
+            "[].sort(**dict(reverse=True))",
+        ]
+        for stmt in stmts:
+            s = StringIO()
+            prof.runctx(stmt, globals(), locals())
+            stats = pstats.Stats(prof, stream=s)
+            stats.print_stats()
+            res = s.getvalue()
+            self.assertTrue(self.expected_list_sort_output in res,
+                "Profiling {0!r} didn't report list.sort:\n{1}".format(stmt, res))
+
 
 def regenerate_expected_output(filename, cls):
     filename = filename.rstrip('co')