Browse Source

Merge pull request #762 from irevoire/fix-where-clause-leak

Mads M. Jensen 1 week ago
parent
commit
d8c77c9b0a
2 changed files with 18 additions and 4 deletions
  1. 2 2
      numbat/src/prefix_transformer.rs
  2. 16 2
      numbat/tests/interpreter.rs

+ 2 - 2
numbat/src/prefix_transformer.rs

@@ -197,11 +197,11 @@ impl Transformer {
                 }
 
                 if let Some(expr) = body {
-                    self.transform_expression(expr);
+                    fn_body_transformer.transform_expression(expr);
                 }
 
                 for def in local_variables {
-                    self.transform_define_variable(def)?;
+                    fn_body_transformer.transform_define_variable(def)?;
                 }
             }
             Statement::DefineDimension(_, name, _) => {

+ 16 - 2
numbat/tests/interpreter.rs

@@ -12,14 +12,14 @@ use numbat::{pretty_print::PrettyPrint, Context, InterpreterResult};
 #[track_caller]
 fn expect_output_with_context(ctx: &mut Context, code: &str, expected_output: impl AsRef<str>) {
     let expected_output = expected_output.as_ref();
-    println!("Expecting output '{expected_output}' for code '{code}'");
+    println!("Expecting output {expected_output:?} for code\n{code}");
     if let InterpreterResult::Value(val) = ctx.interpret(code, CodeSource::Internal).unwrap().1 {
         let fmt = PlainTextFormatter {};
 
         let actual_output = fmt.format(&val.pretty_print(), false);
         assert_eq!(actual_output.trim(), expected_output);
     } else {
-        panic!();
+        panic!("Did not receive an interpreter result. Did you try to print the values?");
     }
 }
 
@@ -756,6 +756,20 @@ fn test_overwrite_inner_function() {
     );
 }
 
+#[test]
+fn test_676_where_clause_does_not_leak() {
+    // https://github.com/sharkdp/numbat/issues/676
+    expect_output(
+        "
+        fn foo(x: Scalar) -> Scalar = x + something where something = 1
+        unit something
+
+        1 something
+        ",
+        "1 something",
+    );
+}
+
 #[test]
 fn test_override_constants() {
     expect_output("let x = 1\nlet x = 2\nx", "2");