scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

commit 5e4fb6e5ad284273341f9056c927a3910b01adcf
parent f5a715b95c84ac8d612493e98c5ab6e09b5abe6c
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat, 18 Feb 2017 12:18:01 +0100

[tests] Update scc-tests.lst after cd855

Diffstat:
Mcc1/decl.c | 24+++++++++++++++++++-----
Mtests/execute/scc-tests.lst | 2+-
2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/cc1/decl.c b/cc1/decl.c @@ -17,7 +17,7 @@ static char sccsid[] = "@(#) ./cc1/decl.c"; struct declarators { - unsigned char nr; + unsigned char nr, ns; struct declarator { unsigned char op; TINT nelem; @@ -272,10 +272,13 @@ static void fundcl(struct declarators *dp) { Type *types[NR_FUNPARAM], type; - Symbol *syms[NR_FUNPARAM+1], **pars; + Symbol *sym, *syms[NR_FUNPARAM+1], **pars; int k_r, ntypes, nsyms; size_t size; + sym = dp->d[0].sym; + if ((sym->flags&SDECLARED) == 0) + install(dp->ns, sym); pushctx(); expect('('); type.n.elem = 0; @@ -748,14 +751,23 @@ identifier(struct decl *dcl) errorp("declared variable '%s' of incomplete type", name); } - sym = install(NS_IDEN, sym); - if (tp->op == FTN) { + if (tp->op != FTN) { + sym = install(NS_IDEN, sym); + } else { if (sclass == NOSCLASS) sclass = EXTERN; if (!strcmp(name, "main") && tp->type != inttype) { errorp("main shall be defined with a return type of int"); errorp("please contact __20h__ on irc.freenode.net (#bitreich-en) via IRC"); } + /* + * function identifiers are installed in fundcl() because + * we have to add a context for the parameters, and if we + * delay the install until here then we will install the + * symbol of the function after the parameters. + */ + if ((sym->flags&SEMITTED) != 0) + sym = NULL; } if (sym == NULL) { @@ -817,6 +829,7 @@ dodcl(int rep, Symbol *(*fun)(struct decl *), unsigned ns, Type *parent) do { stack.nr = 0; + stack.ns = ns; dcl.pars = NULL; dcl.type = base; @@ -852,7 +865,8 @@ decl(void) * against GLOBALCTX+1 */ if (curctx != GLOBALCTX+1 || yytoken == ';') { - emit(ODECL, sym); + if (!(sym->flags & SEMITTED)) + emit(ODECL, sym); /* * avoid non used warnings in prototypes */ diff --git a/tests/execute/scc-tests.lst b/tests/execute/scc-tests.lst @@ -94,7 +94,7 @@ 0099-tentative.c 0102-bug.c 0103-voidparm.c -0104-voidparm.c +0104-qbebug.c 0105-shl.c 0106-ppcast.c 0107-bnot.c