diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-05-10 22:51:35 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-05-10 22:51:35 +0100 |
| commit | 87f1a62ca4280105eb845e5bae3acd8b8a0a0810 (patch) | |
| tree | bf791a7d0a593f75165f73bb45a4e718fbda9b67 /src | |
| parent | c6d531df9597253ee95593c56e61039fe4e40ba2 (diff) | |
Fix alignment for normal structures to match LLVM
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_expr.c | 1 | ||||
| -rw-r--r-- | src/checker.c | 7 | ||||
| -rw-r--r-- | src/types.c | 36 |
3 files changed, 19 insertions, 25 deletions
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; - } - } - return max; + max = build_context.word_size; } - Type *field_type = t->Record.fields[0]->type; - type_path_push(path, field_type); - if (path->failure) { - return FAILURE_ALIGNMENT; + 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; + } } - i64 align = type_align_of_internal(allocator, field_type, path); - type_path_pop(path); - return align; + return max; } break; case TypeRecord_Union: { |