goldberg@uiucdcs.CS.UIUC.EDU (03/13/86)
Date: Wed, 12 Mar 86 14:48:04 cst From: stevea@uiphysed.PE.UIUC.EDU (Steve Alexander) To: goldberg@cs.uiuc.edu Subject: Bug fix for 2.9 lint & voids -- please post Subject: Lint does not grok voids Index: usr.bin/lint/lint.c lib/mip/{cgram.y,manifest,scan.c,trees.c} CSS/Harvard 2.9 Fix Description: Although the Ritchie compiler was changed to support voids, the PCC (and hence lint) was not. Repeat-By: lint the following: extern void zz(); main() { (void)printf("Won't work\n"); } void z() { return; } Fix: Install the following diffs... *NOTE* I have not tested these with the PCC, only with lint. I don't use the PCC (does anyone?) These are mostly ripped off of the VAX 4.2 PCC... ### lint/lint.c RCS file: RCS/lint.c,v retrieving revision 1.1 diff -c -r1.1 lint.c *** /tmp/,RCSt1021526 Wed Mar 12 01:05:37 1986 --- lint.c Sun Mar 9 16:44:21 1986 *************** *** 73,79 default: if( asgop(p->op) ) break; ! if( p->op == UNARY MUL && ( p->type == STRTY || p->type == UNIONTY) ) { break; /* the compiler does this... */ } if( down == EFF && hflag ) werror( "null effect" ); --- 73,85 ----- default: if( asgop(p->op) ) break; ! if( p->op == UNARY MUL && ( p->type == STRTY || p->type == UNIONTY || p->type == UNDEF) ) { ! ! /* ! * struct x f(); main() { (void) f(); } ! * the cast call appears as U* UNDEF ! */ ! break; /* the compiler does this... */ } if( down == EFF && hflag ) werror( "null effect" ); *************** *** 335,340 case UNARY STCALL: case UNARY FORTCALL: if( p->left->op == ICON && (id=p->left->rval) != NONAME ){ /* used to be &name */ printf( "%.7s\t%03d\t%o\t%d\t", exname(stab[id].sname), down==EFF ? LUE : LUV, --- 341,356 ----- case UNARY STCALL: case UNARY FORTCALL: if( p->left->op == ICON && (id=p->left->rval) != NONAME ){ /* used to be &name */ + int lty; + if ((down == EFF) && (p->type != UNDEF)) { + lty = LUE; + } + else if (down == EFF) { + lty = LUV | LUE; + } + else { + lty = LUV; + } printf( "%.7s\t%03d\t%o\t%d\t", exname(stab[id].sname), lty, *************** *** 337,343 if( p->left->op == ICON && (id=p->left->rval) != NONAME ){ /* used to be &name */ printf( "%.7s\t%03d\t%o\t%d\t", exname(stab[id].sname), ! down==EFF ? LUE : LUV, DECREF(p->left->type), acount ); if( acount ) lpta( p->right ); ident(); --- 353,359 ----- } printf( "%.7s\t%03d\t%o\t%d\t", exname(stab[id].sname), ! lty, DECREF(p->left->type), acount ); if( acount ) lpta( p->right ); ident(); ### mip/cgram.y RCS file: RCS/cgram.y,v retrieving revision 1.2 diff -c -r1.2 cgram.y *** /tmp/,RCSt1021533 Wed Mar 12 01:08:33 1986 --- cgram.y Tue Mar 11 23:05:56 1986 *************** *** 190,195 ={ $$ = mkty(INT,0,INT); } | type ={ curclass = SNULL ; } ; --- 190,199 ----- ={ $$ = mkty(INT,0,INT); } | type ={ curclass = SNULL ; } + | type class type + ={ $1->type = types( $1->type, $3->type, UNDEF ); + $3->op = FREE; + } ; *************** *** 490,495 ={ register NODE *temp; idname = curftn; temp = buildtree( NAME, NIL, NIL ); temp->type = DECREF( temp->type ); temp = buildtree( RETURN, temp, $2 ); /* now, we have the type of the RHS correct */ --- 494,502 ----- ={ register NODE *temp; idname = curftn; temp = buildtree( NAME, NIL, NIL ); + if (temp->type == TVOID) + uerror("void function %s cannot return value", + stab[idname].sname); temp->type = DECREF( temp->type ); temp = buildtree( RETURN, temp, $2 ); /* now, we have the type of the RHS correct */ ### mip/manifest RCS file: RCS/manifest,v retrieving revision 1.1 diff -c -r1.1 manifest *** /tmp/,RCSt1021539 Wed Mar 12 01:09:38 1986 --- manifest Sat Mar 8 17:16:54 1986 *************** *** 147,152 /* type names, used in symbol table building */ # define TNULL PTR /* pointer to UNDEF */ # define UNDEF 0 # define FARG 1 # define CHAR 2 --- 147,153 ----- /* type names, used in symbol table building */ # define TNULL PTR /* pointer to UNDEF */ + # define TVOID FTN # define UNDEF 0 # define FARG 1 # define CHAR 2 ### mip/scan.c RCS file: RCS/scan.c,v retrieving revision 1.1 diff -c -r1.1 scan.c *** /tmp/,RCSt1021548 Wed Mar 12 01:10:19 1986 --- scan.c Tue Mar 11 17:30:01 1986 *************** *** 784,789 "typedef", AR_CL, TYPEDEF, "unsigned", AR_TY, UNSIGNED, "union", AR_U, 0, "while", AR_RW, WHILE, "", 0, 0, /* to stop the search */ }; --- 784,790 ----- "typedef", AR_CL, TYPEDEF, "unsigned", AR_TY, UNSIGNED, "union", AR_U, 0, + "void", AR_TY, UNDEF, "while", AR_RW, WHILE, "", 0, 0, /* to stop the search */ }; *************** *** 828,834 c=26; break; case 'u': c=27; break; ! case 'w': c=29; break; default: --- 829,835 ----- c=26; break; case 'u': c=27; break; ! case 'v': c=29; break; case 'w': c=30; break; *************** *** 830,835 c=27; break; case 'w': c=29; break; default: return( -1 ); --- 831,838 ----- c=27; break; case 'v': c=29; break; + case 'w': + c=30; break; default: return( -1 ); ### mip/trees.c RCS file: RCS/trees.c,v retrieving revision 1.1 diff -c -r1.1 trees.c *** /tmp/,RCSt1021555 Wed Mar 12 01:11:17 1986 --- trees.c Wed Mar 12 00:20:18 1986 *************** *** 888,893 t1 = p->left->type; t2 = p->right->type; u = 0; if( ISUNSIGNED(t1) ){ u = 1; --- 888,900 ----- t1 = p->left->type; t2 = p->right->type; + /* + * void mods from vax 4.2 pcc + */ + + if ((t1 == UNDEF || t2 == UNDEF) && o!=CAST) + uerror("void type illegal in expression"); + u = 0; if( ISUNSIGNED(t1) ){ u = 1; *************** *** 1134,1139 case RETURN: if( mt12 & MSTR ) return( LVAL+NCVT+TYPL+OTHER ); case CAST: if( mt12 & MDBI ) return( TYPL+LVAL+TYMATCH ); else if( (mt1&MENU)||(mt2&MENU) ) return( LVAL+NCVT+TYPL+PTMATCH+PUN ); else if( mt1 & MPTR ) return( LVAL+PTMATCH+PUN ); --- 1141,1147 ----- case RETURN: if( mt12 & MSTR ) return( LVAL+NCVT+TYPL+OTHER ); case CAST: + if (o==CAST && mt1==0) return(TYPL+TYMATCH); if( mt12 & MDBI ) return( TYPL+LVAL+TYMATCH ); else if( (mt1&MENU)||(mt2&MENU) ) return( LVAL+NCVT+TYPL+PTMATCH+PUN ); else if( mt1 & MPTR ) return( LVAL+PTMATCH+PUN ); *************** *** 1182,1187 switch( ty ){ case ENUMTY: case MOETY: return( MENU ); --- 1190,1198 ----- switch( ty ){ + case UNDEF: + case TVOID: + return(0); case ENUMTY: case MOETY: return( MENU );