From 06724e59c514de9845b765f0c33f9d3b7b3e98ea Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 1 Mar 2012 18:19:13 +0000 Subject: [PATCH] compiler: Reliably give errors on misuse of multiple value call. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184755 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/go/gofrontend/types.cc | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 6abe21d2522..3c33a6dcd49 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -622,16 +622,24 @@ Type::are_assignable_check_hidden(const Type* lhs, const Type* rhs, std::string* reason) { // Do some checks first. Make sure the types are defined. - if (rhs != NULL - && rhs->forwarded()->forward_declaration_type() == NULL - && rhs->is_void_type()) + if (rhs != NULL && !rhs->is_undefined()) { - if (reason != NULL) - *reason = "non-value used as value"; - return false; + if (rhs->is_void_type()) + { + if (reason != NULL) + *reason = "non-value used as value"; + return false; + } + if (rhs->is_call_multiple_result_type()) + { + if (reason != NULL) + reason->assign(_("multiple value function call in " + "single value context")); + return false; + } } - if (lhs != NULL && lhs->forwarded()->forward_declaration_type() == NULL) + if (lhs != NULL && !lhs->is_undefined()) { // Any value may be assigned to the blank identifier. if (lhs->is_sink_type()) @@ -639,9 +647,7 @@ Type::are_assignable_check_hidden(const Type* lhs, const Type* rhs, // All fields of a struct must be exported, or the assignment // must be in the same package. - if (check_hidden_fields - && rhs != NULL - && rhs->forwarded()->forward_declaration_type() == NULL) + if (check_hidden_fields && rhs != NULL && !rhs->is_undefined()) { if (lhs->has_hidden_fields(NULL, reason) || rhs->has_hidden_fields(NULL, reason)) @@ -715,9 +721,6 @@ Type::are_assignable_check_hidden(const Type* lhs, const Type* rhs, { if (rhs->interface_type() != NULL) reason->assign(_("need explicit conversion")); - else if (rhs->is_call_multiple_result_type()) - reason->assign(_("multiple value function call in " - "single value context")); else if (lhs->named_type() != NULL && rhs->named_type() != NULL) { size_t len = (lhs->named_type()->name().length() -- 2.11.0