dim_finish(Namep v) #endif { register struct Dimblock *p; register expptr q; register int i, nd; p = v->vdim; v->vdimfinish = 0; nd = p->ndim; doin_setbound = 1; for(i = 0; i < nd; i++) if (q = p->dims[i].dimexpr) { q = p->dims[i].dimexpr = make_int_expr(putx(fixtype(q))); if (!ONEOF(q->headblock.vtype, MSKINT|MSKREAL)) bad_dimtype(v); } if (q = p->basexpr) p->basexpr = make_int_expr(putx(fixtype(q))); doin_setbound = 0; }
make_int_expr(expptr e) #endif { chainp listp; Addrp ap; expptr e1; if (e != ENULL) switch (e -> tag) { case TADDR: if (e->addrblock.isarray) { if (e1 = e->addrblock.memoffset) e->addrblock.memoffset = make_int_expr(e1); } else if (e->addrblock.vstg == STGARG || e->addrblock.vstg == STGCOMMON && e->addrblock.uname_tag == UNAM_NAME && e->addrblock.user.name->vcommequiv) e = mkexpr(OPWHATSIN, e, ENULL); break; case TEXPR: e -> exprblock.leftp = make_int_expr (e -> exprblock.leftp); e -> exprblock.rightp = make_int_expr (e -> exprblock.rightp); break; case TLIST: for(listp = e->listblock.listp; listp; listp = listp->nextp) if ((ap = (Addrp)listp->datap) && ap->tag == TADDR && ap->uname_tag == UNAM_CONST) addrlit(ap); break; default: break; } /* switch */ return e; } /* make_int_expr */
/// Returns the integer literal `n` with type t. /// /// The type of the expression shall be an integral type. inline int_expr& builder::make_int_expr(type& t, int n) { return make_int_expr(t, value(n)); }