diff --git a/src/term/transform/definition_pruning.rs b/src/term/transform/definition_pruning.rs index 2644e0f8..a8a22c2d 100644 --- a/src/term/transform/definition_pruning.rs +++ b/src/term/transform/definition_pruning.rs @@ -38,6 +38,14 @@ impl Ctx<'_> { self.book.find_used_definitions(&def.rule().body, Used::Main, &mut used, adt_encoding); } + if let AdtEncoding::Scott = adt_encoding { + for (def_name, def) in &self.book.defs { + if !def.builtin && self.book.ctrs.get(def_name).is_some() { + used.insert(def_name.clone(), Used::Adt); + } + } + } + // Even if we don't prune all the defs, we need check what built-ins are accessible through user code if !prune_all { for (def_name, def) in &self.book.defs { diff --git a/tests/golden_tests.rs b/tests/golden_tests.rs index d94f3058..00f74f8d 100644 --- a/tests/golden_tests.rs +++ b/tests/golden_tests.rs @@ -451,3 +451,16 @@ fn examples() -> Result<(), Diagnostics> { Ok(()) } + +#[test] +fn scott_triggers_unused() { + run_golden_test_dir(function_name!(), &|code, path| { + let mut book = do_parse_book(code, path)?; + let mut opts = CompileOpts::default_strict(); + opts.adt_encoding = AdtEncoding::Scott; + let diagnostics_cfg = + DiagnosticsConfig { unused_definition: Severity::Error, ..DiagnosticsConfig::default_strict() }; + let res = compile_book(&mut book, opts, diagnostics_cfg, None)?; + Ok(format!("{}{}", res.diagnostics, res.core_book)) + }) +} diff --git a/tests/golden_tests/scott_triggers_unused/test.hvm b/tests/golden_tests/scott_triggers_unused/test.hvm new file mode 100644 index 00000000..631bae41 --- /dev/null +++ b/tests/golden_tests/scott_triggers_unused/test.hvm @@ -0,0 +1,13 @@ +// The test below should not trigger this warning: +// +// In definition 'f': +// Definition is unused. +// In definition 't': +// Definition is unused. +// +// This was happening because the prune algorithm was just collecting constructors +// by searching for tags. + +data bool = t | f + +main = @b match b { t: 0; f: 1} diff --git a/tests/snapshots/scott_triggers_unused__test.hvm.snap b/tests/snapshots/scott_triggers_unused__test.hvm.snap new file mode 100644 index 00000000..85b9c3f6 --- /dev/null +++ b/tests/snapshots/scott_triggers_unused__test.hvm.snap @@ -0,0 +1,9 @@ +--- +source: tests/golden_tests.rs +input_file: tests/golden_tests/scott_triggers_unused/test.hvm +--- +@f = (* (a a)) + +@main = ((#0 (#1 a)) a) + +@t = (a (* a))