diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-13 21:34:24 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-09-13 21:34:24 +0000 |
commit | 43c5cb7038177164b1675b51a587cb9c72b369d4 (patch) | |
tree | 64917c17764bc4193561971a4eba391a735da089 | |
parent | 3cc98df40ddf9f78f075d95378c4c2d3c54fb4bf (diff) | |
download | gcc-43c5cb7038177164b1675b51a587cb9c72b369d4.tar.gz |
Always dereference nil receiver passed to value method.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178835 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/go/gofrontend/gogo-tree.cc | 24 |
1 files changed, 3 insertions, 21 deletions
diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc index 2b5a24c148f..ed211e97677 100644 --- a/gcc/go/gofrontend/gogo-tree.cc +++ b/gcc/go/gofrontend/gogo-tree.cc @@ -1281,16 +1281,7 @@ Function::make_receiver_parm_decl(Gogo* gogo, Named_object* no, tree var_decl) DECL_ARG_TYPE(parm_decl) = TREE_TYPE(parm_decl); go_assert(DECL_INITIAL(var_decl) == NULL_TREE); - // The receiver might be passed as a null pointer. - tree check = fold_build2_loc(loc, NE_EXPR, boolean_type_node, parm_decl, - fold_convert_loc(loc, TREE_TYPE(parm_decl), - null_pointer_node)); - tree ind = build_fold_indirect_ref_loc(loc, parm_decl); - TREE_THIS_NOTRAP(ind) = 1; - Btype* btype = no->var_value()->type()->get_backend(gogo); - tree zero_init = expr_to_tree(gogo->backend()->zero_expression(btype)); - tree init = fold_build3_loc(loc, COND_EXPR, TREE_TYPE(ind), - check, ind, zero_init); + tree init = build_fold_indirect_ref_loc(loc, parm_decl); if (is_in_heap) { @@ -1301,18 +1292,9 @@ Function::make_receiver_parm_decl(Gogo* gogo, Named_object* no, tree var_decl) space = fold_convert(build_pointer_type(val_type), space); tree spaceref = build_fold_indirect_ref_loc(no->location(), space); TREE_THIS_NOTRAP(spaceref) = 1; - tree check = fold_build2_loc(loc, NE_EXPR, boolean_type_node, - parm_decl, - fold_convert_loc(loc, TREE_TYPE(parm_decl), - null_pointer_node)); - tree parmref = build_fold_indirect_ref_loc(no->location(), parm_decl); - TREE_THIS_NOTRAP(parmref) = 1; tree set = fold_build2_loc(loc, MODIFY_EXPR, void_type_node, - spaceref, parmref); - init = fold_build2_loc(loc, COMPOUND_EXPR, TREE_TYPE(space), - build3(COND_EXPR, void_type_node, - check, set, NULL_TREE), - space); + spaceref, init); + init = fold_build2_loc(loc, COMPOUND_EXPR, TREE_TYPE(space), set, space); } DECL_INITIAL(var_decl) = init; |