--- 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.orgReceived 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