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

Subversion Repositories openrisc

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

Compare with Previous | Blame | View Log

// $G $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.

package main

import "os"

const (
        Bool = iota
        Int
        Float
        String
        Struct
        Chan
        Array
        Map
        Func
        Last
)

type S struct {
        a int
}

var s S = S{1234}

var c = make(chan int)

var a = []int{0, 1, 2, 3}

var m = make(map[string]int)

func assert(b bool, s string) {
        if !b {
                println(s)
                os.Exit(1)
        }
}

func f(i int) interface{} {
        switch i {
        case Bool:
                return true
        case Int:
                return 7
        case Float:
                return 7.4
        case String:
                return "hello"
        case Struct:
                return s
        case Chan:
                return c
        case Array:
                return a
        case Map:
                return m
        case Func:
                return f
        }
        panic("bad type number")
}

func main() {
        for i := Bool; i < Last; i++ {
                switch x := f(i).(type) {
                case bool:
                        assert(x == true && i == Bool, "bool")
                case int:
                        assert(x == 7 && i == Int, "int")
                case float64:
                        assert(x == 7.4 && i == Float, "float64")
                case string:
                        assert(x == "hello" && i == String, "string")
                case S:
                        assert(x.a == 1234 && i == Struct, "struct")
                case chan int:
                        assert(x == c && i == Chan, "chan")
                case []int:
                        assert(x[3] == 3 && i == Array, "array")
                case map[string]int:
                        assert(x != nil && i == Map, "map")
                case func(i int) interface{}:
                        assert(x != nil && i == Func, "fun")
                default:
                        assert(false, "unknown")
                }
        }

        // boolean switch (has had bugs in past; worth writing down)
        switch {
        case true:
                assert(true, "switch 2 bool")
        default:
                assert(false, "switch 2 unknown")
        }

        switch true {
        case true:
                assert(true, "switch 3 bool")
        default:
                assert(false, "switch 3 unknown")
        }

        switch false {
        case false:
                assert(true, "switch 4 bool")
        default:
                assert(false, "switch 4 unknown")
        }
}

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.