Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 7e8436e

Browse files
lochelOpenModelica-Hudson
authored andcommitted
[NF] Check if binding type does match component type
1 parent 84fadec commit 7e8436e

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

Compiler/NFFrontEnd/NFBinding.mo

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@ public
121121
end match;
122122
end typedExp;
123123

124+
function getTypedExp
125+
input Binding binding;
126+
output Expression exp;
127+
algorithm
128+
TYPED_BINDING(bindingExp = exp) := binding;
129+
end getTypedExp;
130+
124131
function setTypedExp
125132
input Expression exp;
126133
input output Binding binding;
@@ -175,6 +182,16 @@ public
175182
end match;
176183
end isEach;
177184

185+
function isTyped
186+
input Binding binding;
187+
output Boolean isTyped;
188+
algorithm
189+
isTyped := match binding
190+
case TYPED_BINDING() then true;
191+
else false;
192+
end match;
193+
end isTyped;
194+
178195
function toString
179196
input Binding binding;
180197
input String prefix = "";

Compiler/NFFrontEnd/NFTyping.mo

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,20 @@ import NFType.Type;
5151
import Operator = NFOperator;
5252

5353
protected
54-
import Inst = NFInst;
55-
import Lookup = NFLookup;
56-
import TypeCheck = NFTypeCheck;
57-
import Types;
54+
import Ceval = NFCeval;
5855
import ClassInf;
56+
import ComponentRef = NFComponentRef;
57+
import ExecStat.execStat;
58+
import Inst = NFInst;
5959
import InstUtil = NFInstUtil;
60+
import Lookup = NFLookup;
61+
import MatchKind = NFTypeCheck.MatchKind;
6062
import NFCall.Call;
6163
import NFClass.ClassTree;
62-
import ComponentRef = NFComponentRef;
63-
import Ceval = NFCeval;
6464
import SimplifyExp = NFSimplifyExp;
6565
import Subscript = NFSubscript;
66-
import ExecStat.execStat;
66+
import TypeCheck = NFTypeCheck;
67+
import Types;
6768

6869
public
6970
function typeClass
@@ -315,24 +316,31 @@ algorithm
315316
() := match c
316317
local
317318
Binding binding;
319+
MatchKind matchKind;
318320

319321
case Component.TYPED_COMPONENT()
320322
algorithm
321323
binding := typeBinding(c.binding, scope);
322-
323324
if not referenceEq(binding, c.binding) then
324325
c.binding := binding;
325326
InstNode.updateComponent(c, component);
326327
end if;
327328

329+
if Binding.isTyped(binding) then
330+
(_, _, matchKind) := TypeCheck.matchTypes(Binding.getType(binding), c.ty, Binding.getTypedExp(binding));
331+
if not TypeCheck.isCompatibleMatch(matchKind) then
332+
Error.addSourceMessage(Error.VARIABLE_BINDING_TYPE_MISMATCH, {InstNode.name(component), Binding.toString(binding), Type.toString(c.ty), Type.toString(Binding.getType(binding))}, Binding.getInfo(binding));
333+
fail();
334+
end if;
335+
end if;
336+
328337
typeBindings(c.classInst, component);
329338
then
330339
();
331340

332341
else
333342
algorithm
334-
assert(false, getInstanceName() + " got invalid node " +
335-
InstNode.name(component));
343+
assert(false, getInstanceName() + " got invalid node " + InstNode.name(component));
336344
then
337345
fail();
338346

0 commit comments

Comments
 (0)