cc: do not expand function-like macros for non-function invocations

It is a bit of a annoyance that kenc will try to expand
function like macros on any symbol with the same name
and then complain when it doesnt see the '(' in the
invocation.

test case below:

void
foo(int)
{
}

struct Bar
{
	int	baz;	/* <- should not conflict */
};

void
main(void)
{
	baz(123);
}
This commit is contained in:
cinap_lenrek 2021-10-12 03:06:20 +00:00
parent 1656782f79
commit b3c3c3e63d
13 changed files with 50 additions and 39 deletions

View file

@ -156,7 +156,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);

View file

@ -157,7 +157,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);

View file

@ -137,7 +137,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void maclin(void);
void macprag(void);

View file

@ -151,7 +151,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);

View file

@ -143,7 +143,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void maclin(void);
void macprag(void);

View file

@ -152,7 +152,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);

View file

@ -556,7 +556,7 @@ void linehist(char*, int);
void macdef(void);
void macprag(void);
void macend(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macif(int);
void macinc(void);
void maclin(void);

View file

@ -755,18 +755,22 @@ talph:
if(s->macro) {
newio();
cp = ionext->b;
macexpand(s, cp, sizeof(ionext->b)-1);
pushio();
ionext->link = iostack;
iostack = ionext;
fi.p = cp;
fi.c = strlen(cp);
if(peekc != IGN) {
cp[fi.c++] = peekc;
cp[fi.c] = 0;
peekc = IGN;
if(macexpand(s, cp, sizeof(ionext->b)-1)){
pushio();
ionext->link = iostack;
iostack = ionext;
fi.p = cp;
fi.c = strlen(cp);
if(peekc != IGN) {
cp[fi.c++] = peekc;
cp[fi.c] = 0;
peekc = IGN;
}
goto l0;
} else {
ionext->link = iofree;
iofree = ionext;
}
goto l0;
}
yylval.sym = s;
if(s->class == CTYPEDEF || s->class == CTYPESTR)

View file

@ -238,18 +238,22 @@ l1:
if(s->macro) {
newio();
cp = ionext->b;
macexpand(s, cp, sizeof(ionext->b)-1);
pushio();
ionext->link = iostack;
iostack = ionext;
fi.p = cp;
fi.c = strlen(cp);
if(peekc != IGN) {
cp[fi.c++] = peekc;
cp[fi.c] = 0;
peekc = IGN;
if(macexpand(s, cp, sizeof(ionext->b)-1)){
pushio();
ionext->link = iostack;
iostack = ionext;
fi.p = cp;
fi.c = strlen(cp);
if(peekc != IGN) {
cp[fi.c++] = peekc;
cp[fi.c] = 0;
peekc = IGN;
}
goto l0;
} else {
ionext->link = iofree;
iofree = ionext;
}
goto l0;
}
if(s->type == 0)
s->type = LNAME;

View file

@ -372,7 +372,7 @@ bad:
macend();
}
void
int
macexpand(Sym *s, char *b, int blen)
{
char buf[2000];
@ -386,15 +386,17 @@ macexpand(Sym *s, char *b, int blen)
goto toobig;
if(debug['m'])
print("#expand %s %s\n", s->name, b);
return;
return 1;
}
nargs = (char)(*s->macro & ~VARMAC) - 1;
dots = *s->macro & VARMAC;
c = getnsc();
if(c != '(')
goto bad;
if(c != '('){
unget(c);
return 0;
}
n = 0;
c = getc();
if(c != ')') {
@ -490,7 +492,7 @@ macexpand(Sym *s, char *b, int blen)
if(n != nargs) {
yyerror("argument mismatch expanding: %s", s->name);
*b = 0;
return;
return 0;
}
ob = b;
eb = b + blen-1;
@ -526,16 +528,17 @@ macexpand(Sym *s, char *b, int blen)
*b = 0;
if(debug['m'])
print("#expand %s %s\n", s->name, ob);
return;
return 1;
bad:
yyerror("syntax in macro expansion: %s", s->name);
*b = 0;
return;
return 0;
toobig:
yyerror("too much text in macro expansion: %s", s->name);
*b = 0;
return 0;
}
void

View file

@ -136,7 +136,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);

View file

@ -138,7 +138,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void macprag(void);
void maclin(void);

View file

@ -136,7 +136,7 @@ Sym* getsym(void);
void domacro(void);
void macund(void);
void macdef(void);
void macexpand(Sym*, char*, int);
int macexpand(Sym*, char*, int);
void macinc(void);
void maclin(void);
void macprag(void);