From: ceriel Date: Tue, 17 Jul 1990 13:57:01 +0000 (+0000) Subject: fix problem with variant tag and made double compatible with subranges X-Git-Tag: release-5-5~1649 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=e2bc68a46b263d1beda3fb6e3ead609b0fce75ac;p=ack.git fix problem with variant tag and made double compatible with subranges --- diff --git a/lang/pc/comp/declar.g b/lang/pc/comp/declar.g index 4c7a007dc..640f6cc56 100644 --- a/lang/pc/comp/declar.g +++ b/lang/pc/comp/declar.g @@ -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 ) { diff --git a/lang/pc/comp/typequiv.c b/lang/pc/comp/typequiv.c index bdc8b068e..b80c0463d 100644 --- a/lang/pc/comp/typequiv.c +++ b/lang/pc/comp/typequiv.c @@ -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;