From 687e78d5ddf2d75022eedc060b3352643ebe2080 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Mon, 12 Sep 2016 12:05:38 +0100 Subject: Some global init cleanup; `volatile` types --- src/checker/expr.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/checker/expr.cpp') diff --git a/src/checker/expr.cpp b/src/checker/expr.cpp index 2f5ec3789..a15322ceb 100644 --- a/src/checker/expr.cpp +++ b/src/checker/expr.cpp @@ -851,6 +851,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c switch (operand.mode) { case Addressing_Type: { type = operand.type; + type->flags |= e->type_flags; set_base_type(named_type, type); goto end; } break; @@ -881,12 +882,15 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c if (o.mode == Addressing_Type) { set_base_type(type, o.type); + o.type->flags |= e->type_flags; return o.type; } case_end; case_ast_node(pe, ParenExpr, e); - return check_type(c, pe->expr, named_type, cycle_checker); + type = check_type(c, pe->expr, named_type, cycle_checker); + type->flags |= e->type_flags; + return type; case_end; case_ast_node(at, ArrayType, e); @@ -894,9 +898,11 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c type = make_type_array(c->allocator, check_type(c, at->elem, NULL, cycle_checker), check_array_count(c, at->count)); + type->flags |= e->type_flags; set_base_type(named_type, type); } else { type = make_type_slice(c->allocator, check_type(c, at->elem)); + type->flags |= e->type_flags; set_base_type(named_type, type); } goto end; @@ -912,6 +918,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c error(&c->error_collector, ast_node_token(vt->elem), "Vector element type must be numerical or a boolean. Got `%s`", err_str); } type = make_type_vector(c->allocator, elem, count); + type->flags |= e->type_flags; set_base_type(named_type, type); goto end; case_end; @@ -923,6 +930,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c check_struct_type(c, type, e, cycle_checker); check_close_scope(c); type->Record.node = e; + type->flags |= e->type_flags; goto end; case_end; @@ -933,6 +941,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c check_union_type(c, type, e, cycle_checker); check_close_scope(c); type->Record.node = e; + type->flags |= e->type_flags; goto end; case_end; @@ -943,6 +952,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c check_raw_union_type(c, type, e, cycle_checker); check_close_scope(c); type->Record.node = e; + type->flags |= e->type_flags; goto end; case_end; @@ -951,17 +961,20 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c set_base_type(named_type, type); check_enum_type(c, type, named_type, e); type->Record.node = e; + type->flags |= e->type_flags; goto end; case_end; case_ast_node(pt, PointerType, e); type = make_type_pointer(c->allocator, check_type(c, pt->type)); + type->flags |= e->type_flags; set_base_type(named_type, type); goto end; case_end; case_ast_node(pt, ProcType, e); type = alloc_type(c->allocator, Type_Proc); + type->flags |= e->type_flags; set_base_type(named_type, type); check_procedure_type(c, type, e); goto end; @@ -973,6 +986,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c check_expr_or_type(c, &o, e); if (o.mode == Addressing_Type) { type = o.type; + type->flags |= e->type_flags; goto end; } } @@ -987,6 +1001,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c end: GB_ASSERT(is_type_typed(type)); + type->flags |= e->type_flags; add_type_and_value(&c->info, e, Addressing_Type, type, null_value); return type; } @@ -3576,9 +3591,15 @@ gbString write_expr_to_string(gbString str, AstNode *node) { case_end; case_ast_node(cl, CompoundLit, node); - str = gb_string_appendc(str, "("); str = write_expr_to_string(str, cl->type); - str = gb_string_appendc(str, " lit)"); + str = gb_string_appendc(str, "{"); + gb_for_array(i, cl->elems) { + if (i > 0) { + str = gb_string_appendc(str, ", "); + } + str = write_expr_to_string(str, cl->elems[i]); + } + str = gb_string_appendc(str, "}"); case_end; case_ast_node(te, TagExpr, node); -- cgit v1.2.3