diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2005-10-05 12:16:46 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2005-10-05 12:16:46 +0000 |
commit | cd7d18072bf16d7abb44798b1ad0922af2a807d8 (patch) | |
tree | 113927f7d424a8324b668c881722bf5f1d6c7cac /src | |
parent | b85aefe2722c12ff5f99643dfb560155068a1b90 (diff) | |
download | cflow-cd7d18072bf16d7abb44798b1ad0922af2a807d8.tar.gz cflow-cd7d18072bf16d7abb44798b1ad0922af2a807d8.tar.bz2 |
Fix handling of function formal parameters:
(parm_level): New variable
(parse_declaration): Call delete_parms
(maybe_parm_list): Keep track of the parameter nesting level.
(func_body): Call move_parms
(declare): Special handling for parameters.
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/parser.c b/src/parser.c index 0b9373c..9dc7997 100644 --- a/src/parser.c +++ b/src/parser.c @@ -48,9 +48,11 @@ void maybe_parm_list(int *parm_cnt_return); void call(char*, int); void reference(char*, int); -int level; -Symbol *caller; -struct obstack text_stk; +int level; /* Current nesting level */ +Symbol *caller; /* Current caller */ +struct obstack text_stk; /* Obstack for composing declaration line */ + +int parm_level; /* Parameter declaration nesting level */ typedef struct { int type; @@ -365,6 +367,7 @@ parse_declaration(Ident *ident, int parm) parse_function_declaration(ident, parm); else parse_variable_declaration(ident, parm); + delete_parms(parm_level); } @@ -849,11 +852,13 @@ maybe_parm_list(int *parm_cnt_return) Ident ident; int level; + parm_level++; while (nexttoken()) { switch (tok.type) { case ')': if (parm_cnt_return) *parm_cnt_return = parmcnt; + parm_level--; return; case ',': break; @@ -893,6 +898,7 @@ func_body() Ident ident; level++; + move_parms(level); while (level) { cleanup_stack(); nexttoken(); @@ -951,7 +957,11 @@ declare(Ident *ident) sp = install(ident->name); sp->type = SymIdentifier; sp->storage = ident->storage; - sp->level = level; + if (parm_level) { + sp->level = parm_level; + sp->flag = symbol_parm; + } else + sp->level = level; sp->arity = -1; return; } |