diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-01-21 22:21:22 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-01-21 22:21:22 +0000 |
commit | 8f94383a99eddb3c7c6b94ffaa3528c0e22c68c2 (patch) | |
tree | 87dcedfe8fceed6eaddc57fa6e83af82295c8832 | |
parent | 98dfd7ff168ecce9305ad2bc713bf1aa3dbda7a7 (diff) | |
download | gcc-8f94383a99eddb3c7c6b94ffaa3528c0e22c68c2.zip gcc-8f94383a99eddb3c7c6b94ffaa3528c0e22c68c2.tar.gz gcc-8f94383a99eddb3c7c6b94ffaa3528c0e22c68c2.tar.bz2 |
compiler: Check for calling value method with dereferenced value.
From-SVN: r183379
-rw-r--r-- | gcc/go/gofrontend/types.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 29c3cd7..bb06edb 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -8605,6 +8605,7 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr, // If this is a pointer to a pointer, then it is possible that the // pointed-to type has methods. + bool dereferenced = false; if (nt == NULL && st == NULL && it == NULL @@ -8617,6 +8618,7 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr, return Expression::make_error(location); nt = type->points_to()->named_type(); st = type->points_to()->struct_type(); + dereferenced = true; } bool receiver_can_be_pointer = (expr->type()->points_to() != NULL @@ -8656,6 +8658,12 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr, else go_unreachable(); go_assert(m != NULL); + if (dereferenced && m->is_value_method()) + { + error_at(location, + "calling value method requires explicit dereference"); + return Expression::make_error(location); + } if (!m->is_value_method() && expr->type()->points_to() == NULL) expr = Expression::make_unary(OPERATOR_AND, expr, location); ret = m->bind_method(expr, location); |