From bfe947bbd5841142943e18e30b95439807d89478 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Tue, 18 Aug 2020 09:20:08 +0200 Subject: started with a parameter test for types in procedure calls --- ecomp-c/ec.c | 25 +++++++++++++++++++--- ecomp-c/test.sh | 1 + .../procedure_call_value_parameters_wrong_types.e | 20 +++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 ecomp-c/tests/procedure_call_value_parameters_wrong_types.e diff --git a/ecomp-c/ec.c b/ecomp-c/ec.c index dfd9d76..1e8dc63 100644 --- a/ecomp-c/ec.c +++ b/ecomp-c/ec.c @@ -1601,12 +1601,27 @@ static void parseProcedureCall( Scope *scope ) } } - /* TODO: check parameter list types, not only cardinality - */ + /* check cardinality of parameters */ if( nof_actual_params != nof_expected_params ) { Abort( "procedure '%s' expects %d parameter(s), but %d were given", symbol->name, nof_expected_params, nof_actual_params ); } - + + /* check types */ + if( nof_expected_params > 0 ) { + node = head; + param = symbol->scope->symbol; + while( param != NULL ) { + if( param->offset < 0 ) { + param = param->next; + continue; + } + fprintf( stderr, "%s %s\n", node->actual_type->name, + symbol->scope->symbol->type->name ); + node = node->next; + param = param->next; + } + } + /* emit assembly comments */ Emit( "; CALL %s", symbol->label ); if( nof_actual_params > 0 ) { @@ -2275,6 +2290,10 @@ static void parseProcedureDeclaration( Scope *scope ) } } + /* TODO: free only locals, keep parameters in scope, + * they are needed for type checks when calling the + * procedure + */ free_scope( symbol->scope ); } diff --git a/ecomp-c/test.sh b/ecomp-c/test.sh index 12ba9cf..daf1084 100755 --- a/ecomp-c/test.sh +++ b/ecomp-c/test.sh @@ -29,6 +29,7 @@ procedure_scoping procedure_call_value_parameters procedure_call_too_many_parameters procedure_call_too_few_parameters +procedure_call_value_parameters_wrong_types example_divisors example_divisors_array_result example_reverse_array diff --git a/ecomp-c/tests/procedure_call_value_parameters_wrong_types.e b/ecomp-c/tests/procedure_call_value_parameters_wrong_types.e new file mode 100644 index 0000000..cd86ab8 --- /dev/null +++ b/ecomp-c/tests/procedure_call_value_parameters_wrong_types.e @@ -0,0 +1,20 @@ +/* + * procedure call with value parameters with a type mismatch + */ + +module procedure_call_value_parameters_wrong_types; + +var + i : integer := 1; + +procedure proc( x : integer ); +var + l : integer; +begin + l := x; + i := l; +end + +begin + proc( true ); +end -- cgit v1.2.3-54-g00ecf