diff --git a/fec/Makefile b/fec/Makefile index 21a8e3d..cd71ce6 100644 --- a/fec/Makefile +++ b/fec/Makefile @@ -1,7 +1,7 @@ CC ?= cc CFLAGS ?= -O2 -Wall -Wextra -std=c89 CPPFLAGS ?= -Isrc -SRC = src/arena.c src/diag.c src/lexer.c src/ast.c src/parser.c src/types.c src/m7.c src/own.c src/check_m7.c src/lower.c src/emit_c_m7.c src/driver.c +SRC = src/arena.c src/diag.c src/lexer.c src/ast.c src/parser.c src/types.c src/m7.c src/own.c src/check_m7.c src/lower.c src/emitcm7.c src/driver.c OBJ = $(SRC:.c=.o) .PHONY: all clean dos-build diff --git a/fec/build-dos.bat b/fec/build-dos.bat index ecde577..104d28f 100644 --- a/fec/build-dos.bat +++ b/fec/build-dos.bat @@ -32,7 +32,7 @@ if errorlevel 1 goto build_fail wcl -q -za -wx -bt=dos -ml -k32768 -c -fo=lower.obj src\lower.c if errorlevel 1 goto build_fail rem Use an unambiguous short object name for the M7 emitter source. -wcl -q -za -wx -bt=dos -ml -k32768 -c -fo=emitc.obj src\emit_c_m7.c +wcl -q -za -wx -bt=dos -ml -k32768 -c -fo=emitc.obj src\emitcm7.c if errorlevel 1 goto build_fail wcl -q -za -wx -bt=dos -ml -k32768 -c -fo=driver.obj src\driver.c if errorlevel 1 goto build_fail diff --git a/fec/src/check.c b/fec/src/check.c index 01a9396..1258857 100644 --- a/fec/src/check.c +++ b/fec/src/check.c @@ -811,6 +811,7 @@ static FeType *check_index(FeCheckerState *s, FeNode *n) static FeType *check_identifier(FeCheckerState *s, FeNode *n, int read) { FeSym *sym; + (void)read; /* TRIAL PATCH: silence W303 under the check_m7.c wrapper */ sym = find_symbol(s->scope, n->text ? n->text : ""); if (!sym) { FeType *named=fe_type_intern(&s->c->types,n->text ? n->text : ""); diff --git a/fec/src/check_m7.c b/fec/src/check_m7.c index 193ecbf..9cfc506 100644 --- a/fec/src/check_m7.c +++ b/fec/src/check_m7.c @@ -98,6 +98,7 @@ static FeType *m7_check_expected(FeCheckerState *s, FeNode *value, return actual; } +/* TRIAL PATCH: m7_error_same was dead (W202); removed for this run. static int m7_error_same(FeCheckerState *s, FeType *a, FeType *b) { FeType *ea; @@ -108,6 +109,7 @@ static int m7_error_same(FeCheckerState *s, FeType *a, FeType *b) eb=fe_m7_error_type(&s->c->types,b); return ea && eb && fe_type_equal(ea,eb); } +*/ static FeType *m7_member_field(FeCheckerState *s, FeNode *n, FeType *base) { diff --git a/fec/src/emit_c_m7.c b/fec/src/emitcm7.c similarity index 100% rename from fec/src/emit_c_m7.c rename to fec/src/emitcm7.c diff --git a/src/ferrolang_vm/registry.py b/src/ferrolang_vm/registry.py index 74d129a..e967920 100644 --- a/src/ferrolang_vm/registry.py +++ b/src/ferrolang_vm/registry.py @@ -17,6 +17,7 @@ M3 = "TESTS\\M3" M4 = "TESTS\\M4" M5 = "TESTS\\M5" M6 = "TESTS\\M6" +M7 = "TESTS\\M7" OUT = "OUT" # Emitted-C basenames that were hand-shortened for DOS 8.3. Keyed by milestone @@ -193,6 +194,17 @@ CASES: list[Case] = [ "okbranch", "okdefer", "okglobcp", "oklast", "okr8free", "okr8join", "okr8meth", "okr8stat", "okrebor", "okrtlast", "okshare", "okslreb", "okstatic", "oktemp", "oktrim", "okwcall")], + + # -- M7: optionals and error unions --------------------------------------- + *[_case(7, name, f"FEC.EXE --check {_fe(M7, name)}", False) for name in ( + "badcatch", "baddef", "baddir", "badercod", "badernam", "badetype", + "badnull", "badoref", "badorel", "badproj", "badqmark", "badret", + "badsome", "badtry", "badzero")], + *[_case(7, name, _emit(_fe(M7, name), f"{OUT}\\{name.upper()}.C", + output_first=True)) for name in ( + "okcatch", "okcatmov", "okcvoid", "okdeflt", "okiflet", "okmatch", + "oknull", "okorelse", "okpatvw", "okproj", "okrepl", "oktrdef", + "oktry")], ] MAX_MILESTONE: int = max(case.milestone for case in CASES)