diff options
author | Russ Cox <rsc@golang.org> | 2010-09-30 14:59:41 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-09-30 14:59:41 -0400 |
commit | a447267d1198bbeeff68b58f3e2bce072ac36d7a (patch) | |
tree | c4037d5759c8101bd6fe516d03ede394aa762e1e /test | |
parent | fec2ec6a96b04230e07a8958117564d17ff72a5b (diff) | |
download | go-a447267d1198bbeeff68b58f3e2bce072ac36d7a.tar.gz |
gc, spec, tests: no auto-indirect of pointer to interface value
Implies no embedding of pointer to interface value either.
R=gri, iant, ken2, r, r2
CC=golang-dev
http://codereview.appspot.com/2289041
Diffstat (limited to 'test')
-rwxr-xr-x | test/hashmap.go | 12 | ||||
-rw-r--r-- | test/interface/embed.go | 23 | ||||
-rw-r--r-- | test/interface/embed2.go | 70 | ||||
-rw-r--r-- | test/method.go | 5 | ||||
-rw-r--r-- | test/method2.go | 5 |
5 files changed, 82 insertions, 33 deletions
diff --git a/test/hashmap.go b/test/hashmap.go index 096ece0a5..0a4d7ab61 100755 --- a/test/hashmap.go +++ b/test/hashmap.go @@ -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_log2_capacity uint32) { } -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) *Entry { } -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 diff --git a/test/interface/embed.go b/test/interface/embed.go index 4a702398c..2fddee190 100644 --- a/test/interface/embed.go +++ b/test/interface/embed.go @@ -4,7 +4,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Check methods derived from embedded interface and *interface values. +// Check methods derived from embedded interface values. package main @@ -19,18 +19,12 @@ func (t T) M() int64 { return int64(t) } var t = T(Value) var pt = &t var ti Inter = t -var pti = &ti type S struct { Inter } var s = S{ ti } var ps = &s -type SP struct { *Inter } -var sp = SP{ &ti } -var psp = &sp - var i Inter -var pi = &i var ok = true @@ -45,35 +39,20 @@ func main() { check("t.M()", t.M()) check("pt.M()", pt.M()) check("ti.M()", ti.M()) - check("pti.M()", pti.M()) check("s.M()", s.M()) check("ps.M()", ps.M()) - check("sp.M()", sp.M()) - check("psp.M()", psp.M()) i = t check("i = t; i.M()", i.M()) - check("i = t; pi.M()", pi.M()) i = pt check("i = pt; i.M()", i.M()) - check("i = pt; pi.M()", pi.M()) i = s check("i = s; i.M()", i.M()) - check("i = s; pi.M()", pi.M()) i = ps check("i = ps; i.M()", i.M()) - check("i = ps; pi.M()", pi.M()) - - i = sp - check("i = sp; i.M()", i.M()) - check("i = sp; pi.M()", pi.M()) - - i = psp - check("i = psp; i.M()", i.M()) - check("i = psp; pi.M()", pi.M()) if !ok { println("BUG: interface10") diff --git a/test/interface/embed2.go b/test/interface/embed2.go new file mode 100644 index 000000000..c18a1fece --- /dev/null +++ b/test/interface/embed2.go @@ -0,0 +1,70 @@ +// errchk $G -e $D/$F.go + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Check methods derived from embedded interface and *interface values. + +package main + +import "os" + +const Value = 1e12 + +type Inter interface { M() int64 } + +type T int64 +func (t T) M() int64 { return int64(t) } +var t = T(Value) +var pt = &t +var ti Inter = t +var pti = &ti + +type S struct { Inter } +var s = S{ ti } +var ps = &s + +type SP struct { *Inter } // ERROR "interface" + +var i Inter +var pi = &i + +var ok = true + +func check(s string, v int64) { + if v != Value { + println(s, v) + ok = false + } +} + +func main() { + check("t.M()", t.M()) + check("pt.M()", pt.M()) + check("ti.M()", ti.M()) + check("pti.M()", pti.M()) // ERROR "method" + check("s.M()", s.M()) + check("ps.M()", ps.M()) + + i = t + check("i = t; i.M()", i.M()) + check("i = t; pi.M()", pi.M()) // ERROR "method" + + i = pt + check("i = pt; i.M()", i.M()) + check("i = pt; pi.M()", pi.M()) // ERROR "method" + + i = s + check("i = s; i.M()", i.M()) + check("i = s; pi.M()", pi.M()) // ERROR "method" + + i = ps + check("i = ps; i.M()", i.M()) + check("i = ps; pi.M()", pi.M()) // ERROR "method" + + if !ok { + println("BUG: interface10") + os.Exit(1) + } +} diff --git a/test/method.go b/test/method.go index b52d97894..b5a02c687 100644 --- a/test/method.go +++ b/test/method.go @@ -124,9 +124,4 @@ func main() { println("Val.val(v):", Val.val(v)) panic("fail") } - pv := &v - if pv.val() != 3 { - println("pv.val():", pv.val()) - panic("fail") - } } diff --git a/test/method2.go b/test/method2.go index cda6d9aad..a72536e7b 100644 --- a/test/method2.go +++ b/test/method2.go @@ -20,3 +20,8 @@ type Val interface { } var _ = (*Val).val // ERROR "method" + +var v Val +var pv = &v + +var _ = pv.val() // ERROR "method" |