code: plan9front

Download patch

ref: b3c3c3e63df2958dfc3f972abefa8f892d8345d3
parent: 1656782f7919856b6a627a5f15a4209ee853f7f1
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Oct 11 23:06:20 EDT 2021

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);
}

--- a/sys/src/cmd/1a/a.h
+++ b/sys/src/cmd/1a/a.h
@@ -156,7 +156,7 @@
 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);
--- a/sys/src/cmd/2a/a.h
+++ b/sys/src/cmd/2a/a.h
@@ -157,7 +157,7 @@
 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);
--- a/sys/src/cmd/5a/a.h
+++ b/sys/src/cmd/5a/a.h
@@ -137,7 +137,7 @@
 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);
--- a/sys/src/cmd/6a/a.h
+++ b/sys/src/cmd/6a/a.h
@@ -151,7 +151,7 @@
 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);
--- a/sys/src/cmd/7a/a.h
+++ b/sys/src/cmd/7a/a.h
@@ -143,7 +143,7 @@
 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);
--- a/sys/src/cmd/8a/a.h
+++ b/sys/src/cmd/8a/a.h
@@ -152,7 +152,7 @@
 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);
--- a/sys/src/cmd/cc/cc.h
+++ b/sys/src/cmd/cc/cc.h
@@ -556,7 +556,7 @@
 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);
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -755,18 +755,22 @@
 	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)
--- a/sys/src/cmd/cc/lexbody
+++ b/sys/src/cmd/cc/lexbody
@@ -238,18 +238,22 @@
 		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;
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -372,7 +372,7 @@
 	macend();
 }
 
-void
+int
 macexpand(Sym *s, char *b, int blen)
 {
 	char buf[2000];
@@ -386,7 +386,7 @@
 			goto toobig;
 		if(debug['m'])
 			print("#expand %s %s\n", s->name, b);
-		return;
+		return 1;
 	}
 	
 	nargs = (char)(*s->macro & ~VARMAC) - 1;
@@ -393,8 +393,10 @@
 	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 @@
 	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 @@
 	*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
--- a/sys/src/cmd/ka/a.h
+++ b/sys/src/cmd/ka/a.h
@@ -136,7 +136,7 @@
 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);
--- a/sys/src/cmd/qa/a.h
+++ b/sys/src/cmd/qa/a.h
@@ -138,7 +138,7 @@
 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);
--- a/sys/src/cmd/va/a.h
+++ b/sys/src/cmd/va/a.h
@@ -136,7 +136,7 @@
 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);