diff options
Diffstat (limited to 'gcc/go/gofrontend/expressions.cc')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 5dda7916196..f656acb90ff 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -318,7 +318,10 @@ Expression::convert_type_to_interface(Translate_context* context, // When setting an interface to nil, we just set both fields to // NULL. if (rhs_type->is_nil_type()) - return lhs_type->get_init_tree(gogo, false); + { + Btype* lhs_btype = lhs_type->get_backend(gogo); + return expr_to_tree(gogo->backend()->zero_expression(lhs_btype)); + } // This should have been checked already. go_assert(lhs_interface_type->implements_interface(rhs_type, NULL)); @@ -10046,12 +10049,14 @@ Map_index_expression::do_get_tree(Translate_context* context) } else { + Gogo* gogo = context->gogo(); + Btype* val_btype = type->val_type()->get_backend(gogo); + Bexpression* val_zero = gogo->backend()->zero_expression(val_btype); return fold_build3(COND_EXPR, val_type_tree, fold_build2(EQ_EXPR, boolean_type_node, valptr, fold_convert(TREE_TYPE(valptr), null_pointer_node)), - type->val_type()->get_init_tree(context->gogo(), - false), + expr_to_tree(val_zero), build_fold_indirect_ref(valptr)); } } @@ -10958,7 +10963,10 @@ Struct_construction_expression::do_get_tree(Translate_context* context) Gogo* gogo = context->gogo(); if (this->vals_ == NULL) - return this->type_->get_init_tree(gogo, false); + { + Btype* btype = this->type_->get_backend(gogo); + return expr_to_tree(gogo->backend()->zero_expression(btype)); + } tree type_tree = type_to_tree(this->type_->get_backend(gogo)); if (type_tree == error_mark_node) @@ -10977,12 +10985,14 @@ Struct_construction_expression::do_get_tree(Translate_context* context) { go_assert(pf != fields->end()); + Btype* fbtype = pf->type()->get_backend(gogo); + tree val; if (pv == this->vals_->end()) - val = pf->type()->get_init_tree(gogo, false); + val = expr_to_tree(gogo->backend()->zero_expression(fbtype)); else if (*pv == NULL) { - val = pf->type()->get_init_tree(gogo, false); + val = expr_to_tree(gogo->backend()->zero_expression(fbtype)); ++pv; } else @@ -11217,7 +11227,12 @@ Array_construction_expression::get_constructor_tree(Translate_context* context, constructor_elt* elt = VEC_quick_push(constructor_elt, values, NULL); elt->index = size_int(i); if (*pv == NULL) - elt->value = element_type->get_init_tree(context->gogo(), false); + { + Gogo* gogo = context->gogo(); + Btype* ebtype = element_type->get_backend(gogo); + Bexpression *zv = gogo->backend()->zero_expression(ebtype); + elt->value = expr_to_tree(zv); + } else { tree value_tree = (*pv)->get_tree(context); @@ -11363,7 +11378,9 @@ Open_array_construction_expression::do_get_tree(Translate_context* context) VEC(constructor_elt,gc)* vec = VEC_alloc(constructor_elt, gc, 1); constructor_elt* elt = VEC_quick_push(constructor_elt, vec, NULL); elt->index = size_int(0); - elt->value = element_type->get_init_tree(context->gogo(), false); + Gogo* gogo = context->gogo(); + Btype* btype = element_type->get_backend(gogo); + elt->value = expr_to_tree(gogo->backend()->zero_expression(btype)); values = build_constructor(constructor_type, vec); if (TREE_CONSTANT(elt->value)) TREE_CONSTANT(values) = 1; |