Commit 8818c59cbc

Andrew Kelley <superjoe30@gmail.com>
2016-01-16 03:02:04
parser: fix not setting container init kind
1 parent dc162c7
Changed files (2)
src/analyze.cpp
@@ -1318,6 +1318,16 @@ static TypeStructField *find_struct_type_field(TypeTableEntry *type_entry, Buf *
     return nullptr;
 }
 
+static const char *err_container_init_syntax_name(ContainerInitKind kind) {
+    switch (kind) {
+        case ContainerInitKindStruct:
+            return "struct";
+        case ContainerInitKindArray:
+            return "array";
+    }
+    zig_unreachable();
+}
+
 static TypeTableEntry *analyze_container_init_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,
         AstNode *node)
 {
@@ -1331,60 +1341,51 @@ static TypeTableEntry *analyze_container_init_expr(CodeGen *g, ImportTableEntry
 
     if (container_type->id == TypeTableEntryIdInvalid) {
         return container_type;
-    } else if (container_type->id == TypeTableEntryIdStruct) {
-        switch (kind) {
-            case ContainerInitKindStruct:
-                {
-                    StructValExprCodeGen *codegen = &container_init_expr->resolved_struct_val_expr;
-                    codegen->type_entry = container_type;
-                    codegen->source_node = node;
-                    context->struct_val_expr_alloca_list.append(codegen);
+    } else if (container_type->id == TypeTableEntryIdStruct &&
+               kind == ContainerInitKindStruct)
+    {
+        StructValExprCodeGen *codegen = &container_init_expr->resolved_struct_val_expr;
+        codegen->type_entry = container_type;
+        codegen->source_node = node;
+        context->struct_val_expr_alloca_list.append(codegen);
 
 
-                    int expr_field_count = container_init_expr->entries.length;
-                    int actual_field_count = container_type->data.structure.field_count;
+        int expr_field_count = container_init_expr->entries.length;
+        int actual_field_count = container_type->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 = container_init_expr->entries.at(i);
-                        assert(val_field_node->type == NodeTypeStructValueField);
+        int *field_use_counts = allocate<int>(actual_field_count);
+        for (int i = 0; i < expr_field_count; i += 1) {
+            AstNode *val_field_node = container_init_expr->entries.at(i);
+            assert(val_field_node->type == NodeTypeStructValueField);
 
-                        int field_index;
-                        TypeStructField *type_field = find_struct_type_field(container_type,
-                                &val_field_node->data.struct_val_field.name, &field_index);
+            int field_index;
+            TypeStructField *type_field = find_struct_type_field(container_type,
+                    &val_field_node->data.struct_val_field.name, &field_index);
 
-                        if (!type_field) {
-                            add_node_error(g, val_field_node,
-                                buf_sprintf("no member named '%s' in '%s'",
-                                    buf_ptr(&val_field_node->data.struct_val_field.name), buf_ptr(&container_type->name)));
-                            continue;
-                        }
+            if (!type_field) {
+                add_node_error(g, val_field_node,
+                    buf_sprintf("no member named '%s' in '%s'",
+                        buf_ptr(&val_field_node->data.struct_val_field.name), buf_ptr(&container_type->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;
-                        }
+            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;
+            }
 
-                        val_field_node->data.struct_val_field.type_struct_field = type_field;
+            val_field_node->data.struct_val_field.type_struct_field = type_field;
 
-                        analyze_expression(g, import, context, type_field->type_entry,
-                                val_field_node->data.struct_val_field.expr);
-                    }
+            analyze_expression(g, import, context, type_field->type_entry,
+                    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(container_type->data.structure.fields[i].name)));
-                        }
-                    }
-                    break;
-                }
-            case ContainerInitKindArray:
+        for (int i = 0; i < actual_field_count; i += 1) {
+            if (field_use_counts[i] == 0) {
                 add_node_error(g, node,
-                    buf_sprintf("struct '%s' does not support array initialization syntax",
-                        buf_ptr(&container_type->name)));
-                break;
+                    buf_sprintf("missing field: '%s'", buf_ptr(container_type->data.structure.fields[i].name)));
+            }
         }
         return container_type;
     } else if (container_type->id == TypeTableEntryIdArray) {
@@ -1409,7 +1410,8 @@ static TypeTableEntry *analyze_container_init_expr(CodeGen *g, ImportTableEntry
         }
     } else {
         add_node_error(g, node,
-            buf_sprintf("type '%s' does not support initialization syntax", buf_ptr(&container_type->name)));
+            buf_sprintf("type '%s' does not support %s syntax",
+                buf_ptr(&container_type->name), err_container_init_syntax_name(kind)));
         return g->builtin_types.entry_invalid;
     }
 }
src/parser.cpp
@@ -1423,6 +1423,7 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, int *token_index,
 
             Token *token = &pc->tokens->at(*token_index);
             if (token->id == TokenIdDot) {
+                node->data.container_init_expr.kind = ContainerInitKindStruct;
                 for (;;) {
                     if (token->id == TokenIdDot) {
                         ast_eat_token(pc, token_index, TokenIdDot);
@@ -1456,6 +1457,7 @@ static AstNode *ast_parse_curly_suffix_expr(ParseContext *pc, int *token_index,
                 }
 
             } else {
+                node->data.container_init_expr.kind = ContainerInitKindArray;
                 for (;;) {
                     if (token->id == TokenIdRBrace) {
                         *token_index += 1;