Opened 9 years ago

Closed 9 years ago

#3757 closed defect (fixed)

Record field assignment issue

Reported by: Per Östlund Owned by: Martin Sjölund
Priority: normal Milestone: Future
Component: MetaModelica Version: v1.9.4-dev-nightly
Keywords: Cc:

Description (last modified by Per Östlund)

I've encountered an issue when assigning to a record field, possibly related to using the UnionType.Record style of referencing a uniontype record together with singleton types. I haven't been able to make a small example that shows the issue, so see perost/nfinst2 instead.

The issue is that NFComponent.Component.COMPONENT has a field classInst, which is of type NFInstNode.InstNode. InstNode contains only one record INST_NODE. In NFInst.instComponentBinding there's then this code:

591:  _ := match component
592:    local
593:      InstNode cls;
594:
595:    case Component.COMPONENT(classInst = cls)
596:      algorithm
597:        (cls, tree) := instBindings(component.classInst, tree);
598:        component.classInst := cls;

This gives an error when compiling:

[NFInst.mo:598:9-598:35:writable] Error: Type mismatch in assignment in component.classInst := cls of NFInstNode.InstNode.INST_NODE := NFInstNode.InstNode
[NFInst.mo:598:9-598:35:writable] Error: Type mismatch in pattern component.classInst
expression type:
  NFInstNode.InstNode
pattern type:
  NFInstNode.InstNode.INST_NODE

One workaround is to rewrite the code like this to fool the compiler into thinking that cls is also an INST_NODE record (which it is of course):

case Component.COMPONENT(classInst = cls as InstNode.INST_NODE())

Adding another dummy record to InstNode also works, so the issue seems to be caused by InstNode being a singleton type.

Change History (4)

comment:1 by Per Östlund, 9 years ago

Description: modified (diff)

Fixed wrong line numbers.

comment:2 by Martin Sjölund, 9 years ago

It says cls is a non-single class in the type checking, which is why it fails for some reason.

comment:3 by Martin Sjölund, 9 years ago

Values.mo loses this information. But we can assume if they are both the same uniontype and one of the sides says this uniontype has only 1 member, we can do the assignment.

comment:4 by Per Östlund, 9 years ago

Resolution: fixed
Status: newclosed

It's now working with the changes in af457aa.

Note: See TracTickets for help on using tickets.