{"record":{"id":"81f8ac970186236a","repo":"slint-ui/slint","slug":"parent-level-should-be-valid","errorCode":null,"errorMessage":"parent_level should be valid","messagePattern":"parent_level should be valid","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/compiler/llr/item_tree.rs","lineNumber":334,"sourceCode":"    /// Resolve the parent walk and the data/index/repeater references of a\n    /// model two-way binding. Returns `None` for regular property bindings.\n    pub fn resolve_model<'a, T>(\n        &self,\n        ctx: &EvaluationContext<'a, T>,\n    ) -> Option<ResolvedModelTwoWayBinding<'a>> {\n        let index_prop = self.is_model?;\n        let MemberReference::Relative { parent_level, local_reference } = &self.prop2 else {\n            unreachable!(\"model two-way binding's prop2 is always a Relative reference\")\n        };\n        debug_assert!(local_reference.sub_component_path.is_empty());\n        let LocalMemberIndex::Property(data_prop) = local_reference.reference else {\n            unreachable!(\"model two-way binding's prop2 always references a property\")\n        };\n        let super::EvaluationScope::SubComponent(mut sc, mut par) = ctx.current_scope else {\n            unreachable!(\"model two-way binding cannot be in a global\")\n        };\n        for _ in 0..*parent_level {\n            let x = par.expect(\"parent_level should be valid\");\n            par = x.parent;\n            sc = x.sub_component;\n        }\n        let par = par.expect(\"repeated item_tree must have a parent\");\n        let data_prop_ty = &ctx.compilation_unit.sub_components[sc].properties[data_prop].ty;\n        Some(ResolvedModelTwoWayBinding {\n            parent_level: *parent_level,\n            body_sub_component: sc,\n            data_prop,\n            data_prop_ty,\n            index_prop,\n            parent_sub_component: par.sub_component,\n            repeater_index: par.repeater_index.expect(\"repeated parent has a repeater_index\"),\n        })\n    }\n}\n\n#[derive(Debug, Default, Clone)]","sourceCodeStart":316,"sourceCodeEnd":352,"githubUrl":"https://github.com/slint-ui/slint/blob/3a7e700487dc74d404cad0726378053ab763d4e0/internal/compiler/llr/item_tree.rs#L316-L352","documentation":"`resolve_model` walks `parent_level` hops up the sub-component parent chain of a repeated element's two-way model binding. The panic means the chain ended (par became None) before consuming all requested hops.","triggerScenarios":"A `for`-loop's model declared a two-way binding whose `parent_level` exceeds the actual nesting depth of the repeated item's sub-component chain.","commonSituations":"Compiler passes computing parent levels for model two-way bindings after refactoring repeaters; user code with invalid deep parent references inside `for` loops.","solutions":["Correct the parent_level computation in the pass that resolves model two-way bindings","Reject over-deep parent references in an earlier validation pass with a proper diagnostic","Reduce the .slint input that triggers it and file a compiler bug"],"exampleFix":"// before\nfor _ in 0..*parent_level {\n    let x = par.expect(\"parent_level should be valid\");\n// after\nfor _ in 0..*parent_level {\n    let Some(x) = par else {\n        return None; // or emit a compile error: parent_level exceeds nesting depth\n    };","handlingStrategy":"validation","validationCode":"if *parent_level > parent_chain_len(ctx.current_scope) { return None; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Recompute parent_level whenever repeater structure changes in the compiler","Validate two-way model bindings' parent levels before lowering"],"tags":["rust","compiler","panic","repeater","model"],"backgroundTag":"internal-invariant-violation","analyzedSha":"3a7e700487dc74d404cad0726378053ab763d4e0","analyzedAt":"2026-09-16T01:37:20.251Z","contentChangedAt":"2026-09-16T01:37:20.251Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}