for(p
= commonlist
; p
; p
= p
->nextp
)
if(equals(s
, p
->datap
->comname
))
for(t
= p
->comname
; *t
++ = *s
++ ; ) ;
p
->blklevel
= (blklevel
>0? 1 : 0);
commonlist
= mkchain(p
, commonlist
);
return(commonlist
->datap
);
if( (p
= name(s
,1)) == 0)
register struct exprblock
*p
;
TEST
fprintf(diagfile
, "mknode(%d,%d,%o,%o) = %o\n", t
, o
, l
, r
, p
);
if(t
!=TLIST
&& t
!=TCONST
&& l
!=0 && l
->tag
==TERROR
)
if(r
!=0 && r
->tag
==TERROR
)
exprerr("non-arithmetic operand of arith op","");
exprerr("non-arithmetic operand of arith op","");
if(lt
==rt
|| (o
==OPPOWER
&& rt
==TYINT
) )
else if( (lt
==TYREAL
&& rt
==TYLREAL
) ||
(lt
==TYLREAL
&& rt
==TYREAL
) )
else if( (lt
==TYREAL
&& rt
==TYCOMPLEX
) ||
(lt
==TYCOMPLEX
&& rt
==TYREAL
) )
else if( (lt
==TYLREAL
&& rt
==TYCOMPLEX
) ||
(lt
==TYCOMPLEX
&& rt
==TYLREAL
) )
exprerr("mixed mode", CNULL
);
if( (o
==OPPLUS
||o
==OPSTAR
) && l
->tag
==TCONST
&& r
->tag
!=TCONST
)
if(o
==OPPLUS
&& l
->tag
==TNEGOP
&&
(r
->tag
!=TCONST
|| l
->leftp
->tag
==TCONST
) )
if(lt
==TYCHAR
|| rt
==TYCHAR
)
exprerr("comparison of character and noncharacter data",CNULL
);
if( (o
==OPEQ
|| o
==OPNE
) &&
( (ll
==1 && rl
==1 && tailor
.charcomp
==1)
|| (ll
<=tailor
.ftnchwd
&& rl
<=tailor
.ftnchwd
&& tailor
.charcomp
==2) ))
q
= cpexpr( mkchcon(l
->leftp
) );
q
= cpexpr( mkchcon(r
->leftp
) );
p
->leftp
= mkcall(builtin(TYINT
,"ef1cmc"), arg4(l
,r
));
else if(lt
==TYLOG
|| rt
==TYLOG
)
exprerr("relational involving logicals", CNULL
);
else if( (lt
==TYCOMPLEX
|| rt
==TYCOMPLEX
) &&
exprerr("order comparison of complex numbers", CNULL
);
p
->leftp
= coerce(rt
, l
);
p
->rightp
= coerce(lt
, r
);
exprerr("non-logical operand of logical operator",CNULL
);
exprerr("non-logical operand of logical operator",CNULL
);
if(lt
!=TYINT
&& lt
!=TYREAL
&& lt
!=TYLREAL
&& lt
!=TYCOMPLEX
)
exprerr("impossible unary + or - operation",CNULL
);
if(lt
==TYCHAR
|| rt
==TYCHAR
|| lt
==TYLOG
|| rt
==TYLOG
)
exprerr("illegal assignment",CNULL
);
else if(lt
==TYSTRUCT
|| rt
==TYSTRUCT
)
if(lt
!=rt
|| l
->vtypep
->strsize
!=r
->vtypep
->strsize
|| l
->vtypep
->stralign
!=r
->vtypep
->stralign
)
exprerr("illegal structure assignment",CNULL
);
else if ( (lt
==TYCOMPLEX
|| rt
==TYCOMPLEX
) && lt
!=rt
)
/* p->rightp = r = coerce(lt, r) */ ;
if(p
->vtype
==TYUNDEFINED
|| (p
->tag
==TNAME
&&p
->vdcldone
==0&&p
->vadjdim
==0))
/*debug*/ printf("tag=%d, typed=%d\n", p
->tag
, p
->vtype
);
fatal("untyped subexpression");
if(p
->tag
==TNAME
) setvproc(p
,PROCNO
);
TEST
fprintf(diagfile
, "mkvar(%s), blk %d\n", p
->namep
, blklevel
);
if(p
->blklevel
> blklevel
)
if(instruct
|| p
->varp
==0 || p
->varp
->blklevel
<blklevel
)
if(p
->varp
&& p
->varp
->blklevel
<blklevel
)
else temptypelist
= mkchain(p
, temptypelist
);
register ptr funct
, p
, q
;
else if(fn1
->tag
== TNAME
)
funct
= fn1
->sthead
->varp
;
if(funct
->vclass
!=0 && funct
->vclass
!=CLARG
)
exprerr("invalid invocation of %s",funct
->sthead
->namep
);
if(args
) for(p
= args
->leftp
; p
; p
= p
->nextp
)
if( (q
->tag
==TCALL
&&q
->vtype
==TYUNDEFINED
) ||
(q
->tag
==TNAME
&&q
->vdcldone
==0) )
if(q
->tag
==TNAME
&& q
->vproc
==PROCUNKNOWN
)
if( q
->vtype
== TYSTRUCT
)
for(i
= 0; i
<NFTNTYPES
; ++i
)
else p
= p
->nextp
= mkchain(r
, p
->nextp
);
for(j
=0; j
<NFTNTYPES
; ++j
)
if(i
!= j
) r
->vbase
[j
] = 0;
return( mknode(TCALL
,0,cpexpr(funct
), args
) );
for(s
= thisctl
; s
!=0 && s
->subtype
!=STSWITCH
; s
= s
->prevctl
)
if(s
==0 || (here
&& s
!=thisctl
) )
laberr("invalid case label location",CNULL
);
for(q
= s
->loopctl
; q
!=0 && !eqcon(p
,q
->casexpr
) ; q
= q
->nextcase
)
q
->labelno
= ( here
? thislab() : nextlab() );
q
->nextcase
= s
->loopctl
;
if(thisexec
->labelno
== 0)
thisexec
->labelno
= q
->labelno
;
else if(thisexec
->labelno
!= q
->labelno
)
thisexec
->labelno
= q
->labelno
;
laberr("multiply defined case",CNULL
);
if(p
->tag
!=TCONST
|| p
->vtype
!=TYINT
)
execerr("invalid label","");
TEST
fprintf(diagfile
,"numeric label = %s\n", l
);
laberr("%s is already a nonlabel\n", p
->namep
);
warn1("label %s is inaccessible", p
->namep
);
laberr("%s is already defined\n", p
->namep
);
else if(blklevel
> q
->blklevel
)
laberr("%s is illegally placed\n",p
->namep
);
if(thisexec
->labelno
== 0)
thisexec
->labelno
= q
->labelno
;
else if(thisexec
->labelno
!= q
->labelno
)
thisexec
->labelno
= q
->labelno
;
q
->labelno
= ( here
? thislab() : nextlab() );
if(thisexec
->labelno
== 0)
thisexec
->labelno
= nextlab();
return(thisexec
->labelno
);
if(++nxtindif
< MAXINDIFS
)
fatal("too many indifs");
else if(p
->tag
!= TDEFINE
)
dclerr("attempt to DEFINE a variable name", s
);
if( strcmp(v
, (q
=p
->varp
) ->valp
) )
warn("macro value replaced");
dclerr("type already defined", s
);
p
->blklevel
= q
->blklevel
= (blklevel
==0 ? 0 : 1);
p
->varp
->valp
= copys(v
);
p
->nextfunct
= knownlist
;
return( mkconst(TYINT
, convic(k
) ) );
q
= mknode(TCONST
, 0, copys(p
), PNULL
);
q
->vtypep
= mkint( strlen(p
) );
zero
= (t
==TYCOMPLEX
? "0." : "0d0");
sprintf(buff
, "(%s,%s)", zero
, p
);
q
= mknode(TCONST
, 0, copys(buff
), PNULL
);
if(p
->vdim
==0 && p
->vtype
!=TYCHAR
&& p
->vtype
!=TYSTRUCT
)
exprerr("need an aggregate to the left of arrow",CNULL
);
for(q
= p
->vdim
->datap
; q
; q
= q
->nextp
)
s
= mkchain( mkint(1), s
);
subscript(p
, mknode(TLIST
,0,s
,PNULL
) );
putic(ICKEYWORD
, FEQUIVALENCE
);
for(q
= p
; q
; q
= q
->nextp
)
else putic(ICOP
, OPCOMMA
);
prexpr( t
= simple(LVAL
,q
->datap
) );
mkgeneric(gname
,atype
,fname
,ftype
)
fatal1("generic name already defined", gname
);
p
->genfname
[atype
] = fname
;
p
->genftype
[atype
] = ftype
;
for(p
= generlist
; p
; p
= p
->nextgenf
)
if(equals(s
, p
->genname
))
for(p
= knownlist
; p
; p
= p
->nextfunct
)
if(equals(s
, p
->funcname
))
if(g
= generic(s
= p
->leftp
->sthead
->namep
))
if(p
->rightp
->tag
==TLIST
&& p
->rightp
->leftp
&& ( (vt
= typearg(p
->rightp
->leftp
)) >=0)
&& (t
= g
->genftype
[vt
]) )
p
->leftp
= builtin(t
, g
->genfname
[vt
]);
dclerr("improper use of generic function", s
);
if(p
->vtype
==TYUNDEFINED
&& fp
->vclass
!=CLARG
)
setvproc(fp
, PROCINTRINSIC
);
setvproc(fp1
, PROCINTRINSIC
);
builtin(t
,fp1
->sthead
->namep
);
cpblock(fp1
, fp
, sizeof(struct exprblock
));
for(p
= p0
->nextp
; p
; p
= p
->nextp
)
if( (vt
= p
->datap
->vtype
) > maxt
)
for(p
= p0
; p
; p
= p
->nextp
)
p
->datap
= coerce(maxt
, p
->datap
);
if(t
->atdim
!=0 || (e
->tag
==TLIST
&& t
->attype
!=TYCOMPLEX
) )
if(e
->leftp
==0 || e
->leftp
->nextp
==0
|| e
->leftp
->nextp
->nextp
!=0)
exprerr("bad conversion to complex", "");
e
->leftp
->datap
= simple(RVAL
,
e
->leftp
->nextp
->datap
= simple(RVAL
,
if(isconst(e
->leftp
->datap
) &&
isconst(e
->leftp
->nextp
->datap
) )
e1
= mkcall(builtin(TYCOMPLEX
,"cmplx"),
arg2( coerce(TYREAL
,e
->leftp
->datap
),
coerce(TYREAL
,e
->leftp
->nextp
->datap
)));
e
= coerce(t
->attype
, simple(RVAL
, e
) );
if(etag
==TAROP
|| etag
==TLOGOP
|| etag
==TRELOP
)
exprerr("typexpr not fully implemented", "");
if(p
->datap
->vtype
== TYLREAL
)
a
= coerce(TYLREAL
, p
->datap
);
if(p
->datap
->vtype
== TYLREAL
)
a
= coerce(prec
= TYLREAL
,a
);
b
= coerce(TYLREAL
, p
->datap
);
if(a
->tag
!=TCONST
|| a
->vtype
!=prec
||
b
->tag
!=TCONST
|| b
->vtype
!=prec
)
if(prec
==TYLREAL
&& tailor
.lngcxtype
==NULL
)
sprintf(msg
, "_const%d", ++constno
);
q
->vdim
= mkchain(dp
,CHNULL
);
sprintf(msg
, "%c%s", as
, a
->leftp
);
e1
= mkconst(TYLREAL
, msg
);
sprintf(msg
, "%c%s", bs
, b
->leftp
);
e2
= mkconst(TYLREAL
, msg
);
mkinit(q
, mknode(TLIST
,0, mkchain(e1
,mkchain(e2
,CHNULL
)),PNULL
) );
sprintf(msg
, "(%c%s, %c%s)", as
, a
->leftp
, bs
, b
->leftp
);
return( mkconst(TYCOMPLEX
, msg
) );
err
: exprerr("invalid complex constant", "");
sprintf(buf
, "_const%d", ++constno
);
q
->vtypep
= mkint(strlen(p
));
mkinit(q
, mkconst(TYCHAR
, p
));
return( mknode(TLIST
,0, mkchain(mkint(1),CHNULL
), PNULL
) );