case .F64X2 do return io.write_str(writer, "f64x2");
case .V128 do return io.write_str(writer, "v128");
- case .Type_Index do return io.write_str(writer, "type_expr");
+ case .Type_Index do io.write_str(writer, "type_expr");
+ case .Unsized_Int do io.write_str(writer, "<unsized int>");
+ case .Unsized_Float do io.write_str(writer, "<unsized float>");
}
}
Kind :: enum {
Void :: 0x00;
Bool :: 0x01;
+
+ Unsized_Int :: 0x02;
I8 :: 0x03;
U8 :: 0x04;
I16 :: 0x05;
I64 :: 0x09;
U64 :: 0x0a;
+ Unsized_Float :: 0x0b;
F32 :: 0x0c;
F64 :: 0x0d;
}
get_type_info :: (t: type_expr) -> ^Type_Info {
- if t < ~~0 || t >= ~~type_table.count do return null;
+ // Grossness to get around the fact that type_exprs are not technically comparable, because in most
+ // cases you should not compare them as the number assigned to them is arbitrary.
+ if ~~t < cast(i32) 0 || ~~t >= cast(i32) type_table.count do return null;
return type_table[cast(i32) t];
}
enum BasicFlag effective_flags = 0;
switch (type->kind) {
- case Type_Kind_Basic: effective_flags = type->Basic.flags; break;
- case Type_Kind_Pointer: effective_flags = Basic_Flag_Pointer; break;
- case Type_Kind_Enum: effective_flags = Basic_Flag_Integer; break;
+ case Type_Kind_Basic: effective_flags = type->Basic.flags; break;
+ case Type_Kind_Pointer: effective_flags = Basic_Flag_Pointer; break;
+ case Type_Kind_Enum: effective_flags = Basic_Flag_Integer; break;
+ case Type_Kind_Function: effective_flags = Basic_Flag_Equality; break;
}
return (binop_allowed[operation] & effective_flags) != 0;
CheckStatus check_binaryop_compare(AstBinaryOp** pbinop) {
AstBinaryOp* binop = *pbinop;
- if ( type_is_structlike_strict(binop->left->type)
- || type_is_structlike_strict(binop->right->type)) {
- report_bad_binaryop(binop);
- return Check_Error;
- }
-
// HACK: Since ^... to rawptr is a one way conversion, strip any pointers
// away so they can be compared as expected
Type* ltype = binop->left->type;
}
}
+ if (!binary_op_is_allowed(binop->operation, binop->left->type)) {
+ report_bad_binaryop(binop);
+ return Check_Error;
+ }
+
binop->type = &basic_types[Basic_Kind_Bool];
if (binop->flags & Ast_Flag_Comptime) {
// NOTE: Not a binary op