/* Type of the index must be assignment compatible with
the index type of the array (Def 8.1).
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)
- : !TstAssCompat(IndexType(tpl), tpr)) {
+ if (!TstAssCompat(IndexType(tpl), tpr)) {
node_error(expp, "incompatible index type");
return 0;
}
if (!(left = getarg(&arg, T_ARRAY|T_STRING|T_CHAR, 0, edf))) {
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) {
expp->nd_type = IndexType(left->nd_type);
- cstcall(expp, S_MAX);
+ if (! IsConformantArray(left->nd_type)) {
+ cstcall(expp, S_MAX);
+ }
break;
}
if (left->nd_symb != STRING) {
extern arith ArrayElSize();
} :
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;
*ptp = tp;
#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 complex(tpx) ((tpx)->tp_fund & (T_RECORD|T_ARRAY))
#define WA(sz) (align(sz, (int) word_size))