aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-09-20 04:35:13 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-09-20 04:35:13 +0000
commit6c74ce92d54a4477b46288f6b3cd13d55885d350 (patch)
tree933dcc0498ade9d1da2fc7361de7f9b022b580b5
parent9d12bc687646448ab491066f34f25f5932d6144a (diff)
downloadgcc-6c74ce92d54a4477b46288f6b3cd13d55885d350.zip
gcc-6c74ce92d54a4477b46288f6b3cd13d55885d350.tar.gz
gcc-6c74ce92d54a4477b46288f6b3cd13d55885d350.tar.bz2
compiler: Fix struct hash and equality with _ fields.
From-SVN: r191511
-rw-r--r--gcc/go/gofrontend/expressions.cc3
-rw-r--r--gcc/go/gofrontend/types.cc12
2 files changed, 15 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 892c561..ea24849 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -5178,6 +5178,9 @@ Binary_expression::lower_struct_comparison(Gogo* gogo,
pf != fields->end();
++pf, ++field_index)
{
+ if (Gogo::is_sink_name(pf->field_name()))
+ continue;
+
if (field_index > 0)
{
if (left_temp == NULL)
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index d527787..5c210cb 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -579,6 +579,9 @@ Type::are_compatible_for_comparison(bool is_equality_op, const Type *t1,
p != fields->end();
++p)
{
+ if (Gogo::is_sink_name(p->field_name()))
+ continue;
+
if (!p->type()->is_comparable())
{
if (reason != NULL)
@@ -4294,6 +4297,9 @@ Struct_type::do_compare_is_identity(Gogo* gogo) const
pf != fields->end();
++pf)
{
+ if (Gogo::is_sink_name(pf->field_name()))
+ return false;
+
if (!pf->type()->compare_is_identity(gogo))
return false;
@@ -4767,6 +4773,9 @@ Struct_type::write_hash_function(Gogo* gogo, Named_type*,
pf != fields->end();
++pf)
{
+ if (Gogo::is_sink_name(pf->field_name()))
+ continue;
+
if (first)
first = false;
else
@@ -4858,6 +4867,9 @@ Struct_type::write_equal_function(Gogo* gogo, Named_type* name)
pf != fields->end();
++pf, ++field_index)
{
+ if (Gogo::is_sink_name(pf->field_name()))
+ continue;
+
// Compare one field in both P1 and P2.
Expression* f1 = Expression::make_temporary_reference(p1, bloc);
f1 = Expression::make_unary(OPERATOR_MULT, f1, bloc);