The Go frontend code that lowers field references could sometimes introduce a double pointer indirection in cases where it is not/safe appropriate. For example, in
var p **struct { f int } p.f = 0 the assignment LHS was being incorrectly lowered to (*(*p)).f. This patch by Than McIntosh detects this situation and issues an error message. This fixes https://golang.org/issue/21770. A test will be committed to the master testsuite in https://golang.org/cl/62331. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline. Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 251574) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -9d0d5c03a8086f5dd3a23e910abd6e470196973c +52ebad939927e6cbfb48dd277cef8db451e36533 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/types.cc =================================================================== --- gcc/go/gofrontend/types.cc (revision 251533) +++ gcc/go/gofrontend/types.cc (working copy) @@ -11829,6 +11829,12 @@ Type::bind_field_or_method(Gogo* gogo, c go_assert(st != NULL); if (type->struct_type() == NULL) { + if (dereferenced) + { + go_error_at(location, "pointer type has no field %qs", + Gogo::message_name(name).c_str()); + return Expression::make_error(location); + } go_assert(type->points_to() != NULL); expr = Expression::make_unary(OPERATOR_MULT, expr, location);