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

Subversion Repositories openrisc

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

Compare with Previous | Blame | View Log

// errchk $G -e $D/$F.go

// Copyright 2010 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.

// Test cases for revised conversion rules.

package main

func main() {
        type NewInt int
        i0 := 0
        var i1 int = 1
        var i2 NewInt = 1
        i0 = i0
        i0 = i1
        i0 = int(i2)
        i1 = i0
        i1 = i1
        i1 = int(i2)
        i2 = NewInt(i0)
        i2 = NewInt(i1)
        i2 = i2

        type A1 [3]int
        type A2 [3]NewInt
        var a0 [3]int
        var a1 A1
        var a2 A2
        a0 = a0
        a0 = a1
        a0 = [3]int(a2) // ERROR "cannot|invalid"
        a1 = a0
        a1 = a1
        a1 = A1(a2) // ERROR "cannot|invalid"
        a2 = A2(a0) // ERROR "cannot|invalid"
        a2 = A2(a1) // ERROR "cannot|invalid"
        a2 = a2

        type S1 struct {
                x int
        }
        type S2 struct {
                x NewInt
        }
        var s0 struct {
                x int
        }
        var s1 S1
        var s2 S2
        s0 = s0
        s0 = s1
        s0 = struct {
                x int
        }(s2) // ERROR "cannot|invalid"
        s1 = s0
        s1 = s1
        s1 = S1(s2) // ERROR "cannot|invalid"
        s2 = S2(s0) // ERROR "cannot|invalid"
        s2 = S2(s1) // ERROR "cannot|invalid"
        s2 = s2

        type P1 *int
        type P2 *NewInt
        var p0 *int
        var p1 P1
        var p2 P2
        p0 = p0
        p0 = p1
        p0 = (*int)(p2) // ERROR "cannot|invalid"
        p1 = p0
        p1 = p1
        p1 = P1(p2) // ERROR "cannot|invalid"
        p2 = P2(p0) // ERROR "cannot|invalid"
        p2 = P2(p1) // ERROR "cannot|invalid"
        p2 = p2

        type Q1 *struct {
                x int
        }
        type Q2 *S1
        var q0 *struct {
                x int
        }
        var q1 Q1
        var q2 Q2
        var ps1 *S1
        q0 = q0
        q0 = q1
        q0 = (*struct {
                x int
        })(ps1) // legal because of special conversion exception for pointers
        q0 = (*struct {
                x int
        })(q2) // ERROR "cannot|invalid"
        q1 = q0
        q1 = q1
        q1 = Q1(q2)    // ERROR "cannot|invalid"
        q2 = (*S1)(q0) // legal because of special conversion exception for pointers
        q2 = Q2(q1)    // ERROR "cannot|invalid"
        q2 = q2

        type F1 func(x NewInt) int
        type F2 func(x int) NewInt
        var f0 func(x NewInt) int
        var f1 F1
        var f2 F2
        f0 = f0
        f0 = f1
        f0 = func(x NewInt) int(f2) // ERROR "cannot|invalid"
        f1 = f0
        f1 = f1
        f1 = F1(f2) // ERROR "cannot|invalid"
        f2 = F2(f0) // ERROR "cannot|invalid"
        f2 = F2(f1) // ERROR "cannot|invalid"
        f2 = f2

        type X1 interface {
                f() int
        }
        type X2 interface {
                f() NewInt
        }
        var x0 interface {
                f() int
        }
        var x1 X1
        var x2 X2
        x0 = x0
        x0 = x1
        x0 = interface {
                f() int
        }(x2) // ERROR "cannot|need type assertion|incompatible"
        x1 = x0
        x1 = x1
        x1 = X1(x2) // ERROR "cannot|need type assertion|incompatible"
        x2 = X2(x0) // ERROR "cannot|need type assertion|incompatible"
        x2 = X2(x1) // ERROR "cannot|need type assertion|incompatible"
        x2 = x2

        type L1 []int
        type L2 []NewInt
        var l0 []int
        var l1 L1
        var l2 L2
        l0 = l0
        l0 = l1
        l0 = []int(l2) // ERROR "cannot|invalid"
        l1 = l0
        l1 = l1
        l1 = L1(l2) // ERROR "cannot|invalid"
        l2 = L2(l0) // ERROR "cannot|invalid"
        l2 = L2(l1) // ERROR "cannot|invalid"
        l2 = l2

        type M1 map[string]int
        type M2 map[string]NewInt
        var m0 []int
        var m1 L1
        var m2 L2
        m0 = m0
        m0 = m1
        m0 = []int(m2) // ERROR "cannot|invalid"
        m1 = m0
        m1 = m1
        m1 = L1(m2) // ERROR "cannot|invalid"
        m2 = L2(m0) // ERROR "cannot|invalid"
        m2 = L2(m1) // ERROR "cannot|invalid"
        m2 = m2

        type C1 chan int
        type C2 chan NewInt
        var c0 chan int
        var c1 C1
        var c2 C2
        c0 = c0
        c0 = c1
        c0 = chan int(c2) // ERROR "cannot|invalid"
        c1 = c0
        c1 = c1
        c1 = C1(c2) // ERROR "cannot|invalid"
        c2 = C2(c0) // ERROR "cannot|invalid"
        c2 = C2(c1) // ERROR "cannot|invalid"
        c2 = c2

        // internal compiler error (6g and gccgo)
        type T interface{}
        var _ T = 17 // assignment compatible
        _ = T(17)    // internal compiler error even though assignment compatible
}

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.