if(n
==0 && thisexec
->labelno
&& !(thisexec
->labused
))
if(!prevbg
|| n
!=0) /* avoid empty statement */
if(comments
&& !afterif
) putcomment();
putic(ICINDENT
, ctllevel
);
fatal("statement number changed");
else stnos
[n
] = ( nxtstno
+= tailor
.deltastno
) ;
TEST
fprintf(diagfile
, "LABEL %d\n", n
);
TEST
fprintf(diagfile
, "goto indirect %o\n", n
);
TEST
fprintf(diagfile
, "goto %d\n", n
);
index
= simple(LVAL
,index
);
for(p
= labs
; p
; p
= p
->nextp
)
exif1( mknode(TLOGOP
, OPAND
,
mknode(TRELOP
,OPGT
, cpexpr(index
), mkint(0)),
mknode(TRELOP
,OPLE
, cpexpr(index
), mkint(ncases
)) ));
for(p
= labs
; p
; p
= p
->nextp
)
else putic(ICOP
,OPCOMMA
);
TEST
fprintf(diagfile
, "computed goto\n");
if(p
->tag
==TNAME
|| p
->tag
==TFTNBLOCK
)
badtag("excall", p
->tag
);
q2
= (q1
->tag
==TFTNBLOCK
? q1
: q1
->sthead
->varp
);
if(q2
->vtype
!=TYUNDEFINED
&& q2
->vtype
!=TYSUBR
)
dclerr("attempt to use a variable as a subroutine", p
->sthead
->namep
);
q1
->vtype
= q2
->vtype
= TYSUBR
;
if( equals(q2
->sthead
->namep
, "stop") )
TEST
fprintf(diagfile
,"stop ");
if( (q1
= p
->rightp
) && (q1
= q1
->leftp
) )
prexpr( simple(RVAL
, q1
->datap
) );
if( ioop(q2
->sthead
->namep
) )
TEST
fprintf(diagfile
, "call ");
/* replace character constant arguments with holleriths */
if( (q1
=p
->rightp
) && tailor
.hollincall
)
for(q1
= q1
->leftp
; q1
; q1
= q1
->nextp
)
if( (q2
= q1
->datap
)->tag
==TCONST
q2
->leftp
= mkholl(q3
= q2
->leftp
);
register char *q
, *t
, *s
;
s
= t
= calloc(n
+ 2 + strlen(q
) , 1);
if(thisexec
->nftnst
== 0)
putic(ICKEYWORD
,FCONTINUE
);
if(thisexec
->nftnst
>1 || thisexec
->labeled
|| thisexec
->uniffable
)
if(thisctl
->breaklab
== 0)
thisctl
->breaklab
= nextlab();
indifs
[thisctl
->indifn
] = thisctl
->breaklab
;
else thisctl
->breaklab
= 0;
frexpr( simple(LVAL
, mknode(TASGNOP
,o
,l
,r
)) );
if(procname
&& procname
->vtype
&& procname
->vtype
!=TYCHAR
&&
(procname
->vtype
!=TYLCOMPLEX
|| tailor
.lngcxtype
!=NULL
) )
if(p
->tag
!=TNAME
|| p
->sthead
!=procname
->sthead
)
exasgn( cpexpr(procname
) , OPASGN
, p
);
else execerr("can only return values in a function", PNULL
);
else if(procname
&& procname
->vtype
)
warn("function return without data value");
putic(ICKEYWORD
, FRETURN
);
TEST
{fprintf(diagfile
, "exec: return( " ); prexpr(p
); fprintf(diagfile
, ")\n" ); }
if(thisexec
->labelno
&& !(thisexec
->labused
) )
putic(ICKEYWORD
,FCONTINUE
);
exbrk(opnext
,levskip
,btype
)
if(opnext
&& (btype
==STSWITCH
|| btype
==STPROC
))
execerr("illegal next", PNULL
);
else if(!opnext
&& btype
==STPROC
)
else brknxtlab(opnext
,levskip
,btype
);
TEST
fprintf(diagfile
, "exec: %s\n", (opnext
? "next" : "exit"));
if( (tag
= e
->tag
)==TERROR
|| e
->vtype
!=TYLOG
)
e
= mkconst(TYLOG
, ".true.");
execerr("non-logical conditional expression in if", PNULL
);
TEST
fprintf(diagfile
, "exif called\n");
indifs
[thisctl
->indifn
= nextindif()] = 0;
putic(ICINDPTR
, thisctl
->indifn
);
prexpr(e
= simple(RVAL
, mknode(TNOTOP
,OPNOT
,e
,PNULL
)));
TEST
fprintf(diagfile
, "if1 ");
if(ncases
==0 /* && thisexec->prevexec->brnchend==0 */ )
brknxtlab(opnext
, levp
, btype
)
levskip
= ( levp
? convci(levp
->leftp
) : 1);
execerr("illegal break count %d", levskip
);
for(p
= thisctl
; p
!=0 ; p
= p
->prevctl
)
if( (btype
==0 || p
->subtype
==btype
) &&
p
->subtype
!=STIF
&& p
->subtype
!=STPROC
&&
(!opnext
|| p
->subtype
!=STSWITCH
) )
if(--levskip
== 0) break;
execerr("invalid break/next", PNULL
);
if(p
->subtype
==STREPEAT
&& opnext
)
if(p1
->tag
!=TASGNOP
|| p1
->subtype
!=OPASGN
|| p1
->leftp
->tag
!=TNAME
)
p
->dovar
= gent(TYINT
, PNULL
);
p
->dopar
[0] = p1
->rightp
;
p
->dopar
[1] = p
->dopar
[0];
if( (q
->tag
==TNAME
|| q
->tag
==TTEMP
) &&
(q
->vsubs
|| q
->voffset
) )
p
->dopar
[i
] = simple(RVAL
,mknode(TASGNOP
,0,
p
->dopar
[i
] = simple(LVAL
, coerce(TYINT
, q
) );
if(isicon(p
->dopar
[i
], &val
[i
]))
execerr("do parameter out of range", PNULL
);
if(val
[0]>0 && val
[1]>0 && val
[0]>val
[1])
execerr("do parameters out of order", PNULL
);