diff options
Diffstat (limited to 'ecomp-c/ec.c')
-rw-r--r-- | ecomp-c/ec.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/ecomp-c/ec.c b/ecomp-c/ec.c index 7501ec5..0ff71bd 100644 --- a/ecomp-c/ec.c +++ b/ecomp-c/ec.c @@ -2187,7 +2187,7 @@ static void parseProcedureDeclaration( Scope *scope ) size_params = 0; } else if( sym == S_lparen ) { - Symbol *param, *copy; + Symbol *param, *copy, *defparam; int offset; parseParameterDeclarationList( symbol->scope ); @@ -2212,14 +2212,47 @@ static void parseProcedureDeclaration( Scope *scope ) param->name, param->offset, size ); offset -= size; } - - copy = copy_symbol( param ); - copy->scope = NULL; - copy->next = symbol->param; - symbol->param = copy; - param = param->next; } + + /* compare types in case of an already existing forward declaration */ + if( symbol->param != NULL ) { + param = symbol->scope->symbol; + defparam = symbol->param; + while( param != NULL || defparam != NULL ) { + if( param == NULL || defparam == NULL ) { + if( param == NULL ) { + Abort( "Prototype mismatch for procedure '%s', too few parameter in procedure declaration", symbol->name ); + } else { + Abort( "Prototype mismatch for procedure '%s', too few parameter in forward declaration", symbol->name ); + } + } + if( !is_compatible_type( defparam->type, param->type ) ) { + Abort( "Incompatible parameter type between forward declaration for parameter '%s' in procedure '%s', expecting type '%s', got '%s'", + param->name, symbol->name, defparam->type->name, param->type->name ); + } + defparam = defparam->next; + param = param->next; + } + free_symbol( symbol->param ); + symbol->param = NULL; + } + + /* remember types and names of parameters (keeping the variable names + * of the definition of the procedure and not the one of the forward + * declaration */ + if( symbol->param == NULL ) { + param = symbol->scope->symbol; + while( param != NULL ) { + if( param->class == SYMBOL_CLASS_VARIABLE ) { + copy = copy_symbol( param ); + copy->scope = NULL; + copy->next = symbol->param; + symbol->param = copy; + } + param = param->next; + } + } } /* procedure body */ |