aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-08-23 11:43:37 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-08-23 11:43:37 -0400
commit3865b6ad8f8ba71dca06c81828ec2e29f3019879 (patch)
treecfadbebe532708c931bddcc8e5b262d63946c78d /src/analyze.cpp
parent79a4b7a2365dc50d01eb6bc29bbb77244a1620cf (diff)
parentec2f9ef4e8be5995ab652dde59b12ee340a9e28d (diff)
downloadzig-3865b6ad8f8ba71dca06c81828ec2e29f3019879.tar.gz
zig-3865b6ad8f8ba71dca06c81828ec2e29f3019879.zip
Merge remote-tracking branch 'origin/master' into fix-field-alignment-kludge
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 414ce09b2c..84299a5c8b 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -1147,7 +1147,7 @@ static bool analyze_const_align(CodeGen *g, Scope *scope, AstNode *node, uint32_
if (type_is_invalid(align_result->type))
return false;
- uint32_t align_bytes = bigint_as_unsigned(&align_result->data.x_bigint);
+ uint32_t align_bytes = bigint_as_u32(&align_result->data.x_bigint);
if (align_bytes == 0) {
add_node_error(g, node, buf_sprintf("alignment must be >= 1"));
return false;
@@ -1179,7 +1179,7 @@ static bool analyze_const_string(CodeGen *g, Scope *scope, AstNode *node, Buf **
return true;
}
expand_undef_array(g, array_val);
- size_t len = bigint_as_unsigned(&len_field->data.x_bigint);
+ size_t len = bigint_as_usize(&len_field->data.x_bigint);
Buf *result = buf_alloc();
buf_resize(result, len);
for (size_t i = 0; i < len; i += 1) {
@@ -1189,7 +1189,7 @@ static bool analyze_const_string(CodeGen *g, Scope *scope, AstNode *node, Buf **
add_node_error(g, node, buf_sprintf("use of undefined value"));
return false;
}
- uint64_t big_c = bigint_as_unsigned(&char_val->data.x_bigint);
+ uint64_t big_c = bigint_as_u64(&char_val->data.x_bigint);
assert(big_c <= UINT8_MAX);
uint8_t c = (uint8_t)big_c;
buf_ptr(result)[i] = c;
@@ -2384,19 +2384,25 @@ static Error resolve_struct_alignment(CodeGen *g, ZigType *struct_type) {
if (field->gen_index == SIZE_MAX)
continue;
- // TODO: https://github.com/ziglang/zig/issues/1512
- size_t this_field_align;
- if (packed) {
- this_field_align = 1;
+ AstNode *align_expr = field->decl_node->data.struct_field.align_expr;
+ if (align_expr != nullptr) {
+ if (!analyze_const_align(g, &struct_type->data.structure.decls_scope->base, align_expr,
+ &field->align))
+ {
+ struct_type->data.structure.resolve_status = ResolveStatusInvalid;
+ return err;
+ }
+ } else if (packed) {
+ field->align = 1;
} else {
- if ((err = type_val_resolve_abi_align(g, field->type_val, &this_field_align))) {
+ if ((err = type_val_resolve_abi_align(g, field->type_val, &field->align))) {
struct_type->data.structure.resolve_status = ResolveStatusInvalid;
return err;
}
}
- if (this_field_align > struct_type->abi_align) {
- struct_type->abi_align = this_field_align;
+ if (field->align > struct_type->abi_align) {
+ struct_type->abi_align = field->align;
}
}
@@ -6008,7 +6014,7 @@ void render_const_value(CodeGen *g, Buf *buf, ConstExprValue *const_val) {
{
if (is_slice(type_entry)) {
ConstExprValue *len_val = &const_val->data.x_struct.fields[slice_len_index];
- size_t len = bigint_as_unsigned(&len_val->data.x_bigint);
+ size_t len = bigint_as_usize(&len_val->data.x_bigint);
ConstExprValue *ptr_val = &const_val->data.x_struct.fields[slice_ptr_index];
if (ptr_val->special == ConstValSpecialUndef) {