---
 src/cmd/cc/cc1/decl.c          |  5 +++++
 src/cmd/cc/cc1/expr.c          | 21 ++++++++++++++++++++-
 tests/cc/error/0036-func.c     | 13 +++++++++++++
 tests/cc/error/scc-tests.lst   |  1 +
 tests/cc/execute/0225-func.c   | 12 ++++++++++++
 tests/cc/execute/scc-tests.lst |  1 +
 6 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 tests/cc/error/0036-func.c
 create mode 100644 tests/cc/execute/0225-func.c
diff --git a/src/cmd/cc/cc1/decl.c b/src/cmd/cc/cc1/decl.c
index d123cdc8..058a9eb7 100644
--- a/src/cmd/cc/cc1/decl.c
+++ b/src/cmd/cc/cc1/decl.c
_at_@ -272,6 +272,9 @@ identifier(struct decl *dcl)
 		}
 	}
 
+	if (strcmp(name, "__func__") == 0)
+		errorp("__func__ is a reserved variable name");
+
 	if (sym->flags & SDECLARED) {
 		sym = redcl(dcl->sym, tp, sclass);
 	} else {
_at_@ -363,6 +366,8 @@ parameter(struct decl *dcl)
 			       sym->name);
 			return NULL;
 		}
+		if (strcmp(name, "__func__") == 0)
+			errorp("__func__ is a reserved variable name");
 		sym->flags |= SDECLARED;
 	}
 
diff --git a/src/cmd/cc/cc1/expr.c b/src/cmd/cc/cc1/expr.c
index 75edb4b4..1d33c289 100644
--- a/src/cmd/cc/cc1/expr.c
+++ b/src/cmd/cc/cc1/expr.c
_at_@ -674,6 +674,23 @@ adjstrings(Symbol *sym)
 	return sym;
 }
 
+static Node *
+funcsym(Symbol *sym)
+{
+	char *s;
+	Node *np;
+
+	sym = install(sym->ns, sym);
+	s = curfun->name;
+	np = constnode(newstring(s, strlen(s)+1));
+	sym->type = np->type;
+	sym->flags |= SHASINIT | SLOCAL | SUSED;
+	emit(ODECL, sym);
+	emit(OINIT, np);
+
+	return varnode(sym);
+}
+
 /*************************************************************
  * grammar functions                                         *
  *************************************************************/
_at_@ -721,10 +738,12 @@ primary(void)
 			np = varnode(sym);
 		} else if (namespace == NS_CPP) {
 			np = constnode(zero);
+		} else if (!strcmp(yytext, "__func__") && curctx > PARAMCTX) {
+			np = funcsym(sym);
 		} else {
 			errorp("'%s' undeclared", yytext);
 			sym->type = inttype;
-			sym = install(sym->ns, yylval.sym);
+			sym = install(sym->ns, sym);
 			sym->flags |= SUSED;
 			np = varnode(sym);
 		}
diff --git a/tests/cc/error/0036-func.c b/tests/cc/error/0036-func.c
new file mode 100644
index 00000000..eccb744c
--- /dev/null
+++ b/tests/cc/error/0036-func.c
_at_@ -0,0 +1,13 @@
+/*
+PATTERN:
+0036-func.c:8: error: __func__ is a reserved variable name
+0036-func.c:10: error: __func__ is a reserved variable name
+0036-func.c:13: warning: '__func__' defined but not used
+.
+*/
+int __func__;
+
+int foo(int __func__)
+{
+	return 0;
+}
diff --git a/tests/cc/error/scc-tests.lst b/tests/cc/error/scc-tests.lst
index d61a3e18..7dbe4e71 100644
--- a/tests/cc/error/scc-tests.lst
+++ b/tests/cc/error/scc-tests.lst
_at_@ -33,3 +33,4 @@
 0033-character.c
 0034-eof.c
 0035-cpp.c
+0036-func.c
diff --git a/tests/cc/execute/0225-func.c b/tests/cc/execute/0225-func.c
new file mode 100644
index 00000000..823866d6
--- /dev/null
+++ b/tests/cc/execute/0225-func.c
_at_@ -0,0 +1,12 @@
+int
+main(void)
+{
+	char *p = __func__;
+	int i;
+
+	for (i = 0; i < sizeof(__func__); i++) {
+		if (p[i] != "main"[i])
+			return 1;
+	}
+	return 0;
+}
diff --git a/tests/cc/execute/scc-tests.lst b/tests/cc/execute/scc-tests.lst
index 4eea22e9..6f5080e2 100644
--- a/tests/cc/execute/scc-tests.lst
+++ b/tests/cc/execute/scc-tests.lst
_at_@ -215,3 +215,4 @@
 0222-ifdef.c
 0223-macro.c
 0224-macro.c
+0225-func.c
-- 
2.40.0
--
To unsubscribe send a mail to scc-dev+unsubscribe_at_simple-cc.org
Received on Mon 17 Sep 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Fri 21 Apr 2023 - 16:30:12 CEST