diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-10-12 03:06:20 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2021-10-12 03:06:20 +0000 |
commit | b3c3c3e63df2958dfc3f972abefa8f892d8345d3 (patch) | |
tree | 8aaa6f73989ef8dc84b0cb598aa7540aa4fb3066 /sys/src/cmd/cc | |
parent | 1656782f7919856b6a627a5f15a4209ee853f7f1 (diff) |
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);
}
Diffstat (limited to 'sys/src/cmd/cc')
-rw-r--r-- | sys/src/cmd/cc/cc.h | 2 | ||||
-rw-r--r-- | sys/src/cmd/cc/lex.c | 26 | ||||
-rw-r--r-- | sys/src/cmd/cc/lexbody | 26 | ||||
-rw-r--r-- | sys/src/cmd/cc/macbody | 17 |
4 files changed, 41 insertions, 30 deletions
diff --git a/sys/src/cmd/cc/cc.h b/sys/src/cmd/cc/cc.h index 357de549d..043719efe 100644 --- a/sys/src/cmd/cc/cc.h +++ b/sys/src/cmd/cc/cc.h @@ -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); diff --git a/sys/src/cmd/cc/lex.c b/sys/src/cmd/cc/lex.c index 7e9b11d3e..707fb0bac 100644 --- a/sys/src/cmd/cc/lex.c +++ b/sys/src/cmd/cc/lex.c @@ -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) diff --git a/sys/src/cmd/cc/lexbody b/sys/src/cmd/cc/lexbody index 7996c8ba1..0969c3c80 100644 --- a/sys/src/cmd/cc/lexbody +++ b/sys/src/cmd/cc/lexbody @@ -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; diff --git a/sys/src/cmd/cc/macbody b/sys/src/cmd/cc/macbody index 290660c22..5caf5b2c0 100644 --- a/sys/src/cmd/cc/macbody +++ b/sys/src/cmd/cc/macbody @@ -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 |