diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
index 5e53ecbc308f48361cb36f38307142a93bf4f2da_bWVyY3VyaWFsL2RpcnN0YXRlLnB5..0b00998e336a6c90abd5d147d4328c93c25f456f_bWVyY3VyaWFsL2RpcnN0YXRlLnB5 100644
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -1247,6 +1247,7 @@
             matchmod.alwaysmatcher,
             matchmod.exactmatcher,
             matchmod.includematcher,
+            matchmod.intersectionmatcher,
             matchmod.unionmatcher,
         )
 
diff --git a/rust/hg-cpython/src/dirstate/status.rs b/rust/hg-cpython/src/dirstate/status.rs
index 5e53ecbc308f48361cb36f38307142a93bf4f2da_cnVzdC9oZy1jcHl0aG9uL3NyYy9kaXJzdGF0ZS9zdGF0dXMucnM=..0b00998e336a6c90abd5d147d4328c93c25f456f_cnVzdC9oZy1jcHl0aG9uL3NyYy9kaXJzdGF0ZS9zdGF0dXMucnM= 100644
--- a/rust/hg-cpython/src/dirstate/status.rs
+++ b/rust/hg-cpython/src/dirstate/status.rs
@@ -15,7 +15,7 @@
     PyResult, PyTuple, Python, PythonObject, ToPyObject,
 };
 use hg::dirstate::status::StatusPath;
-use hg::matchers::{Matcher, UnionMatcher};
+use hg::matchers::{Matcher, UnionMatcher, IntersectionMatcher};
 use hg::{
     matchers::{AlwaysMatcher, FileMatcher, IncludeMatcher},
     parse_pattern_syntax,
@@ -226,6 +226,12 @@
 
             Ok(Box::new(UnionMatcher::new(matchers?)))
         }
+        "intersectionmatcher" => {
+            let m1 = extract_matcher(py, matcher.getattr(py, "_m1")?)?;
+            let m2 = extract_matcher(py, matcher.getattr(py, "_m2")?)?;
+
+            Ok(Box::new(IntersectionMatcher::new(m1, m2)))
+        }
         e => Err(PyErr::new::<FallbackError, _>(
             py,
             format!("Unsupported matcher {}", e),