fix problem with variant tag and made double compatible with subranges
authorceriel <none@none>
Tue, 17 Jul 1990 13:57:01 +0000 (13:57 +0000)
committerceriel <none@none>
Tue, 17 Jul 1990 13:57:01 +0000 (13:57 +0000)
lang/pc/comp/declar.g
lang/pc/comp/typequiv.c

index 4c7a007..640f6cc 100644 (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 )      {
index bdc8b06..b80c046 100644 (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;