OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [go.test/] [test/] [interface/] [convert.go] - Rev 700

Compare with Previous | Blame | View Log

// $G $D/$F.go && $L $F.$A && ./$A.out

// 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 uses of all the different interface
// conversion runtime functions.

package main

type Stringer interface {
        String() string
}
type StringLengther interface {
        String() string
        Length() int
}
type Empty interface{}

type T string

func (t T) String() string {
        return string(t)
}
func (t T) Length() int {
        return len(t)
}

type U string

func (u U) String() string {
        return string(u)
}

var t = T("hello")
var u = U("goodbye")
var e Empty
var s Stringer = t
var sl StringLengther = t
var i int
var ok bool

func hello(s string) {
        if s != "hello" {
                println("not hello: ", s)
                panic("fail")
        }
}

func five(i int) {
        if i != 5 {
                println("not 5: ", i)
                panic("fail")
        }
}

func true(ok bool) {
        if !ok {
                panic("not true")
        }
}

func false(ok bool) {
        if ok {
                panic("not false")
        }
}

func main() {
        // T2I
        s = t
        hello(s.String())

        // I2T
        t = s.(T)
        hello(t.String())

        // T2E
        e = t

        // E2T
        t = e.(T)
        hello(t.String())

        // T2I again
        sl = t
        hello(sl.String())
        five(sl.Length())

        // I2I static
        s = sl
        hello(s.String())

        // I2I dynamic
        sl = s.(StringLengther)
        hello(sl.String())
        five(sl.Length())

        // I2E (and E2T)
        e = s
        hello(e.(T).String())

        // E2I
        s = e.(Stringer)
        hello(s.String())

        // I2T2 true
        t, ok = s.(T)
        true(ok)
        hello(t.String())

        // I2T2 false
        _, ok = s.(U)
        false(ok)

        // I2I2 true
        sl, ok = s.(StringLengther)
        true(ok)
        hello(sl.String())
        five(sl.Length())

        // I2I2 false (and T2I)
        s = u
        sl, ok = s.(StringLengther)
        false(ok)

        // E2T2 true
        t, ok = e.(T)
        true(ok)
        hello(t.String())

        // E2T2 false
        i, ok = e.(int)
        false(ok)

        // E2I2 true
        sl, ok = e.(StringLengther)
        true(ok)
        hello(sl.String())
        five(sl.Length())

        // E2I2 false (and T2E)
        e = u
        sl, ok = e.(StringLengther)
        false(ok)
}

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.