diff --git a/src/multipattern.rs b/src/multipattern.rs index 4fe61212..4a13a170 100644 --- a/src/multipattern.rs +++ b/src/multipattern.rs @@ -107,6 +107,17 @@ impl> Searcher for MultiPattern { eclass: Id, limit: usize, ) -> Option> { + match self.asts.as_slice() { + [] => panic!("empty multipattern"), + [(_var, pat), ..] => { + if let [ENodeOrVar::Var(_)] = pat.as_ref() { + panic!( + "Bare cannot be first pattern variable in multipattern: {:?}", + self.asts + ) + } + } + } let substs = self.program.run_with_limit(egraph, eclass, limit); if substs.is_empty() { None @@ -291,4 +302,16 @@ mod tests { assert_ne!(runner.egraph.find(y1), runner.egraph.find(z1)); assert_ne!(runner.egraph.find(x1), runner.egraph.find(z1)); } + + #[test] + fn bare_var() { + let mut g = EGraph::default(); + + g.add_expr(&"(f a)".parse().unwrap()); + g.rebuild(); + + let p: MultiPattern = "?a = (f ?x), ?y = ?y".parse().unwrap(); + let rw = multi_rewrite!("r"; { p } => "?a = (g ?x ?y)"); + rw.run(&mut g); + } }