Fix type checker not promoting ints. Fix some issues in the codegen.

This commit is contained in:
2024-09-11 07:24:10 +02:00
parent 517209c886
commit ff668b6c95
5 changed files with 98 additions and 24 deletions

View File

@@ -5,7 +5,8 @@
/////////////////////////////////////
//~ nbr: Error reporting TODOs
//
// [x] Improve error reporting on mismatched overloads when types don't match, but arity does
// [ ] Add and error for using keywords as names, or rename the dx11 keywords in the resulting hlsl shader.
// [x] Improve error reporting on mismatched overloads when types don't match, but arity does.
// [x] Improve error reporting for type mismatches in general. It seems like the expect node is not always correct.
VERTEX_MAIN_FUNCTION_PREFIX :: "vertex";
@@ -1270,7 +1271,6 @@ create_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable
size_var := check_node(checker, size_node);
if h2tv(checker, size_var).type != .Int {
//@Incomplete(niels): Type mismatch here. With integral type required message.
print("Shiet\n");
}
}
@@ -1456,6 +1456,7 @@ check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_H
variable, handle := new_type_variable(checker);
lhs_type := h2tv(checker, lhs_var);
variable.type = lhs_type.type;
variable.typename = lhs_type.typename;
variable.scope = lhs_type.scope;
variable.source_node = node;
node.type_variable = handle;
@@ -1470,7 +1471,9 @@ check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_H
create_equivalence_constraint(checker, rhs_var, lhs_var, node);
proper_variable, rhs_handle := new_type_variable(checker);
proper_variable.type = h2tv(checker, lhs_var).type;
lhs_type_var := h2tv(checker, lhs_var);
proper_variable.type = lhs_type_var.type;
proper_variable.typename = lhs_type_var.typename;
proper_variable.source_node = h2tv(checker, lhs_var).source_node;
proper_variable.struct_field_parent = h2tv(checker, lhs_var).struct_field_parent;
@@ -1579,6 +1582,15 @@ types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rh
case .Half; #through;
case .Float; #through;
case .Double; {
if rhs_var.type == .Struct {
if rhs_var.typename == {
case "float2"; #through;
case "float3"; #through;
case "float4"; {
return true;
}
}
}
return rhs_var.type == .Int || rhs_var.type == .Half ||
rhs_var.type == .Float || rhs_var.type == .Double;
}
@@ -1593,6 +1605,16 @@ types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rh
lhs_node := lhs_var.source_node;
rhs_node := rhs_var.source_node;
if rhs_var.type != .Struct {
if lhs_var.typename == {
case "float2"; #through;
case "float3"; #through;
case "float4"; {
return rhs_var.type == .Int || rhs_var.type == .Half || rhs_var.type == .Double || rhs_var.type == .Float;
}
}
}
lhs_struct := find_symbol(checker, lhs_var.typename, xx 1);
rhs_struct := find_symbol(checker, rhs_var.typename, xx 1);
@@ -1637,7 +1659,6 @@ union_terms :: (checker : *Semantic_Checker, lhs_handle : Type_Variable_Handle,
lhs_var := h2tv(checker, lhs_handle);
rhs_var := h2tv(checker, rhs_handle);
print("% %\n", type_to_string(h2tv(checker, lhs_handle)), type_to_string(h2tv(checker, rhs_handle)));
if usage_site {
type_mismatch(checker, usage_site, rhs_var.source_node.parent, rhs_handle, lhs_handle);
} else {
@@ -1815,6 +1836,7 @@ check :: (checker : *Semantic_Checker) -> Semantic_Check_Result {
// ===========================================================
// Pretty printing
#scope_file
type_to_string :: (type_variable : Type_Variable) -> string {
if type_variable.type == {
@@ -1832,7 +1854,6 @@ type_to_string :: (type_variable : Type_Variable) -> string {
}
case .Function; #through;
case .Struct; {
print("%\n", type_variable);
return type_variable.typename;
}
case .Array;
@@ -1842,6 +1863,8 @@ type_to_string :: (type_variable : Type_Variable) -> string {
return "";
}
#scope_export
print_key :: (checker : *Semantic_Checker, builder : *String_Builder, name : string) {
scope := get_current_scope(checker);
target_length := scope.longest_key_length + 1;