diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2020-08-18 09:20:08 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2020-08-18 09:20:08 +0200 |
commit | bfe947bbd5841142943e18e30b95439807d89478 (patch) | |
tree | 674754f9e5edc8e05672bbb536a938c44510dde3 | |
parent | fbd0896eef2f79bdd7006c9405e441b9f56562a8 (diff) | |
download | compilertests-bfe947bbd5841142943e18e30b95439807d89478.tar.gz compilertests-bfe947bbd5841142943e18e30b95439807d89478.tar.bz2 |
started with a parameter test for types in procedure calls
-rw-r--r-- | ecomp-c/ec.c | 25 | ||||
-rwxr-xr-x | ecomp-c/test.sh | 1 | ||||
-rw-r--r-- | ecomp-c/tests/procedure_call_value_parameters_wrong_types.e | 20 |
3 files changed, 43 insertions, 3 deletions
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 |