Skip to content

Commit 11d88fc

Browse files
committed
fixed: some intrinsic interfaces might need to yield
1 parent 2b6827e commit 11d88fc

3 files changed

Lines changed: 31 additions & 15 deletions

File tree

compiler/include/astnodes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2413,7 +2413,7 @@ AstFunction* macro_resolve_header(Context *context, AstMacro* macro, Arguments*
24132413
Type* polymorphic_struct_lookup(Context *context, AstPolyStructType* ps_type, bh_arr(AstPolySolution) slns, OnyxFilePos pos, b32 error_if_failed);
24142414
Type* polymorphic_union_lookup(Context *context, AstPolyUnionType* pu_type, bh_arr(AstPolySolution) slns, OnyxFilePos pos, b32 error_if_failed);
24152415

2416-
b32 resolve_intrinsic_interface_constraint(Context *context, AstConstraint *constraint);
2416+
TypeMatch resolve_intrinsic_interface_constraint(Context *context, AstConstraint *constraint);
24172417

24182418
void track_declaration_for_symbol_info(Context *context, OnyxFilePos, AstNode *);
24192419
void track_documentation_for_symbol_info(Context *context, AstNode *, AstBinding *);

compiler/src/astnodes.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,18 +1996,16 @@ AstCall * create_implicit_for_expansion_call(Context *context, AstFor *fornode)
19961996
}
19971997

19981998

1999-
2000-
b32 resolve_intrinsic_interface_constraint(Context *context, AstConstraint *constraint) {
2001-
AstInterface *interface = constraint->interface;
2002-
Type* type = type_build_from_ast(context, (AstType *) constraint->args[0]);
2003-
if (!type) return 0;
2004-
1999+
static b32 resolve_intrinsic_interface_constraint_inner(Context *context, AstInterface *interface, Type *type) {
20052000
if (!strcmp(interface->name, "type_is_bool")) return type_is_bool(type);
20062001
if (!strcmp(interface->name, "type_is_int")) return type_is_integer(type);
20072002
if (!strcmp(interface->name, "type_is_float")) return type->kind == Type_Kind_Basic && (type->Basic.flags & Basic_Flag_Float);
20082003
if (!strcmp(interface->name, "type_is_number")) return type->kind == Type_Kind_Basic && (type->Basic.flags & Basic_Flag_Numeric);
20092004
if (!strcmp(interface->name, "type_is_simd")) return type->kind == Type_Kind_Basic && (type->Basic.flags & Basic_Flag_SIMD);
2010-
if (!strcmp(interface->name, "type_is_pointer")) return type_is_pointer(type) || type_is_rawptr(type);
2005+
if (!strcmp(interface->name, "type_is_pointer")) {
2006+
printf("RUNNING TYPE IS POINTER ON: %s\n", type_get_name(context, type));
2007+
return type_is_pointer(type) || type_is_rawptr(type);
2008+
}
20112009
if (!strcmp(interface->name, "type_is_enum")) return type->kind == Type_Kind_Enum;
20122010
if (!strcmp(interface->name, "type_is_simple")) return type->kind == Type_Kind_Basic
20132011
|| type->kind == Type_Kind_Enum
@@ -2022,3 +2020,16 @@ b32 resolve_intrinsic_interface_constraint(Context *context, AstConstraint *cons
20222020
if (!strcmp(interface->name, "type_is_function")) return type->kind == Type_Kind_Function;
20232021
return 0;
20242022
}
2023+
2024+
TypeMatch resolve_intrinsic_interface_constraint(Context *context, AstConstraint *constraint) {
2025+
AstInterface *interface = constraint->interface;
2026+
Type* type = type_build_from_ast(context, (AstType *) constraint->args[0]);
2027+
if (!type) return TYPE_MATCH_YIELD;
2028+
2029+
if (resolve_intrinsic_interface_constraint_inner(context, interface, type)) {
2030+
return TYPE_MATCH_SUCCESS;
2031+
} else {
2032+
return TYPE_MATCH_FAILED;
2033+
}
2034+
}
2035+

compiler/src/checker.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5244,13 +5244,18 @@ CHECK_FUNC(interface_constraint, AstConstraint *constraint) {
52445244

52455245
// #intrinsic interfaces
52465246
if (constraint->interface->is_intrinsic) {
5247-
b32 success = resolve_intrinsic_interface_constraint(context, constraint);
5248-
if (success) {
5249-
*constraint->report_status = Constraint_Check_Status_Success;
5250-
return Check_Complete;
5251-
} else {
5252-
*constraint->report_status = Constraint_Check_Status_Failed;
5253-
return Check_Failed;
5247+
TypeMatch result = resolve_intrinsic_interface_constraint(context, constraint);
5248+
switch (result) {
5249+
case TYPE_MATCH_SUCCESS:
5250+
*constraint->report_status = Constraint_Check_Status_Success;
5251+
return Check_Complete;
5252+
5253+
case TYPE_MATCH_FAILED:
5254+
*constraint->report_status = Constraint_Check_Status_Failed;
5255+
return Check_Failed;
5256+
5257+
default:
5258+
return Check_Yield;
52545259
}
52555260
}
52565261

0 commit comments

Comments
 (0)