diff --git a/cranelift/isle/isle/isle_examples/fail/multi_prio.isle b/cranelift/isle/isle/isle_examples/fail/multi_prio.isle new file mode 100644 index 0000000000..30ce9c7a5f --- /dev/null +++ b/cranelift/isle/isle/isle_examples/fail/multi_prio.isle @@ -0,0 +1,4 @@ +(type u32 (primitive u32)) + +(decl multi A (u32) u32) +(rule 0 (A x) x) diff --git a/cranelift/isle/isle/isle_examples/link/multi_extractor.isle b/cranelift/isle/isle/isle_examples/link/multi_extractor.isle index 5878dd0652..2630d86826 100644 --- a/cranelift/isle/isle/isle_examples/link/multi_extractor.isle +++ b/cranelift/isle/isle/isle_examples/link/multi_extractor.isle @@ -7,7 +7,7 @@ (decl multi Rule (u32) u32) -(rule 1 (Rule (E1 a idx)) +(rule (Rule (E1 a idx)) (if-let (A.B) a) idx) (rule (Rule _) diff --git a/cranelift/isle/isle/src/sema.rs b/cranelift/isle/isle/src/sema.rs index 95481f1067..ba9906f853 100644 --- a/cranelift/isle/isle/src/sema.rs +++ b/cranelift/isle/isle/src/sema.rs @@ -1744,6 +1744,18 @@ impl TermEnv { bindings.exit_scope(); + let prio = if let Some(prio) = rule.prio { + if flags.multi { + tyenv.report_error( + pos, + "Cannot set rule priorities in multi-terms".to_string(), + ); + } + prio + } else { + 0 + }; + let rid = RuleId(self.rules.len()); self.rules.push(Rule { id: rid, @@ -1752,7 +1764,7 @@ impl TermEnv { iflets, rhs, vars: bindings.seen, - prio: rule.prio.unwrap_or(0), + prio, pos, }); } diff --git a/cranelift/isle/isle/tests/run_tests.rs b/cranelift/isle/isle/tests/run_tests.rs index 9adf51c32d..1b347b9454 100644 --- a/cranelift/isle/isle/tests/run_tests.rs +++ b/cranelift/isle/isle/tests/run_tests.rs @@ -15,8 +15,12 @@ pub fn run_pass(filename: &str) { } pub fn run_fail(filename: &str) { - if build(filename).is_ok() { - panic!("test {} passed unexpectedly", filename); + match build(filename) { + Ok(_) => panic!("test {} passed unexpectedly", filename), + Err(err) => { + // Log the actual errors for use with `cargo test -- --nocapture` + println!("failed, as expected:\n{:?}", err); + } } }