summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-08-18 09:20:08 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2020-08-18 09:20:08 +0200
commitbfe947bbd5841142943e18e30b95439807d89478 (patch)
tree674754f9e5edc8e05672bbb536a938c44510dde3
parentfbd0896eef2f79bdd7006c9405e441b9f56562a8 (diff)
downloadcompilertests-bfe947bbd5841142943e18e30b95439807d89478.tar.gz
compilertests-bfe947bbd5841142943e18e30b95439807d89478.tar.bz2
started with a parameter test for types in procedure calls
-rw-r--r--ecomp-c/ec.c25
-rwxr-xr-xecomp-c/test.sh1
-rw-r--r--ecomp-c/tests/procedure_call_value_parameters_wrong_types.e20
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