static inline CC_HINT(always_inline)
int tmpl_xlat_resolve(tmpl_t *vpt, tmpl_res_rules_t const *tr_rules)
{
- if (xlat_resolve(vpt->data.xlat.ex, &vpt->data.xlat.flags,
+ fr_assert(xlat_needs_resolving(vpt->data.xlat.ex) == vpt->data.xlat.flags.needs_resolving);
+
+ if (xlat_resolve(vpt->data.xlat.ex, NULL,
&(xlat_res_rules_t){
.tr_rules = tr_rules,
.allow_unresolved = false
}) < 0) return -1;
+ fr_assert(!xlat_needs_resolving(vpt->data.xlat.ex));
+ vpt->data.xlat.flags.needs_resolving = false;
+
RESOLVED_SET(&vpt->type);
TMPL_VERIFY(vpt);
static xlat_res_rules_t xr_default;
xlat_flags_t our_flags;
- if (!flags->needs_resolving) return 0; /* Already done */
+ if (!head->flags.needs_resolving && flags && !flags->needs_resolving) return 0; /* Already done */
if (!xr_rules) xr_rules = &xr_default;
- our_flags = *flags;
+ our_flags = head->flags;
our_flags.needs_resolving = false; /* We flip this if not all resolutions are successful */
xlat_exp_foreach(head, node) {
xlat_flags_merge(&our_flags, &node->flags);
}
- *flags = our_flags; /* Update parent flags - not merge, replacement */
+ head->flags = our_flags;
+ if (flags) *flags = our_flags; /* Update parent flags - not merge, replacement */
return 0;
}