diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-09-09 06:01:35 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-09-09 06:01:35 +0000 |
commit | d46699acb04b053a391abe3841543dfe0cfb5751 (patch) | |
tree | ba2149f66908b36dd5a9815a4225e7823f2120bf /gcc | |
parent | 0f99f8e6d63038b68e5e7af950ff9e329bdc40ad (diff) | |
download | gcc-d46699acb04b053a391abe3841543dfe0cfb5751.zip gcc-d46699acb04b053a391abe3841543dfe0cfb5751.tar.gz gcc-d46699acb04b053a391abe3841543dfe0cfb5751.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/types.cc | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index edcea96..9576230 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 4d92373..cde1408 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -11829,6 +11829,12 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr, 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); |