Go patch committedd: Don't do implicit double pointer indirection

Message ID CAOyqgcXtmfhu-z5co_oWySdUNQxKf3oO78L-aykw9a4_WzHSHw@mail.gmail.com
State New
Headers show
Series
  • Go patch committedd: Don't do implicit double pointer indirection
Related show

Commit Message

Ian Lance Taylor Sept. 9, 2017, 6:01 a.m.
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

Patch

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);