Skip to content

Commit 8a20ce0

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Propagate structuralness via modifications.
- Mark parameters that have a structural cref as binding as also structural. Belonging to [master]: - OpenModelica/OMCompiler#2887 - OpenModelica/OpenModelica-testsuite#1108
1 parent 25cfbd5 commit 8a20ce0

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

Compiler/NFFrontEnd/NFBinding.mo

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ public
259259
end match;
260260
end isRecordExp;
261261

262+
function isCrefExp
263+
input Binding binding;
264+
output Boolean isCref;
265+
algorithm
266+
isCref := match binding
267+
case TYPED_BINDING(bindingExp = Expression.CREF()) then true;
268+
else false;
269+
end match;
270+
end isCrefExp;
271+
262272
function recordFieldBinding
263273
input InstNode fieldNode;
264274
input Binding recordBinding;

Compiler/NFFrontEnd/NFTyping.mo

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
765766
algorithm
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

Comments
 (0)