aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-05 16:34:51 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-05 16:34:51 -0700
commitd006ea98dde667947395c0e7ee95fff20ada6df3 (patch)
tree1539f61d881d4f8f4a18aaeb3028179651cfb57b /src
parent4ce0fcb569ffa1c0807aaada4ded802816272b75 (diff)
downloadzig-d006ea98dde667947395c0e7ee95fff20ada6df3.tar.gz
zig-d006ea98dde667947395c0e7ee95fff20ada6df3.zip
analyze: ability to call a method on a struct pointer
Diffstat (limited to 'src')
-rw-r--r--src/analyze.cpp15
1 files changed, 7 insertions, 8 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 2bffcee8c8..6d310a128e 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -853,7 +853,7 @@ static TypeTableEntry * resolve_rhs_number_literal(CodeGen *g, AstNode *non_lite
assert(literal_node->codegen_node);
NumberLiteralNode *codegen_num_lit = &literal_node->codegen_node->data.num_lit_node;
- if (num_lit_fits_in_other_type(g, literal_type, non_literal_type)) {
+ if (non_literal_type && num_lit_fits_in_other_type(g, literal_type, non_literal_type)) {
assert(!codegen_num_lit->resolved_type);
codegen_num_lit->resolved_type = non_literal_type;
return non_literal_type;
@@ -1711,13 +1711,8 @@ static TypeTableEntry *analyze_compiler_fn_type(CodeGen *g, ImportTableEntry *im
uint64_t size_in_bytes = type_entry->size_in_bits / 8;
TypeTableEntry *num_lit_type = get_number_literal_type_unsigned(g, size_in_bytes);
-
- NumberLiteralNode *codegen_num_lit = &node->codegen_node->data.num_lit_node;
- assert(!codegen_num_lit->resolved_type);
- codegen_num_lit->resolved_type = resolve_type_compatibility(g, context, node,
- expected_type, num_lit_type);
-
- return num_lit_type;
+ TypeTableEntry *resolved_type = resolve_rhs_number_literal(g, nullptr, expected_type, node, num_lit_type);
+ return resolved_type ? resolved_type : num_lit_type;
} else if (buf_eql_str(name, "min_value")) {
return analyze_min_max_value(g, node, type_entry, "no min value available for type '%s'");
} else if (buf_eql_str(name, "max_value")) {
@@ -1744,6 +1739,10 @@ static TypeTableEntry *analyze_fn_call_expr(CodeGen *g, ImportTableEntry *import
name = &fn_ref_expr->data.field_access_expr.field_name;
if (struct_type->id == TypeTableEntryIdStruct) {
fn_table = &struct_type->data.structure.fn_table;
+ } else if (struct_type->id == TypeTableEntryIdPointer &&
+ struct_type->data.pointer.child_type->id == TypeTableEntryIdStruct)
+ {
+ fn_table = &struct_type->data.pointer.child_type->data.structure.fn_table;
} else if (struct_type->id == TypeTableEntryIdInvalid) {
return struct_type;
} else {