git: 9front

Download patch

ref: 28fe2577dcd698837def524a1d56f7198e5442b6
parent: 36e61f8fc87848e3ec686f1a6f5fd649c94dc8e1
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);
--