From 44bc072b04dd358e24d595cbe1533c0d1b6e9296 Mon Sep 17 00:00:00 2001 From: John Doty Date: Mon, 15 Jan 2024 07:52:49 -0800 Subject: [PATCH] [fine] Test for function return type mismatch --- fine/build.rs | 5 +++++ fine/src/semantics.rs | 5 ----- fine/tests/example_tests.rs | 14 +++++++++++++- .../expression/errors/return_type_mismatch.fine | 5 +++++ 4 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 fine/tests/expression/errors/return_type_mismatch.fine diff --git a/fine/build.rs b/fine/build.rs index 2c73bc92..5994df62 100644 --- a/fine/build.rs +++ b/fine/build.rs @@ -87,6 +87,11 @@ fn generate_test_for_file(path: PathBuf) -> String { assertions.push(quote! { crate::assert_eval_ok(&_tree, &_lines, #expected); }); + } else if let Some(line) = line.strip_prefix("@check-error:") { + let expected = line.trim(); + assertions.push(quote! { + crate::assert_check_error(&_tree, &_lines, #expected); + }); } else if line.starts_with("@") { panic!("Test file {display_path} has unknown directive: {line}"); } diff --git a/fine/src/semantics.rs b/fine/src/semantics.rs index b14f754b..cde5954c 100644 --- a/fine/src/semantics.rs +++ b/fine/src/semantics.rs @@ -664,11 +664,6 @@ impl<'a> Semantics<'a> { // NOTE: These return `None` if they encounter some problem. let result = result.unwrap_or(Type::Error); - - if result.is_error() { - eprintln!("OH NO AN ERROR AT {}: {:?}", t.index(), tree); - } - self.types.borrow_mut()[t.index()] = Incremental::Complete(result.clone()); result } diff --git a/fine/tests/example_tests.rs b/fine/tests/example_tests.rs index c544f262..5c5230a2 100644 --- a/fine/tests/example_tests.rs +++ b/fine/tests/example_tests.rs @@ -259,7 +259,6 @@ fn assert_no_errors(tree: &SyntaxTree, lines: &Lines) { ); } -#[allow(dead_code)] fn assert_eval_ok(tree: &SyntaxTree, lines: &Lines, expected: &str) { let semantics = Semantics::new(tree, lines); @@ -284,4 +283,17 @@ fn assert_eval_ok(tree: &SyntaxTree, lines: &Lines, expected: &str) { } } +fn assert_check_error(tree: &SyntaxTree, lines: &Lines, expected: &str) { + let semantics = Semantics::new(tree, lines); + check(&semantics); + + let errors = semantics.snapshot_errors(); + semantic_assert!( + &semantics, + None, + errors.iter().any(|e| e.message == expected), + "Unable to find the expected error message '{expected}'" + ); +} + include!(concat!(env!("OUT_DIR"), "/generated_tests.rs")); diff --git a/fine/tests/expression/errors/return_type_mismatch.fine b/fine/tests/expression/errors/return_type_mismatch.fine new file mode 100644 index 00000000..26dfdca7 --- /dev/null +++ b/fine/tests/expression/errors/return_type_mismatch.fine @@ -0,0 +1,5 @@ +fun test() -> bool { + 32 +} + +// @check-error: the body of this function yields a value of type `f64`, but callers expect this function to produce a `bool` \ No newline at end of file