From 6be20d57821cfca1adef9616332535fb5a9649cb Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 1 Jul 2024 18:04:51 +0200 Subject: [PATCH 1/2] Prevent jinja macros to move variables --- rinja_derive/src/generator.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rinja_derive/src/generator.rs b/rinja_derive/src/generator.rs index e63cb5c9..30563307 100644 --- a/rinja_derive/src/generator.rs +++ b/rinja_derive/src/generator.rs @@ -687,6 +687,9 @@ impl<'a> Generator<'a> { names.write(arg); values.write("("); + if !is_copyable(expr) { + values.write("&"); + } values.write(self.visit_expr_root(ctx, expr)?); values.write(")"); self.locals.insert_with_default(Cow::Borrowed(arg)); From 62bbece0aa39a500b911515debd4f53acd3a3e66 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 1 Jul 2024 18:05:06 +0200 Subject: [PATCH 2/2] Add regression test to prevent moving variables --- testing/tests/calls.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/testing/tests/calls.rs b/testing/tests/calls.rs index 3de335d0..5a2ae0bb 100644 --- a/testing/tests/calls.rs +++ b/testing/tests/calls.rs @@ -99,3 +99,31 @@ fn test_double_attr_arg() { let t = DoubleAttrArg { x: (10,) }; assert_eq!(t.render().unwrap(), "156"); } + +// Ensures that fields are not moved when calling a jinja macro. +#[derive(Template)] +#[template( + source = " +{%- macro package_navigation(title, show) -%} +{%- if show -%} +{{title}} +{%- else -%} +no show +{%- endif -%} +{%- endmacro -%} + +{%- call package_navigation(title=title, show=true) -%} +", + ext = "html" +)] +struct DoNotMoveFields { + title: String, +} + +#[test] +fn test_do_not_move_fields() { + let x = DoNotMoveFields { + title: "a".to_string(), + }; + assert_eq!(x.render().unwrap(), "a"); +}