diff --git a/mercurial/revset.py b/mercurial/revset.py
index b6245c2470a924cf73dc74fe5a6499b7a48c8caa_bWVyY3VyaWFsL3JldnNldC5weQ==..a5f7f1e9340e2cb19882fc64d7370a61124fe63f_bWVyY3VyaWFsL3JldnNldC5weQ== 100644
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -202,6 +202,6 @@
     return [r for r in subset if r == l]
 
 def p1(repo, subset, x):
-    """``p1(set)``
-    First parent of changesets in set.
+    """``p1([set])``
+    First parent of changesets in set, or the working directory.
     """
@@ -207,4 +207,7 @@
     """
+    if x is None:
+        return [repo[x].parents()[0].rev()]
+
     ps = set()
     cl = repo.changelog
     for r in getset(repo, range(len(repo)), x):
@@ -212,6 +215,6 @@
     return [r for r in subset if r in ps]
 
 def p2(repo, subset, x):
-    """``p2(set)``
-    Second parent of changesets in set.
+    """``p2([set])``
+    Second parent of changesets in set, or the working directory.
     """
@@ -217,4 +220,11 @@
     """
+    if x is None:
+        ps = repo[x].parents()
+        try:
+            return [ps[1].rev()]
+        except IndexError:
+            return []
+
     ps = set()
     cl = repo.changelog
     for r in getset(repo, range(len(repo)), x):
diff --git a/tests/test-revset-dirstate-parents.t b/tests/test-revset-dirstate-parents.t
new file mode 100644
index 0000000000000000000000000000000000000000..a5f7f1e9340e2cb19882fc64d7370a61124fe63f_dGVzdHMvdGVzdC1yZXZzZXQtZGlyc3RhdGUtcGFyZW50cy50
--- /dev/null
+++ b/tests/test-revset-dirstate-parents.t
@@ -0,0 +1,42 @@
+  $ HGENCODING=utf-8
+  $ export HGENCODING
+
+  $ try() {
+  >   hg debugrevspec --debug $@
+  > }
+
+  $ log() {
+  >   hg log --template '{rev}\n' -r "$1"
+  > }
+
+  $ hg init repo
+  $ cd repo
+
+  $ try 'p1()'
+  ('func', ('symbol', 'p1'), None)
+  -1
+  $ try 'p2()'
+  ('func', ('symbol', 'p2'), None)
+
+null revision
+  $ log 'p1()'
+  $ log 'p2()'
+
+working dir with a single parent
+  $ echo a > a
+  $ hg ci -Aqm0
+  $ log 'p1()'
+  0
+  $ log 'p2()'
+
+merge in progress
+  $ echo b > b
+  $ hg ci -Aqm1
+  $ hg up -q 0
+  $ echo c > c
+  $ hg ci -Aqm2
+  $ hg merge -q
+  $ log 'p1()'
+  2
+  $ log 'p2()'
+  1