diff mbox

Go patch committed: Don't look up methods for pointer to interface

Message ID mcrmxkhityd.fsf@google.com
State New
Headers show

Commit Message

Ian Lance Taylor March 26, 2011, 7:04 p.m. UTC
The Go language now specifies that pointers to interfaces are not
automatically dereferenced when looking up methods.  This patch
implements that in the gccgo frontend.  Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu.  Committed to mainline.

Ian
diff mbox

Patch

diff -r d963d5ee4313 go/types.cc
--- a/go/types.cc	Sat Mar 26 11:30:05 2011 -0700
+++ b/go/types.cc	Sat Mar 26 11:58:02 2011 -0700
@@ -7995,7 +7995,7 @@ 
 
   const Named_type* nt = type->deref()->named_type();
   const Struct_type* st = type->deref()->struct_type();
-  const Interface_type* it = type->deref()->interface_type();
+  const Interface_type* it = type->interface_type();
 
   // If this is a pointer to a pointer, then it is possible that the
   // pointed-to type has methods.
@@ -8011,7 +8011,6 @@ 
 	return Expression::make_error(location);
       nt = type->points_to()->named_type();
       st = type->points_to()->struct_type();
-      it = type->points_to()->interface_type();
     }
 
   bool receiver_can_be_pointer = (expr->type()->points_to() != NULL
@@ -8164,7 +8163,7 @@ 
     }
 
   // Interface types can have methods.
-  const Interface_type* it = type->deref()->interface_type();
+  const Interface_type* it = type->interface_type();
   if (it != NULL && it->find_method(name) != NULL)
     {
       *is_method = true;
@@ -8326,12 +8325,12 @@ 
 	}
     }
 
-  type = type->deref();
-
   const Interface_type* it = type->interface_type();
   if (it != NULL && it->is_unexported_method(gogo, name))
     return true;
 
+  type = type->deref();
+
   const Struct_type* st = type->struct_type();
   if (st != NULL && st->is_unexported_local_field(gogo, name))
     return true;
Index: gcc/testsuite/go.test/test/hashmap.go
===================================================================
--- gcc/testsuite/go.test/test/hashmap.go	(revision 171359)
+++ gcc/testsuite/go.test/test/hashmap.go	(working copy)
@@ -21,7 +21,7 @@  func ASSERT(p bool) {
 
 type KeyType interface {
 	Hash() uint32
-	Match(other *KeyType) bool
+	Match(other KeyType) bool
 }
 
 
@@ -31,8 +31,8 @@  type ValueType interface {
 
 
 type Entry struct {
-	key *KeyType
-	value *ValueType
+	key KeyType
+	value ValueType
 }
 
 
@@ -68,7 +68,7 @@  func (m *HashMap) Initialize (initial_lo
 }
 
 
-func (m *HashMap) Probe (key *KeyType) *Entry {
+func (m *HashMap) Probe (key KeyType) *Entry {
 	ASSERT(key != nil)
 
 	var i uint32 = key.Hash() % m.capacity()
@@ -86,7 +86,7 @@  func (m *HashMap) Probe (key *KeyType) *
 }
 
 
-func (m *HashMap) Lookup (key *KeyType, insert bool) *Entry {
+func (m *HashMap) Lookup (key KeyType, insert bool) *Entry {
 	// Find a matching entry.
 	var p *Entry = m.Probe(key)
 		if p.key != nil {
@@ -145,7 +145,7 @@  func (n *Number) Hash() uint32 {
 }
 
 
-func (n *Number) Match(other *KeyType) bool {
+func (n *Number) Match(other KeyType) bool {
 	// var y *Number = other
 	// return n.x == y.x
 	return false