From b880d8942e1539875d8209e18bf3d21011220ff8 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 13 Nov 2021 11:24:23 +1100 Subject: [PATCH] oceani-tests: include failing test in valgrind testing We want memory error caught in failing tests too. Signed-off-by: NeilBrown --- csrc/oceani-tests.mdc | 11 ++++++++--- csrc/oceani.mdc | 24 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/csrc/oceani-tests.mdc b/csrc/oceani-tests.mdc index 6bc40cb..fbc5a2f 100644 --- a/csrc/oceani-tests.mdc +++ b/csrc/oceani-tests.mdc @@ -35,6 +35,8 @@ arguments separated from the name by commas. For each test, there is a section oceani_tests := ## test list + oceani_valg_tests := $(oceani_tests) + ## combine test lists tests:: oceani_test_suite oceani_test_suite: oceani coverage_oceani @@ -80,11 +82,11 @@ arguments separated from the name by commas. For each test, there is a section @mv *.gcov coverage ; [ -f .gcov ] && mv .gcov coverage || true @rm -f .tmp* - @[ -n "$$SKIP_VALGRIND" ] || for T in $(oceani_tests); do \ + @[ -n "$$SKIP_VALGRIND" ] || for T in $(oceani_valg_tests); do \ echo -n "Valgrind $$T.. "; \ i="$$IFS"; IFS=,; set $$T; IFS="$$i"; t=$$1; shift; \ - if ! valgrind --error-exitcode=1 --log-file=.tmp.valg ./oceani --section "test: $$t" oceani-tests.mdc $${1+"$$@"} \ - > /dev/null 2>&1 ; then \ + if valgrind --error-exitcode=42 --log-file=.tmp.valg ./oceani --section "test: $$t" oceani-tests.mdc $${1+"$$@"} \ + > /dev/null 2>&1 ; [ $$? -eq 42 ] ; then \ echo "FAILED"; cat .tmp.valg; exit 1; fi ; \ if grep 'LEAK SUMMARY' .tmp.valg > /dev/null; then \ echo "valgrind found LEAKS"; cat .tmp.valg ; exit 1 ; fi; \ @@ -713,6 +715,9 @@ separate file first, then run from there. ./coverage_oceani --section "test: $$t" oceani-tests.mdc > /dev/null 2>&1 ;\ done || true +###### combine test lists + oceani_valg_tests += $(oceani_failing_tests) + ###### test list oceani_failing_tests := syn1 oceani_failing_tests += tokerr diff --git a/csrc/oceani.mdc b/csrc/oceani.mdc index 43616ec..0334af1 100644 --- a/csrc/oceani.mdc +++ b/csrc/oceani.mdc @@ -261,9 +261,10 @@ structures can be used. free(s); s = t; } - if (!context.parse_error) { - ## free global vars - } + // FIXME parser should pop scope even on error + while (context.scope_depth > 0) + scope_pop(&context); + ## free global vars ## free context types ## free context storage exit(context.parse_error ? 1 : 0); @@ -1875,9 +1876,10 @@ with a const size by whether they are prepared at parse time or not. t->array.vsize = NULL; if (number_parse(num, tail, $2.txt) == 0) tok_err(c, "error: unrecognised number", &$2); - else if (tail[0]) + else if (tail[0]) { tok_err(c, "error: unsupported number suffix", &$2); - else { + mpq_clear(num); + } else { t->array.size = mpz_get_ui(mpq_numref(num)); if (mpz_cmp_ui(mpq_denref(num), 1) != 0) { tok_err(c, "error: array size must be an integer", @@ -3915,6 +3917,7 @@ it is declared, and error will be raised as the name is created as type_err(c, "Variable declared with no type or value: %v", $1, NULL, 0, NULL); + free_var($1); } else { $0 = new(binode); $0->op = Declare; @@ -4675,11 +4678,12 @@ searching through for the Nth constant for decreasing N. v->where_set = var; var->var = v; v->constant = 1; + v->global = 1; } else { - v = var_ref(c, $1.txt); + struct variable *vorig = var_ref(c, $1.txt); tok_err(c, "error: name already declared", &$1); type_err(c, "info: this is where '%v' was first declared", - v->where_decl, NULL, 0, NULL); + vorig->where_decl, NULL, 0, NULL); } do { ok = 1; @@ -4754,8 +4758,12 @@ is a bit more interesting at this level. name->type->function.return_type = ret; global_alloc(c, name->type, name, &fn); var_block_close(c, CloseSequential, code); - } else + } else { + free_binode(args); + free_type(ret); + free_exec(code); var_block_close(c, CloseSequential, NULL); + } return name; } -- 2.43.0