If the type we have is different from the type expected, but they are
compatible, propagate_type() should return the type that we have.
Otherwise we lose information - which may later be useful.
Signed-off-by: NeilBrown <neil@brown.name>
.tmp.code:24:8: error: cannot assign value of type [5]number
.tmp.code:25:13: error: expected [5]number but variable 'a3' is [10]number
.tmp.code:23:36: info: this is where 'a3' was set to [10]number
.tmp.code:24:8: error: cannot assign value of type [5]number
.tmp.code:25:13: error: expected [5]number but variable 'a3' is [10]number
.tmp.code:23:36: info: this is where 'a3' was set to [10]number
+ .tmp.code:23:8: info: variable 'a1' was set as [5]number here.
.tmp.code:25:8: error: cannot assign value of type [5]number
.tmp.code:26:13: error: expected [5]number but variable 'a4' is [5]string
.tmp.code:23:51: info: this is where 'a4' was set to [5]string
.tmp.code:25:8: error: cannot assign value of type [5]number
.tmp.code:26:13: error: expected [5]number but variable 'a4' is [5]string
.tmp.code:23:51: info: this is where 'a4' was set to [5]string
+ .tmp.code:23:8: info: variable 'a1' was set as [5]number here.
.tmp.code:26:8: error: cannot assign value of type [5]number
.tmp.code:27:16: error: expected number found string
.tmp.code:28:16: error: expected string found Boolean
.tmp.code:26:8: error: cannot assign value of type [5]number
.tmp.code:27:16: error: expected number found string
.tmp.code:28:16: error: expected string found Boolean
*perr |= Eruntime;
if (v->constant)
*perr |= Econst;
*perr |= Eruntime;
if (v->constant)
*perr |= Econst;
- if (!type)
- return v->type;
- return type;
}
###### interp exec cases
}
###### interp exec cases
- if (propagate_types(b->right, c, perr_local, t, 0) != t)
+ if (propagate_types(b->right, c, perr_local, t, 0) != t &&
+ *perr_local & Efail)
if (b->left->type == Xvar)
type_err(c, "info: variable '%v' was set as %1 here.",
cast(var, b->left)->var->where_set, t, rules, NULL);
if (b->left->type == Xvar)
type_err(c, "info: variable '%v' was set as %1 here.",
cast(var, b->left)->var->where_set, t, rules, NULL);