184 lines
5.5 KiB
Go
184 lines
5.5 KiB
Go
//golangcitest:args -Eunconvert
|
|
package testdata
|
|
|
|
import "io"
|
|
|
|
// Various explicit conversions of untyped constants
|
|
// that cannot be removed.
|
|
func _() {
|
|
const (
|
|
_ = byte(0)
|
|
_ = int((real)(0i))
|
|
_ = complex64(complex(1, 2))
|
|
_ = (bool)(true || false)
|
|
|
|
PtrSize = 4 << (^uintptr(0) >> 63)
|
|
c0 = uintptr(PtrSize)
|
|
c1 = uintptr((8-PtrSize)/4*2860486313 + (PtrSize-4)/4*33054211828000289)
|
|
)
|
|
|
|
i := int64(0)
|
|
_ = i
|
|
}
|
|
|
|
// Make sure we distinguish function calls from
|
|
// conversion to function type.
|
|
func _() {
|
|
type F func(F) int
|
|
var f F
|
|
|
|
_ = F(F(nil)) // want "unnecessary conversion"
|
|
_ = f(F(nil))
|
|
}
|
|
|
|
// Make sure we don't remove explicit conversions that
|
|
// prevent fusing floating-point operation.
|
|
func _() {
|
|
var f1, f2, f3, ftmp float64
|
|
_ = f1 + float64(f2*f3)
|
|
ftmp = float64(f2 * f3)
|
|
_ = f1 + ftmp
|
|
ftmp = f2 * f3
|
|
_ = f1 + float64(ftmp)
|
|
|
|
var c1, c2, c3, ctmp complex128
|
|
_ = c1 + complex128(c2*c3)
|
|
ctmp = complex128(c2 * c3)
|
|
_ = c1 + ctmp
|
|
ctmp = c2 * c3
|
|
_ = c1 + complex128(ctmp)
|
|
}
|
|
|
|
// Basic contains conversion errors for builtin data types
|
|
func Basic() {
|
|
var vbool bool
|
|
var vbyte byte
|
|
var vcomplex128 complex128
|
|
var vcomplex64 complex64
|
|
var verror error
|
|
var vfloat32 float32
|
|
var vfloat64 float64
|
|
var vint int
|
|
var vint16 int16
|
|
var vint32 int32
|
|
var vint64 int64
|
|
var vint8 int8
|
|
var vrune rune
|
|
var vstring string
|
|
var vuint uint
|
|
var vuint16 uint16
|
|
var vuint32 uint32
|
|
var vuint64 uint64
|
|
var vuint8 uint8
|
|
var vuintptr uintptr
|
|
|
|
_ = bool(vbool) // want "unnecessary conversion"
|
|
_ = byte(vbyte) // want "unnecessary conversion"
|
|
_ = error(verror) // want "unnecessary conversion"
|
|
_ = int(vint) // want "unnecessary conversion"
|
|
_ = int16(vint16) // want "unnecessary conversion"
|
|
_ = int32(vint32) // want "unnecessary conversion"
|
|
_ = int64(vint64) // want "unnecessary conversion"
|
|
_ = int8(vint8) // want "unnecessary conversion"
|
|
_ = rune(vrune) // want "unnecessary conversion"
|
|
_ = string(vstring) // want "unnecessary conversion"
|
|
_ = uint(vuint) // want "unnecessary conversion"
|
|
_ = uint16(vuint16) // want "unnecessary conversion"
|
|
_ = uint32(vuint32) // want "unnecessary conversion"
|
|
_ = uint64(vuint64) // want "unnecessary conversion"
|
|
_ = uint8(vuint8) // want "unnecessary conversion"
|
|
_ = uintptr(vuintptr) // want "unnecessary conversion"
|
|
|
|
_ = float32(vfloat32)
|
|
_ = float64(vfloat64)
|
|
_ = complex128(vcomplex128)
|
|
_ = complex64(vcomplex64)
|
|
|
|
// Pointers
|
|
_ = (*bool)(&vbool) // want "unnecessary conversion"
|
|
_ = (*byte)(&vbyte) // want "unnecessary conversion"
|
|
_ = (*complex128)(&vcomplex128) // want "unnecessary conversion"
|
|
_ = (*complex64)(&vcomplex64) // want "unnecessary conversion"
|
|
_ = (*error)(&verror) // want "unnecessary conversion"
|
|
_ = (*float32)(&vfloat32) // want "unnecessary conversion"
|
|
_ = (*float64)(&vfloat64) // want "unnecessary conversion"
|
|
_ = (*int)(&vint) // want "unnecessary conversion"
|
|
_ = (*int16)(&vint16) // want "unnecessary conversion"
|
|
_ = (*int32)(&vint32) // want "unnecessary conversion"
|
|
_ = (*int64)(&vint64) // want "unnecessary conversion"
|
|
_ = (*int8)(&vint8) // want "unnecessary conversion"
|
|
_ = (*rune)(&vrune) // want "unnecessary conversion"
|
|
_ = (*string)(&vstring) // want "unnecessary conversion"
|
|
_ = (*uint)(&vuint) // want "unnecessary conversion"
|
|
_ = (*uint16)(&vuint16) // want "unnecessary conversion"
|
|
_ = (*uint32)(&vuint32) // want "unnecessary conversion"
|
|
_ = (*uint64)(&vuint64) // want "unnecessary conversion"
|
|
_ = (*uint8)(&vuint8) // want "unnecessary conversion"
|
|
_ = (*uintptr)(&vuintptr) // want "unnecessary conversion"
|
|
}
|
|
|
|
// Counter is an int64
|
|
type Counter int64
|
|
|
|
// ID is a typed identifier
|
|
type ID string
|
|
|
|
// Metric is a struct
|
|
type Metric struct {
|
|
ID ID
|
|
Counter Counter
|
|
}
|
|
|
|
// Custom contains conversion errors for builtin data types
|
|
func Custom() {
|
|
type Local struct{ id ID }
|
|
|
|
var counter Counter
|
|
var id ID
|
|
var m Metric
|
|
var local Local
|
|
var x struct{ id ID }
|
|
|
|
_ = Counter(counter) // want "unnecessary conversion"
|
|
_ = ID(id) // want "unnecessary conversion"
|
|
_ = Metric(m) // want "unnecessary conversion"
|
|
_ = Local(local) // want "unnecessary conversion"
|
|
_ = (struct{ id ID })(x) // want "unnecessary conversion"
|
|
|
|
// Pointers
|
|
_ = (*Counter)(&counter) // want "unnecessary conversion"
|
|
_ = (*ID)(&id) // want "unnecessary conversion"
|
|
_ = (*Metric)(&m) // want "unnecessary conversion"
|
|
_ = (*Local)(&local) // want "unnecessary conversion"
|
|
_ = (*struct{ id ID })(&x) // want "unnecessary conversion"
|
|
}
|
|
|
|
// Interfaces contains conversion errors for interfaces
|
|
func Interfaces() {
|
|
var writer io.Writer
|
|
|
|
_ = (io.Writer)(writer) // want "unnecessary conversion"
|
|
_ = (*io.Writer)(&writer) // want "unnecessary conversion"
|
|
}
|
|
|
|
// Constructor is a func type
|
|
type Constructor func() ID
|
|
|
|
// Funcs contains conversion errors for func types
|
|
func Funcs() {
|
|
type Local func(ID)
|
|
type Recursive func(Recursive)
|
|
|
|
var ctor Constructor
|
|
var local Local
|
|
var recursive Recursive
|
|
|
|
_ = Constructor(ctor) // want "unnecessary conversion"
|
|
_ = Local(local) // want "unnecessary conversion"
|
|
_ = Recursive(recursive) // want "unnecessary conversion"
|
|
|
|
_ = (*Constructor)(&ctor) // want "unnecessary conversion"
|
|
_ = (*Local)(&local) // want "unnecessary conversion"
|
|
_ = (*Recursive)(&recursive) // want "unnecessary conversion"
|
|
}
|