aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2005-10-05 12:16:46 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2005-10-05 12:16:46 +0000
commitcd7d18072bf16d7abb44798b1ad0922af2a807d8 (patch)
tree113927f7d424a8324b668c881722bf5f1d6c7cac /src
parentb85aefe2722c12ff5f99643dfb560155068a1b90 (diff)
downloadcflow-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.c18
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;
}

Return to:

Send suggestions and report system problems to the System administrator.