summaryrefslogtreecommitdiffstats
path: root/src/evaluate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evaluate.c')
-rw-r--r--src/evaluate.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index f7e97ef7..c20a1d52 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -2361,6 +2361,20 @@ static bool data_mapping_has_interval(struct expr *data)
return false;
}
+static bool elem_data_compatible(const struct expr *set_data,
+ const struct expr *elem_data)
+{
+ if (elem_data->etype == EXPR_RANGE) {
+ /* EXPR_RANGE has invalid_type, use the lhs type.
+ * It should be impossible to have a EXPR_RANGE where
+ * lhs and rhs don't have the same dtype.
+ */
+ return elem_data_compatible(set_data, elem_data->left);
+ }
+
+ return datatype_compatible(set_data->dtype, elem_data->dtype);
+}
+
static int expr_evaluate_mapping(struct eval_ctx *ctx, struct expr **expr)
{
struct expr *mapping = *expr;
@@ -2417,6 +2431,12 @@ static int expr_evaluate_mapping(struct eval_ctx *ctx, struct expr **expr)
"Object mapping data should be a value, not %s",
expr_name(mapping->right));
+ if (set_is_datamap(set->flags) &&
+ !elem_data_compatible(set->data, mapping->right))
+ return expr_error(ctx->msgs, mapping->right,
+ "Element mapping mismatches map definition, expected %s, not '%s'",
+ set->data->dtype->desc, mapping->right->dtype->desc);
+
mapping->flags |= EXPR_F_CONSTANT;
return 0;
}