Commit d46699ac by Ian Lance Taylor

compiler: guard against implicit double pointer indirection

    
    The code that lowers field references can 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.
    Detect this situation and issue an error.
    
    Fixes golang/go#21770
    
    Reviewed-on: https://go-review.googlesource.com/62330

From-SVN: r251918
parent 0f99f8e6
9d0d5c03a8086f5dd3a23e910abd6e470196973c 52ebad939927e6cbfb48dd277cef8db451e36533
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -11829,6 +11829,12 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr, ...@@ -11829,6 +11829,12 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr,
go_assert(st != NULL); go_assert(st != NULL);
if (type->struct_type() == 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); go_assert(type->points_to() != NULL);
expr = Expression::make_unary(OPERATOR_MULT, expr, expr = Expression::make_unary(OPERATOR_MULT, expr,
location); location);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment