@@ -761,7 +761,8 @@ protected
761761 InstNode cls;
762762 MatchKind matchKind;
763763 String name;
764- Variability comp_var, comp_eff_var, bind_var;
764+ Variability comp_var, comp_eff_var, bind_var, bind_eff_var;
765+ Component . Attributes attrs;
765766algorithm
766767 if InstNode . isEmpty(component) then
767768 return ;
@@ -770,7 +771,7 @@ algorithm
770771 c := InstNode . component(node);
771772
772773 () := match c
773- case Component . TYPED_COMPONENT (binding = Binding . UNTYPED_BINDING ())
774+ case Component . TYPED_COMPONENT (binding = Binding . UNTYPED_BINDING (), attributes = attrs )
774775 algorithm
775776 name := InstNode . name(component);
776777 binding := c. binding;
@@ -783,15 +784,26 @@ algorithm
783784 binding := TypeCheck . matchBinding(binding, c. ty, name, node);
784785 comp_var := Component . variability(c);
785786 comp_eff_var := Prefixes . effectiveVariability(comp_var);
786- bind_var := Prefixes . effectiveVariability(Binding . variability(binding));
787+ bind_var := Binding . variability(binding);
788+ bind_eff_var := Prefixes . effectiveVariability(bind_var);
787789
788- if bind_var > comp_eff_var and ExpOrigin . flagNotSet(origin, ExpOrigin . FUNCTION ) then
790+ if bind_eff_var > comp_eff_var and ExpOrigin . flagNotSet(origin, ExpOrigin . FUNCTION ) then
789791 Error . addSourceMessage(Error . HIGHER_VARIABILITY_BINDING , {
790792 name, Prefixes . variabilityString(comp_eff_var),
791- "'" + Binding . toString(c. binding) + "'" , Prefixes . variabilityString(bind_var )},
793+ "'" + Binding . toString(c. binding) + "'" , Prefixes . variabilityString(bind_eff_var )},
792794 Binding . getInfo(binding));
793795 fail();
794796 end if ;
797+
798+ // Mark parameters that have a structural cref as binding as also
799+ // structural. This is perhaps not optimal, but is required right now
800+ // to avoid structural singularity and other issues.
801+ if bind_var == Variability . STRUCTURAL_PARAMETER and
802+ comp_var == Variability . PARAMETER and
803+ Binding . isCrefExp(binding) then
804+ attrs. variability := bind_var;
805+ c. attributes := attrs;
806+ end if ;
795807 else
796808 if Binding . isBound(c. condition) then
797809 binding := Binding . INVALID_BINDING (binding, ErrorExt . getMessages());
0 commit comments