From 87f1a62ca4280105eb845e5bae3acd8b8a0a0810 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Wed, 10 May 2017 22:51:35 +0100 Subject: [PATCH] Fix alignment for normal structures to match LLVM --- core/os_linux.odin | 2 +- core/os_windows.odin | 1 - src/check_expr.c | 1 + src/checker.c | 7 ++++--- src/types.c | 36 ++++++++++++++---------------------- 5 files changed, 20 insertions(+), 27 deletions(-) diff --git a/core/os_linux.odin b/core/os_linux.odin index 399ad8e28..eeea9bf56 100644 --- a/core/os_linux.odin +++ b/core/os_linux.odin @@ -1,4 +1,4 @@ -#import "fmt.odin"; +// #import "fmt.odin"; #import "strings.odin"; Handle :: i32; diff --git a/core/os_windows.odin b/core/os_windows.odin index df3e36e44..cd8b17f6a 100644 --- a/core/os_windows.odin +++ b/core/os_windows.odin @@ -1,5 +1,4 @@ #import win32 "sys/windows.odin"; -#import fmt "fmt.odin"; Handle :: int; File_Time :: u64; diff --git a/src/check_expr.c b/src/check_expr.c index 4dcb04c07..f205935c2 100644 --- a/src/check_expr.c +++ b/src/check_expr.c @@ -3126,6 +3126,7 @@ Entity *check_selector(Checker *c, Operand *operand, AstNode *node, Type *type_h Entity **procs = gb_alloc_array(heap_allocator(), Entity *, overload_count); map_entity_multi_get_all(&import_scope->elements, key, procs); + for (isize i = 0; i < overload_count; i++) { Type *t = base_type(procs[i]->type); if (t == t_invalid) { diff --git a/src/checker.c b/src/checker.c index fae2eef2d..cd6de9bb9 100644 --- a/src/checker.c +++ b/src/checker.c @@ -1797,7 +1797,6 @@ void check_import_entities(Checker *c, MapScope *file_scopes) { } } - if (!previously_added) { array_add(&parent_scope->imported, scope); } else { @@ -1813,19 +1812,21 @@ void check_import_entities(Checker *c, MapScope *file_scopes) { if (e->scope == parent_scope) { continue; } + + if (!is_entity_kind_exported(e->kind)) { continue; } if (id->is_import) { if (is_entity_exported(e)) { // TODO(bill): Should these entities be imported but cause an error when used? - bool ok = add_entity(c, parent_scope, NULL, e); + bool ok = add_entity(c, parent_scope, e->identifier, e); if (ok) { map_bool_set(&parent_scope->implicit, hash_pointer(e), true); } } } else { - add_entity(c, parent_scope, NULL, e); + add_entity(c, parent_scope, e->identifier, e); } } } else { diff --git a/src/types.c b/src/types.c index c67dc11ef..b4a2248cf 100644 --- a/src/types.c +++ b/src/types.c @@ -1614,31 +1614,23 @@ i64 type_align_of_internal(gbAllocator allocator, Type *t, TypePath *path) { return gb_clamp(t->Record.custom_align, 1, build_context.max_align); } if (t->Record.field_count > 0) { - // TODO(bill): What is this supposed to be? + i64 max = 1; if (t->Record.is_packed) { - i64 max = build_context.word_size; - for (isize i = 0; i < t->Record.field_count; i++) { - Type *field_type = t->Record.fields[i]->type; - type_path_push(path, field_type); - if (path->failure) { - return FAILURE_ALIGNMENT; - } - i64 align = type_align_of_internal(allocator, field_type, path); - type_path_pop(path); - if (max < align) { - max = align; - } + max = build_context.word_size; + } + for (isize i = 0; i < t->Record.field_count; i++) { + Type *field_type = t->Record.fields[i]->type; + type_path_push(path, field_type); + if (path->failure) { + return FAILURE_ALIGNMENT; + } + i64 align = type_align_of_internal(allocator, field_type, path); + type_path_pop(path); + if (max < align) { + max = align; } - return max; } - Type *field_type = t->Record.fields[0]->type; - type_path_push(path, field_type); - if (path->failure) { - return FAILURE_ALIGNMENT; - } - i64 align = type_align_of_internal(allocator, field_type, path); - type_path_pop(path); - return align; + return max; } break; case TypeRecord_Union: {