authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-06-15 23:47:05-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-06-15 23:47:05-04:00
log865b53f2860405a718262abf9a794d2bf9529dbc
treea0a79987caabbad09e2868d5e0cbfa3f78bf0121
parentae61e26680b967414194b4fa65568a8023108678

fix alignOf builtin

* fix assertion error when type is not yet complete * fix alignment value closes #391

3 files changed, 14 insertions(+), 1 deletions(-)

src/ir.cpp+2-1
...@@ -12993,6 +12993,7 @@ static TypeTableEntry *ir_analyze_instruction_alignof(IrAnalyze *ira, IrInstruct...@@ -12993,6 +12993,7 @@ static TypeTableEntry *ir_analyze_instruction_alignof(IrAnalyze *ira, IrInstruct
12993 return ira->codegen->builtin_types.entry_invalid;12993 return ira->codegen->builtin_types.entry_invalid;
12994 TypeTableEntry *type_entry = ir_resolve_type(ira, type_value);12994 TypeTableEntry *type_entry = ir_resolve_type(ira, type_value);
1299512995
12996 ensure_complete_type(ira->codegen, type_entry);
12996 if (type_is_invalid(type_entry)) {12997 if (type_is_invalid(type_entry)) {
12997 return ira->codegen->builtin_types.entry_invalid;12998 return ira->codegen->builtin_types.entry_invalid;
12998 } else if (type_entry->id == TypeTableEntryIdUnreachable) {12999 } else if (type_entry->id == TypeTableEntryIdUnreachable) {
...@@ -13000,7 +13001,7 @@ static TypeTableEntry *ir_analyze_instruction_alignof(IrAnalyze *ira, IrInstruct...@@ -13000,7 +13001,7 @@ static TypeTableEntry *ir_analyze_instruction_alignof(IrAnalyze *ira, IrInstruct
13000 buf_sprintf("no align available for type '%s'", buf_ptr(&type_entry->name)));13001 buf_sprintf("no align available for type '%s'", buf_ptr(&type_entry->name)));
13001 return ira->codegen->builtin_types.entry_invalid;13002 return ira->codegen->builtin_types.entry_invalid;
13002 } else {13003 } else {
13003 uint64_t align_in_bytes = LLVMABISizeOfType(ira->codegen->target_data_ref, type_entry->type_ref);13004 uint64_t align_in_bytes = LLVMABIAlignmentOfType(ira->codegen->target_data_ref, type_entry->type_ref);
13004 ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base);13005 ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base);
13005 bignum_init_unsigned(&out_val->data.x_bignum, align_in_bytes);13006 bignum_init_unsigned(&out_val->data.x_bignum, align_in_bytes);
13006 return ira->codegen->builtin_types.entry_num_lit_int;13007 return ira->codegen->builtin_types.entry_num_lit_int;
test/behavior.zig+1
...@@ -1,4 +1,5 @@...@@ -1,4 +1,5 @@
1comptime {1comptime {
2 _ = @import("cases/alignof.zig");
2 _ = @import("cases/array.zig");3 _ = @import("cases/array.zig");
3 _ = @import("cases/asm.zig");4 _ = @import("cases/asm.zig");
4 _ = @import("cases/atomics.zig");5 _ = @import("cases/atomics.zig");
test/cases/alignof.zig created+11
...@@ -0,0 +1,11 @@
1const assert = @import("std").debug.assert;
2const builtin = @import("builtin");
3
4const Foo = struct { x: u32, y: u32, z: u32, };
5
6test "@alignOf(T) before referencing T" {
7 comptime assert(@alignOf(Foo) != @maxValue(usize));
8 if (builtin.arch == builtin.Arch.x86_64) {
9 comptime assert(@alignOf(Foo) == 4);
10 }
11}