compiler: don't permit P.M if P is a pointer type
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 22 Aug 2016 21:30:49 +0000 (21:30 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 22 Aug 2016 21:30:49 +0000 (21:30 +0000)
    When lowering method expressions of the form "P.M" where
    P is a pointer type (e.g. "type P *T") make sure we examine
    the method set of P and not T during method lookup.

    Fixes golang/go#15722.

    Reviewed-on: https://go-review.googlesource.com/24843

From-SVN: r239675

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index e6a0f8483f547f6ae6550278b3aa0bfda696a9b3..0cf4f03be019fbaec2849fc8aab8bb63903cc924 100644 (file)
@@ -1,4 +1,4 @@
-affb1bf5fcd7abf05993c54313d8000b93a08d4a
+0476944600d456b2616981fff90c77be5e06edd5
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index bdc14aa22080afbf172fdbfd6ac7f51627e6024f..803611d544210c857b0560fc74641c9ea4f8f91f 100644 (file)
@@ -11439,7 +11439,8 @@ Expression*
 Selector_expression::lower_method_expression(Gogo* gogo)
 {
   Location location = this->location();
-  Type* type = this->left_->type();
+  Type* left_type = this->left_->type();
+  Type* type = left_type;
   const std::string& name(this->name_);
 
   bool is_pointer;
@@ -11469,7 +11470,8 @@ Selector_expression::lower_method_expression(Gogo* gogo)
        imethod = it->find_method(name);
     }
 
-  if (method == NULL && imethod == NULL)
+  if ((method == NULL && imethod == NULL) 
+      || (left_type->named_type() != NULL && left_type->points_to() != NULL))
     {
       if (!is_ambiguous)
        error_at(location, "type %<%s%s%> has no method %<%s%>",