diff --git a/rinja_derive/src/generator.rs b/rinja_derive/src/generator.rs index 201b8640d..954753a94 100644 --- a/rinja_derive/src/generator.rs +++ b/rinja_derive/src/generator.rs @@ -2732,7 +2732,7 @@ fn is_copyable_within_op(expr: &Expr<'_>, within_op: bool) -> bool { // The result of a call likely doesn't need to be borrowed, // as in that case the call is more likely to return a // reference in the first place then. - Expr::Call(..) | Expr::Path(..) | Expr::Filter(..) => true, + Expr::Call(..) | Expr::Path(..) | Expr::Filter(..) | Expr::RustMacro(..) => true, // If the `expr` is within a `Unary` or `BinOp` then // an assumption can be made that the operand is copy. // If not, then the value is moved and adding `.clone()` diff --git a/testing/tests/let.rs b/testing/tests/let.rs new file mode 100644 index 000000000..282720992 --- /dev/null +++ b/testing/tests/let.rs @@ -0,0 +1,23 @@ +use rinja::Template; + +#[derive(Template)] +#[template( + source = r#"{%- let x -%} +{%- if y -%} + {%- let x = String::new() %} +{%- else -%} + {%- let x = format!("blob") %} +{%- endif -%} +{{ x }}"#, + ext = "html" +)] +struct A { + y: bool, +} + +// This test ensures that rust macro calls in `let`/`set` statements are not prepended with `&`. +#[test] +fn let_macro() { + let template = A { y: false }; + assert_eq!(template.render().unwrap(), "blob") +}