move to nominal typing for some types
This commit is contained in:
parent
6ff868a646
commit
71fb88602f
1 changed files with 10 additions and 11 deletions
|
@ -56,8 +56,6 @@ typedef struct {
|
||||||
static const Symbol InvalidSymbol = {.kind = SymInvalid};
|
static const Symbol InvalidSymbol = {.kind = SymInvalid};
|
||||||
static const DataType *InvalidDataType = &(DataType){.kind = DtkInvalid};
|
static const DataType *InvalidDataType = &(DataType){.kind = DtkInvalid};
|
||||||
|
|
||||||
static DataTypeCheck
|
|
||||||
datatype_struct_cmp(SemaCtx *sctx, DataType *s1, DataType *s2);
|
|
||||||
static DataTypeCheck
|
static DataTypeCheck
|
||||||
datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2);
|
datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2);
|
||||||
static DataType *
|
static DataType *
|
||||||
|
@ -414,7 +412,7 @@ sema_expr_list(SemaCtx *sctx, Vec(Ast *) exprs, Location loc)
|
||||||
|
|
||||||
/* Structurally compare two structural data types. */
|
/* Structurally compare two structural data types. */
|
||||||
static DataTypeCheck
|
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);
|
compiler_assert(sctx->cm, s1->kind == DtkStruct && s2->kind == DtkStruct);
|
||||||
const DataTypeCompound *s1s = &s1->compound;
|
const DataTypeCompound *s1s = &s1->compound;
|
||||||
|
@ -444,7 +442,7 @@ datatype_array_cmp(SemaCtx *sctx, DataType *a1, DataType *a2)
|
||||||
}
|
}
|
||||||
|
|
||||||
static DataTypeCheck
|
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};
|
DataTypeCheck tchk = {.ok = true};
|
||||||
|
|
||||||
|
@ -484,7 +482,7 @@ datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2)
|
||||||
if (dt1 == nil || dt2 == nil)
|
if (dt1 == nil || dt2 == nil)
|
||||||
return (DataTypeCheck){false, Sl("")};
|
return (DataTypeCheck){false, Sl("")};
|
||||||
/* TODO: return more information in case of a mismatch... */
|
/* TODO: return more information in case of a mismatch... */
|
||||||
if (dt1 == dt2) /* shallow */
|
if (dt1 == dt2) /* shallow comparison */
|
||||||
return (DataTypeCheck){.ok = true};
|
return (DataTypeCheck){.ok = true};
|
||||||
if (dt1->kind != dt2->kind)
|
if (dt1->kind != dt2->kind)
|
||||||
return (DataTypeCheck){.ok = false};
|
return (DataTypeCheck){.ok = false};
|
||||||
|
@ -492,16 +490,17 @@ datatype_cmp(SemaCtx *sctx, DataType *dt1, DataType *dt2)
|
||||||
switch (dt1->kind) {
|
switch (dt1->kind) {
|
||||||
case DtkBasic:
|
case DtkBasic:
|
||||||
return datatype_basic_cmp(sctx, dt1, dt2);
|
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:
|
case DtkArray:
|
||||||
return datatype_array_cmp(sctx, dt1, dt2);
|
return datatype_array_cmp(sctx, dt1, dt2);
|
||||||
|
/* Nominally typed, should have been catched by the shallow comparison above */
|
||||||
case DtkBool:
|
case DtkBool:
|
||||||
case DtkVoid:
|
case DtkVoid:
|
||||||
return (DataTypeCheck){.ok = true};
|
case DtkStruct:
|
||||||
|
case DtkUnion:
|
||||||
|
case DtkProc:
|
||||||
|
break;
|
||||||
|
case DtkInvalid:
|
||||||
|
unreachable();
|
||||||
}
|
}
|
||||||
return (DataTypeCheck){.ok = false};
|
return (DataTypeCheck){.ok = false};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue