A different way of detecting conformant arrays

This commit is contained in:
ceriel 1987-07-22 17:02:54 +00:00
parent a1772be47d
commit 3af275f8d6
3 changed files with 10 additions and 14 deletions

View file

@ -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) {

View file

@ -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;

View file

@ -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))