From c664fb6f703ccb16a2e99b9421472fd59bab7c65 Mon Sep 17 00:00:00 2001 From: Chris Fallin Date: Wed, 24 Aug 2022 15:07:29 -0700 Subject: [PATCH] Update ISLE error message: unknown term in expr, not pattern. (#4775) This was likely a copy-paste from the `ast::Pattern` case, but here it is checking a term name in `ast::Expr` and so should say "... in expression", not "... in pattern". --- .../isle/isle/isle_examples/fail/extra_parens.isle | 6 ++++++ cranelift/isle/isle/src/sema.rs | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 cranelift/isle/isle/isle_examples/fail/extra_parens.isle diff --git a/cranelift/isle/isle/isle_examples/fail/extra_parens.isle b/cranelift/isle/isle/isle_examples/fail/extra_parens.isle new file mode 100644 index 0000000000..06c05c820f --- /dev/null +++ b/cranelift/isle/isle/isle_examples/fail/extra_parens.isle @@ -0,0 +1,6 @@ +(type u32 (primitive u32)) + +(decl f (u32) u32) +;; Should get an error about `x` not being a term, with a suggestion that it is +;; a bound var instead. +(rule (f x) (x)) diff --git a/cranelift/isle/isle/src/sema.rs b/cranelift/isle/isle/src/sema.rs index 6483ef468b..3da2441ed4 100644 --- a/cranelift/isle/isle/src/sema.rs +++ b/cranelift/isle/isle/src/sema.rs @@ -1782,7 +1782,19 @@ impl TermEnv { let tid = match self.term_map.get(&name) { Some(t) => t, None => { - tyenv.report_error(pos, format!("Unknown term in pattern: '{}'", sym.0)); + // Maybe this was actually a variable binding and the user has placed + // parens around it by mistake? (See #4775.) + if bindings.vars.iter().any(|b| b.name == name) { + tyenv.report_error( + pos, + format!( + "Unknown term in expression: '{}'. Variable binding under this name exists; try removing the parens?", sym.0)); + } else { + tyenv.report_error( + pos, + format!("Unknown term in expression: '{}'", sym.0), + ); + } return None; } };