2012-02-16 23:51:04 -05:00
// run
2008-10-04 02:51:03 -07:00
// 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.
2012-02-23 18:47:26 +11:00
// Test simple methods of various types, with pointer and
// value receivers.
2008-10-04 02:51:03 -07:00
package main
2009-01-20 14:40:40 -08:00
type S string
type S1 string
type I int
type I1 int
2010-03-24 16:46:53 -07:00
type T struct {
x int
}
2009-01-20 14:40:40 -08:00
type T1 T
2008-10-04 02:51:03 -07:00
2010-03-24 16:46:53 -07:00
func ( s S ) val ( ) int { return 1 }
2008-10-04 02:51:03 -07:00
func ( s * S1 ) val ( ) int { return 2 }
2010-03-24 16:46:53 -07:00
func ( i I ) val ( ) int { return 3 }
2008-10-04 02:51:03 -07:00
func ( i * I1 ) val ( ) int { return 4 }
2010-09-28 13:43:50 -04:00
func ( t T ) val ( ) int { return 7 }
2008-10-04 02:51:03 -07:00
func ( t * T1 ) val ( ) int { return 8 }
2009-01-20 14:40:40 -08:00
type Val interface {
2008-10-04 02:51:03 -07:00
val ( ) int
}
2010-03-24 16:46:53 -07:00
func val ( v Val ) int { return v . val ( ) }
2008-10-04 02:51:03 -07:00
func main ( ) {
2010-03-24 16:46:53 -07:00
var s S
var ps * S1
var i I
var pi * I1
var pt * T1
2010-09-28 13:43:50 -04:00
var t T
var v Val
2010-03-24 16:46:53 -07:00
if s . val ( ) != 1 {
println ( "s.val:" , s . val ( ) )
panic ( "fail" )
}
if S . val ( s ) != 1 {
println ( "S.val(s):" , S . val ( s ) )
panic ( "fail" )
}
if ( * S ) . val ( & s ) != 1 {
println ( "(*S).val(s):" , ( * S ) . val ( & s ) )
panic ( "fail" )
}
if ps . val ( ) != 2 {
println ( "ps.val:" , ps . val ( ) )
panic ( "fail" )
}
if ( * S1 ) . val ( ps ) != 2 {
println ( "(*S1).val(ps):" , ( * S1 ) . val ( ps ) )
panic ( "fail" )
}
if i . val ( ) != 3 {
println ( "i.val:" , i . val ( ) )
panic ( "fail" )
}
if I . val ( i ) != 3 {
println ( "I.val(i):" , I . val ( i ) )
panic ( "fail" )
}
if ( * I ) . val ( & i ) != 3 {
println ( "(*I).val(&i):" , ( * I ) . val ( & i ) )
panic ( "fail" )
}
if pi . val ( ) != 4 {
println ( "pi.val:" , pi . val ( ) )
panic ( "fail" )
}
if ( * I1 ) . val ( pi ) != 4 {
println ( "(*I1).val(pi):" , ( * I1 ) . val ( pi ) )
panic ( "fail" )
}
2010-09-28 13:43:50 -04:00
if t . val ( ) != 7 {
println ( "t.val:" , t . val ( ) )
panic ( "fail" )
}
2010-03-24 16:46:53 -07:00
if pt . val ( ) != 8 {
println ( "pt.val:" , pt . val ( ) )
panic ( "fail" )
}
if ( * T1 ) . val ( pt ) != 8 {
println ( "(*T1).val(pt):" , ( * T1 ) . val ( pt ) )
panic ( "fail" )
}
if val ( s ) != 1 {
2012-03-07 02:27:15 -05:00
println ( "val(s):" , val ( s ) )
2010-03-24 16:46:53 -07:00
panic ( "fail" )
}
if val ( ps ) != 2 {
2012-03-07 02:27:15 -05:00
println ( "val(ps):" , val ( ps ) )
2010-03-24 16:46:53 -07:00
panic ( "fail" )
}
if val ( i ) != 3 {
2012-03-07 02:27:15 -05:00
println ( "val(i):" , val ( i ) )
2010-03-24 16:46:53 -07:00
panic ( "fail" )
}
if val ( pi ) != 4 {
2012-03-07 02:27:15 -05:00
println ( "val(pi):" , val ( pi ) )
2010-03-24 16:46:53 -07:00
panic ( "fail" )
}
2010-09-28 13:43:50 -04:00
if val ( t ) != 7 {
2012-03-07 02:27:15 -05:00
println ( "val(t):" , val ( t ) )
2010-09-28 13:43:50 -04:00
panic ( "fail" )
}
2010-03-24 16:46:53 -07:00
if val ( pt ) != 8 {
2012-03-07 02:27:15 -05:00
println ( "val(pt):" , val ( pt ) )
2010-03-24 16:46:53 -07:00
panic ( "fail" )
}
2010-09-28 13:43:50 -04:00
if Val . val ( i ) != 3 {
println ( "Val.val(i):" , Val . val ( i ) )
panic ( "fail" )
}
v = i
if Val . val ( v ) != 3 {
println ( "Val.val(v):" , Val . val ( v ) )
panic ( "fail" )
}
2012-03-07 02:27:15 -05:00
2013-02-11 18:20:52 -05:00
var zs struct { S }
var zps struct { * S1 }
var zi struct { I }
var zpi struct { * I1 }
var zpt struct { * T1 }
var zt struct { T }
var zv struct { Val }
2012-03-07 02:27:15 -05:00
if zs . val ( ) != 1 {
println ( "zs.val:" , zs . val ( ) )
panic ( "fail" )
}
if zps . val ( ) != 2 {
println ( "zps.val:" , zps . val ( ) )
panic ( "fail" )
}
if zi . val ( ) != 3 {
println ( "zi.val:" , zi . val ( ) )
panic ( "fail" )
}
if zpi . val ( ) != 4 {
println ( "zpi.val:" , zpi . val ( ) )
panic ( "fail" )
}
if zt . val ( ) != 7 {
println ( "zt.val:" , zt . val ( ) )
panic ( "fail" )
}
if zpt . val ( ) != 8 {
println ( "zpt.val:" , zpt . val ( ) )
panic ( "fail" )
}
if val ( zs ) != 1 {
println ( "val(zs):" , val ( zs ) )
panic ( "fail" )
}
if val ( zps ) != 2 {
println ( "val(zps):" , val ( zps ) )
panic ( "fail" )
}
if val ( zi ) != 3 {
println ( "val(zi):" , val ( zi ) )
panic ( "fail" )
}
if val ( zpi ) != 4 {
println ( "val(zpi):" , val ( zpi ) )
panic ( "fail" )
}
if val ( zt ) != 7 {
println ( "val(zt):" , val ( zt ) )
panic ( "fail" )
}
if val ( zpt ) != 8 {
println ( "val(zpt):" , val ( zpt ) )
panic ( "fail" )
}
zv . Val = zi
if zv . val ( ) != 3 {
println ( "zv.val():" , zv . val ( ) )
panic ( "fail" )
}
if ( & zs ) . val ( ) != 1 {
println ( "(&zs).val:" , ( & zs ) . val ( ) )
panic ( "fail" )
}
if ( & zps ) . val ( ) != 2 {
println ( "(&zps).val:" , ( & zps ) . val ( ) )
panic ( "fail" )
}
if ( & zi ) . val ( ) != 3 {
println ( "(&zi).val:" , ( & zi ) . val ( ) )
panic ( "fail" )
}
if ( & zpi ) . val ( ) != 4 {
println ( "(&zpi).val:" , ( & zpi ) . val ( ) )
panic ( "fail" )
}
if ( & zt ) . val ( ) != 7 {
println ( "(&zt).val:" , ( & zt ) . val ( ) )
panic ( "fail" )
}
if ( & zpt ) . val ( ) != 8 {
println ( "(&zpt).val:" , ( & zpt ) . val ( ) )
panic ( "fail" )
}
if val ( & zs ) != 1 {
println ( "val(&zs):" , val ( & zs ) )
panic ( "fail" )
}
if val ( & zps ) != 2 {
println ( "val(&zps):" , val ( & zps ) )
panic ( "fail" )
}
if val ( & zi ) != 3 {
println ( "val(&zi):" , val ( & zi ) )
panic ( "fail" )
}
if val ( & zpi ) != 4 {
println ( "val(&zpi):" , val ( & zpi ) )
panic ( "fail" )
}
if val ( & zt ) != 7 {
println ( "val(&zt):" , val ( & zt ) )
panic ( "fail" )
}
if val ( & zpt ) != 8 {
println ( "val(&zpt):" , val ( & zpt ) )
panic ( "fail" )
}
zv . Val = & zi
if zv . val ( ) != 3 {
println ( "zv.val():" , zv . val ( ) )
panic ( "fail" )
}
2013-02-11 18:20:52 -05:00
promotion ( )
}
type A struct { B }
type B struct {
C
* D
}
type C int
func ( C ) f ( ) { } // value receiver, direct field of A
func ( * C ) g ( ) { } // pointer receiver
type D int
func ( D ) h ( ) { } // value receiver, indirect field of A
func ( * D ) i ( ) { } // pointer receiver
func expectPanic ( ) {
if r := recover ( ) ; r == nil {
panic ( "expected nil dereference" )
}
}
func promotion ( ) {
var a A
// Addressable value receiver.
a . f ( )
a . g ( )
func ( ) {
defer expectPanic ( )
a . h ( ) // dynamic error: nil dereference in a.B.D->f()
} ( )
a . i ( )
// Non-addressable value receiver.
A ( a ) . f ( )
// A(a).g() // static error: cannot call pointer method on A literal.B.C
func ( ) {
defer expectPanic ( )
A ( a ) . h ( ) // dynamic error: nil dereference in A().B.D->f()
} ( )
A ( a ) . i ( )
// Pointer receiver.
( & a ) . f ( )
( & a ) . g ( )
func ( ) {
defer expectPanic ( )
( & a ) . h ( ) // dynamic error: nil deref: nil dereference in (&a).B.D->f()
} ( )
( & a ) . i ( )
c := new ( C )
c . f ( ) // makes a copy
c . g ( )
2008-10-04 02:51:03 -07:00
}