Remove null

This commit is contained in:
Krzosa Karol
2022-06-02 09:59:12 +02:00
parent ebb21df015
commit 9a58e407a4
5 changed files with 17 additions and 42 deletions

View File

@@ -4,7 +4,7 @@
test_function :: (thing: int): *int test_function :: (thing: int): *int
function_type: test_function function_type: test_function
const_function_alias :: test_function const_function_alias :: test_function
null_function: (t: int): *int = null // null_function: (t: int): *int = null
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Booleans // Booleans
@@ -15,9 +15,9 @@ value_of_bool: int = cast(boolean: int)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Nulls // Nulls
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int_null: int = null // int_null: int = null
str_null: String = null // str_null: String = null
bool_null: bool = null // bool_null: bool = null
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Compound expressions // Compound expressions
@@ -25,7 +25,7 @@ bool_null: bool = null
array1: [4]int = [4]int(1,2,3,4) array1: [4]int = [4]int(1,2,3,4)
array2 := [32]int(1,2,3,4) array2 := [32]int(1,2,3,4)
array3 := [32]int( array3 := [32]int(
[0] = null, [0] = 0,
[1] = 1, [1] = 1,
[2] = 2, [2] = 2,
[31] = 31, [31] = 31,
@@ -50,9 +50,9 @@ implicit_str :: "Hello world"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Pointers // Pointers
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
pointer1: *int = null // pointer1: *int = 0
pointer2: *int = pointer1 // pointer2: *int = pointer1
pointer3: **int = null // pointer3: **int = 0
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// String types // String types

View File

@@ -1,6 +1,6 @@
a_type :: int a_type :: int
pointer_type :: *int pointer_type :: *int
null_pointer: pointer_type = null // null_pointer: pointer_type = null
if_stmt :: (cond: int): type if_stmt :: (cond: int): type
CONSTANT :: 10 CONSTANT :: 10

View File

@@ -1,12 +1,12 @@
Str16 :: String16 Str16 :: String16
arena_pointer: *Arena = null // arena_pointer: *Arena = null
thing: Arena thing: Arena
no_type := thing no_type := thing
constant_access := Arena.constant_inside constant_access := Arena.constant_inside
arena := Arena( arena := Arena(
next = null, // next = null,
data = null, // data = null,
len = 1000, len = 1000,
cap = 1000, cap = 1000,
) )

View File

@@ -16,13 +16,10 @@ resolve_type_pair(Token *pos, Ast_Resolved_Type *a, Ast_Resolved_Type *b){
else if(a && !b) result = a; else if(a && !b) result = a;
else if(!a && !b) parsing_error(pos, "Trying to resolve a type pair where both types are [Null]"); else if(!a && !b) parsing_error(pos, "Trying to resolve a type pair where both types are [Null]");
else{ // a && b else{ // a && b
if(b->kind == TYPE_NULL) result = a; if(a != b) parsing_error(pos, "Expression and type specification are differing %s %s", type_names[a->kind], type_names[b->kind]);
else if(a->kind == TYPE_NULL) result = b;
else if(a != b) parsing_error(pos, "Expression and type specification are differing %s %s", type_names[a->kind], type_names[b->kind]);
else result = a; // Types are the same else result = a; // Types are the same
} }
if(result->kind == TYPE_NULL) parsing_error(pos, "Couldn't infer type of null value");
return result; return result;
} }
@@ -200,11 +197,7 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res
CASE(IDENT, Atom){ CASE(IDENT, Atom){
Sym *sym = resolve_name(node->pos, node->intern_val); Sym *sym = resolve_name(node->pos, node->intern_val);
if(sym->type->kind == TYPE_NULL){ if(sym->kind == SYM_CONST && sym->type != type_type && sym->type->kind != TYPE_LAMBDA){
if(!expected_type) parsing_error(node->pos, "Couldn't infer type of null");
return operand_null(expected_type);
}
else if(sym->kind == SYM_CONST && sym->type != type_type && sym->type->kind != TYPE_LAMBDA){
rewrite_into_const(node, Ast_Atom, sym); rewrite_into_const(node, Ast_Atom, sym);
return operand(sym); return operand(sym);
} }
@@ -380,7 +373,6 @@ resolve_expr(Ast_Expr *ast, Ast_Resolved_Type *expected_type, Sym *lambda_to_res
if(type == expr.type); if(type == expr.type);
else if(expr.type == type_int && type == type_bool) type = type_bool; else if(expr.type == type_int && type == type_bool) type = type_bool;
else if(expr.type == type_bool && type == type_int) type = type_int; else if(expr.type == type_bool && type == type_int) type = type_int;
else if(expr.type == type_null);
else parsing_error(node->pos, "Failed to cast, incompatible types"); else parsing_error(node->pos, "Failed to cast, incompatible types");
return operand_rvalue(type); return operand_rvalue(type);
BREAK(); BREAK();

View File

@@ -78,7 +78,6 @@ struct Ast_Resolved_Type{
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
const SizeU pointer_size = sizeof(SizeU); const SizeU pointer_size = sizeof(SizeU);
const SizeU pointer_align = __alignof(SizeU); const SizeU pointer_align = __alignof(SizeU);
global Ast_Resolved_Type type__null = {TYPE_NULL};
global Ast_Resolved_Type type__void = {TYPE_VOID}; global Ast_Resolved_Type type__void = {TYPE_VOID};
global Ast_Resolved_Type type__int = {TYPE_INT, sizeof(int), __alignof(int)}; global Ast_Resolved_Type type__int = {TYPE_INT, sizeof(int), __alignof(int)};
global Ast_Resolved_Type type__string = {TYPE_STRING, sizeof(String), __alignof(String)}; global Ast_Resolved_Type type__string = {TYPE_STRING, sizeof(String), __alignof(String)};
@@ -90,15 +89,14 @@ global Ast_Resolved_Type *type_void = &type__void;
global Ast_Resolved_Type *type_int = &type__int; global Ast_Resolved_Type *type_int = &type__int;
global Ast_Resolved_Type *type_string = &type__string; global Ast_Resolved_Type *type_string = &type__string;
global Ast_Resolved_Type *type_bool = &type__bool; global Ast_Resolved_Type *type_bool = &type__bool;
global Ast_Resolved_Type *type_null = &type__null;
global Ast_Resolved_Type type__untyped_bool = {TYPE_UNTYPED_BOOL, sizeof(bool), __alignof(bool)}; global Ast_Resolved_Type type__untyped_bool = {TYPE_UNTYPED_BOOL, sizeof(bool), __alignof(bool)};
global Ast_Resolved_Type type__untyped_int = {TYPE_UNTYPED_INT, sizeof(S64), __alignof(S64)}; global Ast_Resolved_Type type__untyped_int = {TYPE_UNTYPED_INT, sizeof(S64), __alignof(S64)};
global Ast_Resolved_Type type__untyped_string = {TYPE_UNTYPED_STRING, sizeof(String), __alignof(String)}; global Ast_Resolved_Type type__untyped_string = {TYPE_UNTYPED_STRING, sizeof(String), __alignof(String)};
global Ast_Resolved_Type *type_untyped_string = &type__untyped_string; global Ast_Resolved_Type *untyped_string = &type__untyped_string;
global Ast_Resolved_Type *type_untyped_bool = &type__untyped_bool; global Ast_Resolved_Type *untyped_bool = &type__untyped_bool;
global Ast_Resolved_Type *type_untyped_int = &type__untyped_int; global Ast_Resolved_Type *untyped_int = &type__untyped_int;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Symbols // Symbols
@@ -281,13 +279,6 @@ sym_insert_builtins(){
Sym *sym = sym_new_resolved(SYM_CONST, string, type_bool, val, &empty_decl, false); Sym *sym = sym_new_resolved(SYM_CONST, string, type_bool, val, &empty_decl, false);
sym_insert(sym); sym_insert(sym);
} }
{
Intern_String string = intern_string(&pctx->interns, "null"_s);
Value val; val.int_val = 0;
Sym *sym = sym_new_resolved(SYM_CONST, string, type_null, val, &empty_decl, false);
sym_insert(sym);
}
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -330,14 +321,6 @@ operand_str(Intern_String intern_val){
return result; return result;
} }
function Operand
operand_null(Ast_Resolved_Type *type){
Operand result = {type};
result.is_const = true;
result.is_lvalue = false;
return result;
}
function Operand function Operand
operand_lambda(Ast_Resolved_Type *type){ operand_lambda(Ast_Resolved_Type *type){
Operand result = {}; Operand result = {};