PyPy 3.7 doesn't act exactly like CPython 3.7
diff --git a/coverage/env.py b/coverage/env.py
index b5da3b4..80153ec 100644
--- a/coverage/env.py
+++ b/coverage/env.py
@@ -66,7 +66,7 @@
     # used to be an empty string (meaning the current directory). It changed
     # to be the actual path to the current directory, so that os.chdir wouldn't
     # affect the outcome.
-    actual_syspath0_dash_m = (PYVERSION >= (3, 7, 0, 'beta', 3))
+    actual_syspath0_dash_m = (not PYPY) and (PYVERSION >= (3, 7, 0, 'beta', 3))
 
     # When a break/continue/return statement in a try block jumps to a finally
     # block, does the finally block do the break/continue/return (pre-3.8), or
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 03bf25d..0e6a085 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -214,7 +214,7 @@
             expected_arcs = set(arcz_to_arcs(".1 14 48 8.  .2 2.  -8A A-8"))
             expected_exits = {1: 1, 2: 1, 4: 1, 8: 1, 10: 1}
 
-        if env.PYVERSION >= (3, 7, 0, 'beta', 5):
+        if (not env.PYPY) and (env.PYVERSION >= (3, 7, 0, 'beta', 5)):
             # 3.7 changed how functions with only docstrings are numbered.
             expected_arcs.update(set(arcz_to_arcs("-46 6-4")))
             expected_exits.update({6: 1})
diff --git a/tests/test_process.py b/tests/test_process.py
index 25f1fcc..bf0e1ac 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -743,7 +743,7 @@
         self.assertGreater(line_counts(data)['os.py'], 50)
 
     @xfail(
-        env.PYPY3 and env.PYPYVERSION >= (7, 1, 1),
+        env.PYPY3 and ((7, 1, 1) <= env.PYPYVERSION < (7, 3)),
         "https://bitbucket.org/pypy/pypy/issues/3074"
     )
     def test_lang_c(self):