fix problem with variant tag and made double compatible with subranges

This commit is contained in:
ceriel 1990-07-17 13:57:01 +00:00
parent 109a357e95
commit e2bc68a46b
2 changed files with 18 additions and 15 deletions

View file

@ -641,11 +641,9 @@ VariantPart(struct scope *scope; arith *cnt; int *palign;
/* ISO 6.4.3.3 (p. 100)
* The standard permits the integertype as tagtype, but demands that the set
* of values denoted by the case-constants is equal to the set of values
* specified by the tagtype. So we've decided not to allow integer as tagtype,
* because it's not practical to enumerate ALL integers as case-constants.
* Though it wouldn't make a great difference to allow it as tagtype.
* specified by the tagtype.
*/
if( !(tp->tp_fund & T_INDEX) ) {
if( !(tp->tp_fund & T_INDEX)) {
error("illegal type in variant");
tp = error_type;
}
@ -654,16 +652,21 @@ VariantPart(struct scope *scope; arith *cnt; int *palign;
getbounds(tp, &lb, &ub);
ncst = ub - lb + 1;
/* initialize selector */
(*sel)->sel_ptrs = (struct selector **)
Malloc((unsigned)ncst * sizeof(struct selector *));
(*sel)->sel_ncst = ncst;
(*sel)->sel_lb = lb;
/* initialize tagvalue-table */
sp = (*sel)->sel_ptrs;
while( ncst-- ) *sp++ = *sel;
if (ncst < 0 || ncst > (~(1L<<(8*sizeof(arith)-1)))/sizeof(struct selector *)) {
error("range of variant tag too wide");
tp = error_type;
}
else {
/* initialize selector */
(*sel)->sel_ptrs = (struct selector **)
Malloc((unsigned)ncst * sizeof(struct selector *));
(*sel)->sel_ncst = ncst;
(*sel)->sel_lb = lb;
/* initialize tagvalue-table */
sp = (*sel)->sel_ptrs;
while( ncst-- ) *sp++ = *sel;
}
}
(*sel)->sel_type = tp;
if( df ) {

View file

@ -96,7 +96,7 @@ TstCompat(tp1, tp2)
/* no clause, just check for longs and ints */
/* BaseType is used in case of array indexing */
if ((BaseType(tp1) == int_type && tp2 == long_type) ||
(tp1 == long_type && tp2 == int_type))
(tp1 == long_type && BaseType(tp2) == int_type))
return 1;