mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Fix #893
This commit is contained in:
@@ -1908,17 +1908,6 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handle_relative_pointer :: proc(ptr: ^$T) -> rawptr where intrinsics.type_is_integer(T) {
|
|
||||||
if ptr^ == 0 {
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
when intrinsics.type_is_unsigned(T) {
|
|
||||||
return rawptr(uintptr(ptr) + uintptr(ptr^));
|
|
||||||
} else {
|
|
||||||
return rawptr(uintptr(ptr) + uintptr(i64(ptr^)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt_complex :: proc(fi: ^Info, c: complex128, bits: int, verb: rune) {
|
fmt_complex :: proc(fi: ^Info, c: complex128, bits: int, verb: rune) {
|
||||||
|
|||||||
+3
-2
@@ -352,16 +352,17 @@ void override_entity_in_scope(Entity *original_entity, Entity *new_entity) {
|
|||||||
|
|
||||||
string_map_set(&found_scope->elements, original_name, new_entity);
|
string_map_set(&found_scope->elements, original_name, new_entity);
|
||||||
|
|
||||||
|
original_entity->flags |= EntityFlag_Overridden;
|
||||||
original_entity->type = new_entity->type;
|
original_entity->type = new_entity->type;
|
||||||
|
original_entity->aliased_of = new_entity;
|
||||||
|
|
||||||
if (original_entity->identifier == nullptr) {
|
if (original_entity->identifier == nullptr) {
|
||||||
original_entity->identifier = new_entity->identifier;
|
original_entity->identifier = new_entity->identifier;
|
||||||
}
|
}
|
||||||
if (original_entity->identifier != nullptr &&
|
if (original_entity->identifier != nullptr &&
|
||||||
original_entity->identifier->kind == Ast_Ident) {
|
original_entity->identifier->kind == Ast_Ident) {
|
||||||
original_entity->identifier->Ident.entity = nullptr;
|
original_entity->identifier->Ident.entity = new_entity;
|
||||||
}
|
}
|
||||||
original_entity->flags |= EntityFlag_Overridden;
|
|
||||||
|
|
||||||
// IMPORTANT NOTE(bill, 2021-04-10): copy only the variants
|
// IMPORTANT NOTE(bill, 2021-04-10): copy only the variants
|
||||||
// This is most likely NEVER required, but it does not at all hurt to keep
|
// This is most likely NEVER required, but it does not at all hurt to keep
|
||||||
|
|||||||
+3
-2
@@ -1141,6 +1141,9 @@ Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *named_type, Typ
|
|||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GB_ASSERT((e->flags & EntityFlag_Overridden) == 0);
|
||||||
|
|
||||||
if (e->parent_proc_decl != nullptr &&
|
if (e->parent_proc_decl != nullptr &&
|
||||||
e->parent_proc_decl != c->curr_proc_decl) {
|
e->parent_proc_decl != c->curr_proc_decl) {
|
||||||
if (e->kind == Entity_Variable) {
|
if (e->kind == Entity_Variable) {
|
||||||
@@ -1195,8 +1198,6 @@ Entity *check_ident(CheckerContext *c, Operand *o, Ast *n, Type *named_type, Typ
|
|||||||
if (e->state == EntityState_Unresolved) {
|
if (e->state == EntityState_Unresolved) {
|
||||||
check_entity_decl(c, e, nullptr, named_type);
|
check_entity_decl(c, e, nullptr, named_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (e->type == nullptr) {
|
if (e->type == nullptr) {
|
||||||
// TODO(bill): Which is correct? return or compiler_error?
|
// TODO(bill): Which is correct? return or compiler_error?
|
||||||
// compiler_error("How did this happen? type: %s; identifier: %.*s\n", type_to_string(e->type), LIT(name));
|
// compiler_error("How did this happen? type: %s; identifier: %.*s\n", type_to_string(e->type), LIT(name));
|
||||||
|
|||||||
+5
-2
@@ -960,7 +960,11 @@ Entity *entity_of_node(Ast *expr) {
|
|||||||
expr = unparen_expr(expr);
|
expr = unparen_expr(expr);
|
||||||
switch (expr->kind) {
|
switch (expr->kind) {
|
||||||
case_ast_node(ident, Ident, expr);
|
case_ast_node(ident, Ident, expr);
|
||||||
return ident->entity;
|
Entity *e = ident->entity;
|
||||||
|
if (e && e->flags & EntityFlag_Overridden) {
|
||||||
|
// GB_PANIC("use of an overriden entity: %.*s", LIT(e->token.string));
|
||||||
|
}
|
||||||
|
return e;
|
||||||
case_end;
|
case_end;
|
||||||
case_ast_node(se, SelectorExpr, expr);
|
case_ast_node(se, SelectorExpr, expr);
|
||||||
Ast *s = unselector_expr(se->selector);
|
Ast *s = unselector_expr(se->selector);
|
||||||
@@ -973,7 +977,6 @@ Entity *entity_of_node(Ast *expr) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DeclInfo *decl_info_of_entity(Entity *e) {
|
DeclInfo *decl_info_of_entity(Entity *e) {
|
||||||
if (e != nullptr) {
|
if (e != nullptr) {
|
||||||
return e->decl_info;
|
return e->decl_info;
|
||||||
|
|||||||
@@ -126,6 +126,8 @@ struct Entity {
|
|||||||
Entity * using_parent;
|
Entity * using_parent;
|
||||||
Ast * using_expr;
|
Ast * using_expr;
|
||||||
|
|
||||||
|
Entity * aliased_of;
|
||||||
|
|
||||||
lbModule * code_gen_module;
|
lbModule * code_gen_module;
|
||||||
lbProcedure *code_gen_procedure;
|
lbProcedure *code_gen_procedure;
|
||||||
|
|
||||||
|
|||||||
+23
-15
@@ -3544,16 +3544,14 @@ void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd) {
|
|||||||
Ast *ident = vd->names[i];
|
Ast *ident = vd->names[i];
|
||||||
GB_ASSERT(ident->kind == Ast_Ident);
|
GB_ASSERT(ident->kind == Ast_Ident);
|
||||||
Entity *e = entity_of_node(ident);
|
Entity *e = entity_of_node(ident);
|
||||||
if (e == nullptr) {
|
GB_ASSERT(e != nullptr);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (e->kind != Entity_TypeName) {
|
if (e->kind != Entity_TypeName) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool polymorphic_struct = false;
|
bool polymorphic_struct = false;
|
||||||
if (e->type != nullptr && e->kind == Entity_TypeName) {
|
if (e->type != nullptr && e->kind == Entity_TypeName) {
|
||||||
Type *bt = base_type(e->type);
|
Type *bt = base_type(e->type);
|
||||||
if (bt->kind == Type_Struct) {
|
if (bt->kind == Type_Struct) {
|
||||||
polymorphic_struct = bt->Struct.is_polymorphic;
|
polymorphic_struct = bt->Struct.is_polymorphic;
|
||||||
}
|
}
|
||||||
@@ -3575,12 +3573,16 @@ void lb_build_constant_value_decl(lbProcedure *p, AstValueDecl *vd) {
|
|||||||
Ast *ident = vd->names[i];
|
Ast *ident = vd->names[i];
|
||||||
GB_ASSERT(ident->kind == Ast_Ident);
|
GB_ASSERT(ident->kind == Ast_Ident);
|
||||||
Entity *e = entity_of_node(ident);
|
Entity *e = entity_of_node(ident);
|
||||||
if (e == nullptr) {
|
GB_ASSERT(e != nullptr);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (e->kind != Entity_Procedure) {
|
if (e->kind != Entity_Procedure) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
GB_ASSERT (vd->values[i] != nullptr);
|
||||||
|
|
||||||
|
Ast *value = unparen_expr(vd->values[i]);
|
||||||
|
if (value->kind != Ast_ProcLit) {
|
||||||
|
continue; // It's an alias
|
||||||
|
}
|
||||||
|
|
||||||
CheckerInfo *info = p->module->info;
|
CheckerInfo *info = p->module->info;
|
||||||
DeclInfo *decl = decl_info_of_entity(e);
|
DeclInfo *decl = decl_info_of_entity(e);
|
||||||
@@ -11436,7 +11438,13 @@ lbValue lb_get_using_variable(lbProcedure *p, Entity *e) {
|
|||||||
GB_ASSERT(v.value != nullptr);
|
GB_ASSERT(v.value != nullptr);
|
||||||
GB_ASSERT_MSG(parent->type == type_deref(v.type), "%s %s", type_to_string(parent->type), type_to_string(v.type));
|
GB_ASSERT_MSG(parent->type == type_deref(v.type), "%s %s", type_to_string(parent->type), type_to_string(v.type));
|
||||||
lbValue ptr = lb_emit_deep_field_gep(p, v, sel);
|
lbValue ptr = lb_emit_deep_field_gep(p, v, sel);
|
||||||
lb_add_debug_local_variable(p, ptr.value, e->type, e->token);
|
if (parent->scope) {
|
||||||
|
if ((parent->scope->flags & (ScopeFlag_File|ScopeFlag_Pkg)) == 0) {
|
||||||
|
lb_add_debug_local_variable(p, ptr.value, e->type, e->token);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lb_add_debug_local_variable(p, ptr.value, e->type, e->token);
|
||||||
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13778,13 +13786,13 @@ void lb_generate_code(lbGenerator *gen) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gbString producer = gb_string_make(heap_allocator(), "odin");
|
gbString producer = gb_string_make(heap_allocator(), "odin");
|
||||||
producer = gb_string_append_fmt(producer, " version %.*s", LIT(ODIN_VERSION));
|
// producer = gb_string_append_fmt(producer, " version %.*s", LIT(ODIN_VERSION));
|
||||||
#ifdef NIGHTLY
|
// #ifdef NIGHTLY
|
||||||
producer = gb_string_appendc(producer, "-nightly");
|
// producer = gb_string_appendc(producer, "-nightly");
|
||||||
#endif
|
// #endif
|
||||||
#ifdef GIT_SHA
|
// #ifdef GIT_SHA
|
||||||
producer = gb_string_append_fmt(producer, "-%s", GIT_SHA);
|
// producer = gb_string_append_fmt(producer, "-%s", GIT_SHA);
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
gbString split_name = gb_string_make(heap_allocator(), "");
|
gbString split_name = gb_string_make(heap_allocator(), "");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user