@@ -1495,6 +1495,21 @@ static void refineAccessExpressionDatatype(deBlock scopeBlock, deExpression targ
1495
1495
}
1496
1496
}
1497
1497
1498
+ // Check the type constraint on the assignment expression.
1499
+ static void checkAssignmentTypeConstraint (deBlock scopeBlock , deExpression expression ) {
1500
+ deExpression access = deExpressionGetFirstExpression (expression );
1501
+ deExpression value = deExpressionGetNextExpression (access );
1502
+ deExpression constraint = deExpressionGetNextExpression (value );
1503
+ if (constraint == deExpressionNull ) {
1504
+ return ;
1505
+ }
1506
+ deDatatype datatype = deExpressionGetDatatype (value );
1507
+ if (!deDatatypeMatchesTypeExpression (scopeBlock , datatype , constraint )) {
1508
+ error (expression , "Violation of type constraint: %s" ,
1509
+ deDatatypeGetDefaultValueString (datatype ));
1510
+ }
1511
+ }
1512
+
1498
1513
// Bind an assignment expression.
1499
1514
static deBindRes bindAssignmentExpression (deBlock scopeBlock , deExpression expression ) {
1500
1515
deExpression access = deExpressionGetFirstExpression (expression );
@@ -1524,11 +1539,12 @@ static deBindRes bindAssignmentExpression(deBlock scopeBlock, deExpression expre
1524
1539
refineAccessExpressionDatatype (scopeBlock , access , valueDatatype );
1525
1540
}
1526
1541
deExpressionSetDatatype (expression , valueDatatype );
1542
+ checkAssignmentTypeConstraint (scopeBlock , expression );
1527
1543
return DE_BINDRES_OK ;
1528
1544
}
1529
1545
1530
1546
// Bind the array expression.
1531
- static void bindArrayExpression (deBlock scopeBlock , deExpression expression ) {
1547
+ static void bindArrayExpression (deBlock scopeBlock , deExpression expression ) {
1532
1548
deLine line = deExpressionGetLine (expression );
1533
1549
deExpression firstElement = deExpressionGetFirstExpression (expression );
1534
1550
deDatatype datatype = deExpressionGetDatatype (firstElement );
@@ -2000,7 +2016,7 @@ static void rebuildBinding(deBinding binding) {
2000
2016
}
2001
2017
2002
2018
// Bind or continue expression the statement.
2003
- void deBindStatement2 (deBinding binding ) {
2019
+ void deBindStatement (deBinding binding ) {
2004
2020
deExpression expression = deBindingGetFirstExpression (binding );
2005
2021
deBlock scopeBlock = deGetBindingBlock (binding );
2006
2022
while (expression != deExpressionNull ) {
@@ -2045,6 +2061,6 @@ void deBindStatement2(deBinding binding) {
2045
2061
}
2046
2062
if (deBindingGetFirstExpression (binding ) != deExpressionNull ) {
2047
2063
// We must have queued more expressions during post-processing.
2048
- deBindStatement2 (binding );
2064
+ deBindStatement (binding );
2049
2065
}
2050
2066
}
0 commit comments