In Go pointers are automatically dereferenced when calling value methods. However, the Go frontend was accidentally permitting a double dereference when calling a method on a pointer value, which the language does not permit. This patch fixes the problem. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r f2a8b369a473 go/types.cc --- a/go/types.cc Sat Jan 21 13:57:44 2012 -0800 +++ b/go/types.cc Sat Jan 21 14:18:52 2012 -0800 @@ -8605,6 +8605,7 @@ // 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 @@ 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 @@ 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);