aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2015-12-24 13:47:07 -0700
committerAndrew Kelley <superjoe30@gmail.com>2015-12-24 13:47:07 -0700
commit08a7ce7dd5f348b37bf98c5040ad58720a7818b5 (patch)
treedeb58ea9bc24f131a81e18784b5904947cac2df6 /src/analyze.cpp
parent8915883cf627c12a7e6da9bb813d456407ebb091 (diff)
downloadzig-08a7ce7dd5f348b37bf98c5040ad58720a7818b5.tar.gz
zig-08a7ce7dd5f348b37bf98c5040ad58720a7818b5.zip
add error for missing or duplicate field in struct value expr
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index a05b064364..41ce9d49c0 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -1309,7 +1309,11 @@ static TypeTableEntry *analyze_struct_val_expr(CodeGen *g, ImportTableEntry *imp
node->codegen_node->data.struct_val_expr_node.source_node = node;
context->struct_val_expr_alloca_list.append(&node->codegen_node->data.struct_val_expr_node);
- for (int i = 0; i < struct_val_expr->fields.length; i += 1) {
+ int expr_field_count = struct_val_expr->fields.length;
+ int actual_field_count = type_entry->data.structure.field_count;
+
+ int *field_use_counts = allocate<int>(actual_field_count);
+ for (int i = 0; i < expr_field_count; i += 1) {
AstNode *val_field_node = struct_val_expr->fields.at(i);
int field_index;
TypeStructField *type_field = find_struct_type_field(type_entry,
@@ -1317,7 +1321,14 @@ static TypeTableEntry *analyze_struct_val_expr(CodeGen *g, ImportTableEntry *imp
if (!type_field) {
add_node_error(g, val_field_node,
- buf_sprintf("type '%s' is not a struct", buf_ptr(&type_entry->name)));
+ buf_sprintf("no member named '%s' in '%s'",
+ buf_ptr(&val_field_node->data.struct_val_field.name), buf_ptr(&type_entry->name)));
+ continue;
+ }
+
+ field_use_counts[field_index] += 1;
+ if (field_use_counts[field_index] > 1) {
+ add_node_error(g, val_field_node, buf_sprintf("duplicate field"));
continue;
}
@@ -1328,6 +1339,13 @@ static TypeTableEntry *analyze_struct_val_expr(CodeGen *g, ImportTableEntry *imp
val_field_node->data.struct_val_field.expr);
}
+ for (int i = 0; i < actual_field_count; i += 1) {
+ if (field_use_counts[i] == 0) {
+ add_node_error(g, node,
+ buf_sprintf("missing field: '%s'", buf_ptr(type_entry->data.structure.fields[i].name)));
+ }
+ }
+
return type_entry;
}