From 3c50c182a88609d4a8bbb16255ba56d414440f63 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 12 May 2024 16:09:24 -0400 Subject: Typecheck method promotion for interfaces --- types.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'types.c') diff --git a/types.c b/types.c index 85060b4c..ca0f77f3 100644 --- a/types.c +++ b/types.c @@ -270,6 +270,19 @@ bool can_promote(type_t *actual, type_t *needed) if (needed->tag == ClosureType && actual->tag == FunctionType) return type_eq(actual, Match(needed, ClosureType)->fn); + if (actual->tag == FunctionType && needed->tag == FunctionType) { + for (arg_t *actual_arg = Match(actual, FunctionType)->args, *needed_arg = Match(needed, FunctionType)->args; + actual_arg || needed_arg; actual_arg = actual_arg->next, needed_arg = needed_arg->next) { + if (!actual_arg || !needed_arg) return false; + if (type_eq(actual_arg->type, needed_arg->type)) continue; + if (actual_arg->type->tag == PointerType && needed_arg->type->tag == PointerType + && can_promote(actual_arg->type, needed_arg->type)) + continue; + return false; + } + return true; + } + return false; } -- cgit v1.2.3