A different way of detecting conformant arrays
This commit is contained in:
parent
a1772be47d
commit
3af275f8d6
3 changed files with 10 additions and 14 deletions
|
@ -128,10 +128,9 @@ ChkArr(expp)
|
||||||
/* Type of the index must be assignment compatible with
|
/* Type of the index must be assignment compatible with
|
||||||
the index type of the array (Def 8.1).
|
the index type of the array (Def 8.1).
|
||||||
However, the index type of a conformant array is not specified.
|
However, the index type of a conformant array is not specified.
|
||||||
Either INTEGER or CARDINAL seems reasonable.
|
In our implementation it is CARDINAL.
|
||||||
*/
|
*/
|
||||||
if (IsConformantArray(tpl) ? !TstAssCompat(card_type, tpr)
|
if (!TstAssCompat(IndexType(tpl), tpr)) {
|
||||||
: !TstAssCompat(IndexType(tpl), tpr)) {
|
|
||||||
node_error(expp, "incompatible index type");
|
node_error(expp, "incompatible index type");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -983,17 +982,11 @@ ChkStandard(expp, left)
|
||||||
if (!(left = getarg(&arg, T_ARRAY|T_STRING|T_CHAR, 0, edf))) {
|
if (!(left = getarg(&arg, T_ARRAY|T_STRING|T_CHAR, 0, edf))) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (IsConformantArray(left->nd_type)) {
|
|
||||||
/* A conformant array has no explicit index type,
|
|
||||||
but it is a subrange with lower bound 0, so
|
|
||||||
it is of type CARDINAL !!!
|
|
||||||
*/
|
|
||||||
expp->nd_type = card_type;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (left->nd_type->tp_fund == T_ARRAY) {
|
if (left->nd_type->tp_fund == T_ARRAY) {
|
||||||
expp->nd_type = IndexType(left->nd_type);
|
expp->nd_type = IndexType(left->nd_type);
|
||||||
cstcall(expp, S_MAX);
|
if (! IsConformantArray(left->nd_type)) {
|
||||||
|
cstcall(expp, S_MAX);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (left->nd_symb != STRING) {
|
if (left->nd_symb != STRING) {
|
||||||
|
|
|
@ -143,7 +143,10 @@ FormalType(struct type **ptp;)
|
||||||
extern arith ArrayElSize();
|
extern arith ArrayElSize();
|
||||||
} :
|
} :
|
||||||
ARRAY OF qualtype(ptp)
|
ARRAY OF qualtype(ptp)
|
||||||
{ register struct type *tp = construct_type(T_ARRAY, NULLTYPE);
|
{ /* index type of conformant array is "CARDINAL".
|
||||||
|
Recognize a conformant array by size 0.
|
||||||
|
*/
|
||||||
|
register struct type *tp = construct_type(T_ARRAY, card_type);
|
||||||
|
|
||||||
tp->arr_elem = *ptp;
|
tp->arr_elem = *ptp;
|
||||||
*ptp = tp;
|
*ptp = tp;
|
||||||
|
|
|
@ -152,7 +152,7 @@ struct type
|
||||||
|
|
||||||
#define NULLTYPE ((struct type *) 0)
|
#define NULLTYPE ((struct type *) 0)
|
||||||
|
|
||||||
#define IsConformantArray(tpx) ((tpx)->tp_fund==T_ARRAY && (tpx)->tp_next==0)
|
#define IsConformantArray(tpx) ((tpx)->tp_fund==T_ARRAY && (tpx)->tp_size==0)
|
||||||
#define bounded(tpx) ((tpx)->tp_fund & T_INDEX)
|
#define bounded(tpx) ((tpx)->tp_fund & T_INDEX)
|
||||||
#define complex(tpx) ((tpx)->tp_fund & (T_RECORD|T_ARRAY))
|
#define complex(tpx) ((tpx)->tp_fund & (T_RECORD|T_ARRAY))
|
||||||
#define WA(sz) (align(sz, (int) word_size))
|
#define WA(sz) (align(sz, (int) word_size))
|
||||||
|
|
Loading…
Add table
Reference in a new issue