@@ -39,6 +39,7 @@ dioxus = { workspace = true }
pretty_assertions = "1.3.0"
rand = "0.8.5"
dioxus-ssr = { workspace = true }
+trybuild = "1.0"
[features]
default = []
@@ -0,0 +1,32 @@
+use dioxus::prelude::*;
+
+fn main() {}
+fn app(cx: Scope) -> Element {
+ let count: &RefCell<Vec<Element>> = cx.use_hook(|| RefCell::new(Vec::new()));
+ render! {
+ unsafe_child_component {
+ borrowed: count
+ }
+}
+#[derive(Props)]
+struct Testing<'a> {
+ borrowed: &'a RefCell<Vec<Element<'a>>>,
+fn unsafe_child_component<'a>(cx: Scope<'a, Testing<'a>>) -> Element<'a> {
+ let Testing { borrowed } = cx.props;
+ let borrowed_temporary_data =
+ cx.use_hook(|| String::from("This data is only valid for the lifetime of the child"));
+ borrowed
+ .borrow_mut()
+ .push(render! {"{borrowed_temporary_data}"});
+ cx.render(rsx! {
+ div { "Hello, world!" }
+ })
@@ -0,0 +1,20 @@
+error[E0521]: borrowed data escapes outside of function
+ --> compile_tests/props_safety.rs:8:5
+ |
+5 | fn app(cx: Scope) -> Element {
+ | --
+ | |
+ | `cx` is a reference that is only valid in the function body
+ | has type `&'1 Scoped<'1>`
+...
+8 | / render! {
+9 | | unsafe_child_component {
+10 | | borrowed: count
+11 | | }
+12 | | }
+ | | ^
+ | | |
+ | |_____`cx` escapes the function body here
+ | argument requires that `'1` must outlive `'static`
+ = note: this error originates in the macro `render` (in Nightly builds, run with -Z macro-backtrace for more info)
@@ -73,3 +73,9 @@ impl EmptyBuilder {
pub fn fc_to_builder<'a, T: Properties + 'a>(_: fn(Scope<'a, T>) -> Element<'a>) -> T::Builder {
T::builder()
}
+#[test]
+fn unsafe_props_fail() {
+ let t = trybuild::TestCases::new();
+ t.compile_fail("compile_tests/props_safety.rs");