From 71fb88602f1be33cfd872baaaa3d39f5e35a6022 Mon Sep 17 00:00:00 2001 From: tocariimaa Date: Mon, 20 Jan 2025 19:30:22 -0300 Subject: [PATCH] move to nominal typing for some types --- compiler/sema.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/compiler/sema.c b/compiler/sema.c index 11d0921..2dac8a3 100644 --- a/compiler/sema.c +++ b/compiler/sema.c @@ -56,8 +56,6 @@ typedef struct { static const Symbol InvalidSymbol = {.kind = SymInvalid}; static const DataType *InvalidDataType = &(DataType){.kind = DtkInvalid}; -static DataTypeCheck -datatype_struct_cmp(SemaCtx *sctx, DataType *s1, DataType *s2); static DataTypeCheck datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2); static DataType * @@ -414,7 +412,7 @@ sema_expr_list(SemaCtx *sctx, Vec(Ast *) exprs, Location loc) /* Structurally compare two structural data types. */ static DataTypeCheck -datatype_struct_cmp(SemaCtx *sctx, DataType *s1, DataType *s2) +datatype_struct_can_cast(SemaCtx *sctx, DataType *s1, DataType *s2) { compiler_assert(sctx->cm, s1->kind == DtkStruct && s2->kind == DtkStruct); const DataTypeCompound *s1s = &s1->compound; @@ -444,7 +442,7 @@ datatype_array_cmp(SemaCtx *sctx, DataType *a1, DataType *a2) } static DataTypeCheck -datatype_proc_cmp(SemaCtx *sctx, DataType *pc1, DataType *pc2) +datatype_proc_can_cast(SemaCtx *sctx, DataType *pc1, DataType *pc2) { DataTypeCheck tchk = {.ok = true}; @@ -484,7 +482,7 @@ datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2) if (dt1 == nil || dt2 == nil) return (DataTypeCheck){false, Sl("")}; /* TODO: return more information in case of a mismatch... */ - if (dt1 == dt2) /* shallow */ + if (dt1 == dt2) /* shallow comparison */ return (DataTypeCheck){.ok = true}; if (dt1->kind != dt2->kind) return (DataTypeCheck){.ok = false}; @@ -492,16 +490,17 @@ datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2) switch (dt1->kind) { case DtkBasic: return datatype_basic_cmp(sctx, dt1, dt2); - case DtkStruct: - case DtkUnion: - return datatype_struct_cmp(sctx, dt1, dt2); - case DtkProc: - return datatype_proc_cmp(sctx, dt1, dt2); case DtkArray: return datatype_array_cmp(sctx, dt1, dt2); + /* Nominally typed, should have been catched by the shallow comparison above */ case DtkBool: case DtkVoid: - return (DataTypeCheck){.ok = true}; + case DtkStruct: + case DtkUnion: + case DtkProc: + break; + case DtkInvalid: + unreachable(); } return (DataTypeCheck){.ok = false}; }