diff --git a/mercurial/revset.py b/mercurial/revset.py
index 9a49feb408f3863cc0f537c2afe2e2005467aafb_bWVyY3VyaWFsL3JldnNldC5weQ==..ed7b674824a3e1f0fdbdc815bbf87b82999c3d73_bWVyY3VyaWFsL3JldnNldC5weQ== 100644
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -464,6 +464,4 @@
     return subset & bundlerevs
 
 def checkstatus(repo, subset, pat, field):
-    m = None
-    s = []
     hasset = matchmod.patkind(pat) == 'set'
@@ -469,10 +467,12 @@
     hasset = matchmod.patkind(pat) == 'set'
-    fname = None
-    for r in subset:
-        c = repo[r]
+
+    def matches(x):
+        m = None
+        fname = None
+        c = repo[x]
         if not m or hasset:
             m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
             if not m.anypats() and len(m.files()) == 1:
                 fname = m.files()[0]
         if fname is not None:
             if fname not in c.files():
@@ -473,12 +473,12 @@
         if not m or hasset:
             m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
             if not m.anypats() and len(m.files()) == 1:
                 fname = m.files()[0]
         if fname is not None:
             if fname not in c.files():
-                continue
+                return False
         else:
             for f in c.files():
                 if m(f):
                     break
             else:
@@ -480,9 +480,9 @@
         else:
             for f in c.files():
                 if m(f):
                     break
             else:
-                continue
+                return False
         files = repo.status(c.p1().node(), c.node())[field]
         if fname is not None:
             if fname in files:
@@ -486,7 +486,7 @@
         files = repo.status(c.p1().node(), c.node())[field]
         if fname is not None:
             if fname in files:
-                s.append(r)
+                return True
         else:
             for f in files:
                 if m(f):
@@ -490,9 +490,9 @@
         else:
             for f in files:
                 if m(f):
-                    s.append(r)
-                    break
-    return baseset(s)
+                    return True
+
+    return lazyset(subset, matches)
 
 def _children(repo, narrow, parentset):
     cs = set()