From 0e082e8d6f623429151641b509e54f4ed185f233 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 30 Sep 2021 12:28:22 -0700 Subject: [PATCH] Make sure that every `decl` has a definition at the end of type checking --- cranelift/isle/isle/src/sema.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cranelift/isle/isle/src/sema.rs b/cranelift/isle/isle/src/sema.rs index b3d0a6f543..516560b5d1 100644 --- a/cranelift/isle/isle/src/sema.rs +++ b/cranelift/isle/isle/src/sema.rs @@ -269,6 +269,10 @@ impl Term { } } + fn is_declared(&self) -> bool { + matches!(self.kind, TermKind::Declared) + } + /// Is this term external? pub fn is_external(&self) -> bool { match &self.kind { @@ -680,6 +684,7 @@ impl TermEnv { env.collect_extractor_templates(tyenv, defs); tyenv.return_errors()?; env.collect_rules(tyenv, defs); + env.check_for_undefined_decls(tyenv, defs); tyenv.return_errors()?; Ok(env) @@ -1012,6 +1017,24 @@ impl TermEnv { } } + fn check_for_undefined_decls(&self, tyenv: &mut TypeEnv, defs: &ast::Defs) { + for def in &defs.defs { + if let ast::Def::Decl(decl) = def { + let sym = tyenv.intern_mut(&decl.term); + let term = self.term_map[&sym]; + if self.terms[term.index()].is_declared() { + tyenv.report_error( + decl.pos, + format!( + "no rules, extractor, or external definition for declaration '{}'", + decl.term.0 + ), + ); + } + } + } + } + fn translate_pattern( &self, tyenv: &mut TypeEnv,