diff --git a/Compiler/NFFrontEnd/NFBinding.mo b/Compiler/NFFrontEnd/NFBinding.mo index d4a7f57a95..8897712f31 100644 --- a/Compiler/NFFrontEnd/NFBinding.mo +++ b/Compiler/NFFrontEnd/NFBinding.mo @@ -80,6 +80,7 @@ uniontype Binding list parents; Boolean isEach; Boolean evaluated; + Boolean isFlattened; SourceInfo info; end TYPED_BINDING; @@ -193,6 +194,8 @@ public function setTypedExp input Expression exp; input output Binding binding; + protected + Type ty1, ty2; algorithm () := match binding case TYPED_BINDING() @@ -278,7 +281,7 @@ public ty := Expression.typeOf(exp); var := Expression.variability(exp); then - TYPED_BINDING(exp, ty, var, fieldBinding.parents, fieldBinding.isEach, fieldBinding.evaluated, fieldBinding.info); + TYPED_BINDING(exp, ty, var, fieldBinding.parents, fieldBinding.isEach, fieldBinding.evaluated, fieldBinding.isFlattened, fieldBinding.info); case FLAT_BINDING() algorithm diff --git a/Compiler/NFFrontEnd/NFFlatten.mo b/Compiler/NFFrontEnd/NFFlatten.mo index d6808cddca..b130f35099 100644 --- a/Compiler/NFFrontEnd/NFFlatten.mo +++ b/Compiler/NFFrontEnd/NFFlatten.mo @@ -762,6 +762,9 @@ algorithm case Binding.TYPED_BINDING() algorithm + if binding.isFlattened then + return; + end if; bind_exp := binding.bindingExp; pars := listRest(binding.parents); @@ -795,6 +798,7 @@ algorithm end if; binding.bindingExp := flattenExp(bind_exp, prefix); + binding.isFlattened := true; then binding; diff --git a/Compiler/NFFrontEnd/NFTypeCheck.mo b/Compiler/NFFrontEnd/NFTypeCheck.mo index 51cf36ed6f..cf4220ae6d 100644 --- a/Compiler/NFFrontEnd/NFTypeCheck.mo +++ b/Compiler/NFFrontEnd/NFTypeCheck.mo @@ -2616,7 +2616,7 @@ algorithm Type.toString(binding.bindingType)}, {Binding.getInfo(binding), InstNode.info(component)}); fail(); elseif isCastMatch(ty_match) then - binding := Binding.TYPED_BINDING(exp, ty, binding.variability, binding.parents, binding.isEach, binding.evaluated, binding.info); + binding := Binding.TYPED_BINDING(exp, ty, binding.variability, binding.parents, binding.isEach, binding.evaluated, binding.isFlattened, binding.info); end if; then (); diff --git a/Compiler/NFFrontEnd/NFTyping.mo b/Compiler/NFFrontEnd/NFTyping.mo index dd9bd3bf2b..ec2cfbba34 100644 --- a/Compiler/NFFrontEnd/NFTyping.mo +++ b/Compiler/NFFrontEnd/NFTyping.mo @@ -866,7 +866,7 @@ algorithm info := Binding.getInfo(binding); (exp, ty, var) := typeExp(exp, origin, info); then - Binding.TYPED_BINDING(exp, ty, var, binding.parents, binding.isEach, false, binding.info); + Binding.TYPED_BINDING(exp, ty, var, binding.parents, binding.isEach, false, false, binding.info); case Binding.TYPED_BINDING() then binding; case Binding.UNBOUND() then binding; @@ -929,7 +929,7 @@ algorithm fail(); end if; then - Binding.TYPED_BINDING(exp, ty, var, condition.parents, false, false, info); + Binding.TYPED_BINDING(exp, ty, var, condition.parents, false, false, false, info); end match; end typeComponentCondition;