diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2015-12-24 13:47:07 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2015-12-24 13:47:07 -0700 |
| commit | 08a7ce7dd5f348b37bf98c5040ad58720a7818b5 (patch) | |
| tree | deb58ea9bc24f131a81e18784b5904947cac2df6 /src/analyze.cpp | |
| parent | 8915883cf627c12a7e6da9bb813d456407ebb091 (diff) | |
| download | zig-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.cpp | 22 |
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; } |
