mirror of
https://github.com/golang/go
synced 2025-05-15 04:52:14 +00:00
.github
api
doc
lib
misc
src
test
abi
alias3.dir
arenas
asmhdr.dir
chan
closure3.dir
closure5.dir
codegen
ddd2.dir
dwarf
fixedbugs
import2.dir
import4.dir
interface
intrinsic.dir
ken
linkname.dir
method4.dir
retjmp.dir
runtime
stress
syntax
typeparam
uintptrescapes.dir
235.go
64bit.go
README.md
alg.go
alias.go
alias1.go
alias2.go
alias3.go
align.go
append.go
append1.go
args.go
armimm.go
asmhdr.go
assign.go
assign1.go
atomicload.go
bigalg.go
bigmap.go
blank.go
blank1.go
bom.go
bombad.go
bounds.go
cannotassign.go
chancap.go
chanlinear.go
char_lit.go
char_lit1.go
checkbce.go
clear.go
clearfat.go
closedchan.go
closure.go
closure1.go
closure2.go
closure3.go
closure4.go
closure5.go
closure6.go
closure7.go
cmp.go
cmp6.go
cmplx.go
cmplxdivide.c
cmplxdivide.go
cmplxdivide1.go
complit.go
complit1.go
compos.go
const.go
const1.go
const2.go
const3.go
const4.go
const5.go
const6.go
const7.go
const8.go
convT2X.go
convert.go
convert1.go
convert2.go
convert3.go
convert4.go
convinline.go
convlit.go
convlit1.go
copy.go
copy1.go
crlf.go
ddd.go
ddd1.go
ddd2.go
decl.go
declbad.go
defer.go
defererrcheck.go
deferfin.go
defernil.go
deferprint.go
deferprint.out
devirt.go
directive.go
directive2.go
divide.go
divmod.go
embedfunc.go
embedvers.go
empty.go
env.go
eof.go
eof1.go
escape.go
escape2.go
escape2n.go
escape3.go
escape4.go
escape5.go
escape_array.go
escape_calls.go
escape_closure.go
escape_field.go
escape_goto.go
escape_hash_maphash.go
escape_iface.go
escape_indir.go
escape_level.go
escape_map.go
escape_mutations.go
escape_param.go
escape_reflect.go
escape_runtime_atomic.go
escape_selfassign.go
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.go
escape_sync_atomic.go
escape_unsafe.go
fibo.go
finprofiled.go
float_lit.go
float_lit2.go
float_lit3.go
floatcmp.go
for.go
func.go
func1.go
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
funcdup.go
funcdup2.go
fuse.go
gc.go
gc1.go
gc2.go
gcgort.go
gcstring.go
goprint.go
goprint.out
goto.go
heapsampling.go
helloworld.go
helloworld.out
if.go
import.go
import1.go
import2.go
import4.go
import5.go
import6.go
index.go
index0.go
index1.go
index2.go
indirect.go
indirect1.go
init.go
init1.go
initcomma.go
initexp.go
initialize.go
initializerr.go
initloop.go
inline.go
inline_big.go
inline_caller.go
inline_callers.go
inline_endian.go
inline_literal.go
inline_math_bits_rotate.go
inline_sync.go
inline_variadic.go
int_lit.go
intcvt.go
intrinsic.go
intrinsic_atomic.go
iota.go
label.go
label1.go
linkmain.go
linkmain_run.go
linkname.go
linkname3.go
linkobj.go
linkx.go
linkx_run.go
literal.go
literal2.go
live.go
live1.go
live2.go
live_regabi.go
live_uintptrkeepalive.go
loopbce.go
mainsig.go
makechan.go
makemap.go
makenew.go
makeslice.go
mallocfin.go
map.go
map1.go
mapclear.go
maplinear.go
maymorestack.go
mergemul.go
method.go
method1.go
method2.go
method3.go
method4.go
method5.go
method6.go
method7.go
named.go
named1.go
newinline.go
nil.go
nilcheck.go
nilptr.go
nilptr2.go
nilptr3.go
nilptr4.go
nilptr5.go
nilptr5_aix.go
nilptr5_wasm.go
nilptr_aix.go
noinit.go
nosplit.go
nowritebarrier.go
nul1.go
opt_branchlikely.go
parentype.go
peano.go
phiopt.go
print.go
print.out
printbig.go
printbig.out
prove.go
prove_constant_folding.go
prove_invert_loop_with_unused_iterators.go
range.go
range2.go
range3.go
range4.go
rangegen.go
recover.go
recover1.go
recover2.go
recover3.go
recover4.go
recover5.go
reflectmethod1.go
reflectmethod2.go
reflectmethod3.go
reflectmethod4.go
reflectmethod5.go
reflectmethod6.go
reflectmethod7.go
reflectmethod8.go
rename.go
rename1.go
reorder.go
reorder2.go
retjmp.go
return.go
rotate.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
rune.go
runtime.go
shift1.go
shift2.go
shift3.go
sieve.go
sigchld.go
sigchld.out
simassign.go
sizeof.go
slice3.go
slice3err.go
slicecap.go
sliceopt.go
solitaire.go
stack.go
stackobj.go
stackobj2.go
stackobj3.go
strcopy.go
strength.go
string_lit.go
stringrange.go
struct0.go
switch.go
switch2.go
switch3.go
switch4.go
switch5.go
switch6.go
switch7.go
tighten.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go
typeswitch.go
typeswitch1.go
typeswitch2.go
typeswitch2b.go
typeswitch3.go
uintptrescapes.go
uintptrescapes2.go
uintptrescapes3.go
uintptrkeepalive.go
undef.go
unsafe_slice_data.go
unsafe_string.go
unsafe_string_data.go
unsafebuiltins.go
used.go
utf.go
varerr.go
varinit.go
winbatch.go
writebarrier.go
zerodivide.go
zerosize.go
.gitattributes
.gitignore
CONTRIBUTING.md
LICENSE
PATENTS
README.md
SECURITY.md
VERSION
codereview.cfg
go.env
Based on https://golang.org/cl/284256 for go/types. Brings this code more in line with go/types. Adjusted various tests to match new error messages which generally are now better: for assignment errors, instead of a generic "cannot convert" we now say "cannot use" followed by a clearer reason as to why not. Major differences to go/types with respect to the changed files: - Some of the new code now returns error codes, but they are only used internally for now, and not reported with errors. - go/types does not "convert" untyped nil values to target types, but here we do. This is unchanged from how types2 handled this before this CL. Change-Id: If45336d7ee679ece100f6d9d9f291a6ea55004d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/302757 Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
75 lines
2.4 KiB
Go
75 lines
2.4 KiB
Go
// errorcheck
|
|
|
|
// 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.
|
|
|
|
// Verify that illegal assignments with both explicit and implicit conversions of literals are detected.
|
|
// Does not compile.
|
|
|
|
package main
|
|
|
|
import "unsafe"
|
|
|
|
// explicit conversion of constants
|
|
var x1 = string(1)
|
|
var x2 string = string(1)
|
|
var x3 = int(1.5) // ERROR "convert|truncate"
|
|
var x4 int = int(1.5) // ERROR "convert|truncate"
|
|
var x5 = "a" + string(1)
|
|
var x6 = int(1e100) // ERROR "overflow|cannot convert"
|
|
var x7 = float32(1e1000) // ERROR "overflow|cannot convert"
|
|
|
|
// unsafe.Pointer can only convert to/from uintptr
|
|
var _ = string(unsafe.Pointer(uintptr(65))) // ERROR "convert|conversion"
|
|
var _ = float64(unsafe.Pointer(uintptr(65))) // ERROR "convert|conversion"
|
|
var _ = int(unsafe.Pointer(uintptr(65))) // ERROR "convert|conversion"
|
|
|
|
// implicit conversions merit scrutiny
|
|
var s string
|
|
var bad1 string = 1 // ERROR "conver|incompatible|invalid|cannot"
|
|
var bad2 = s + 1 // ERROR "conver|incompatible|invalid|cannot"
|
|
var bad3 = s + 'a' // ERROR "conver|incompatible|invalid|cannot"
|
|
var bad4 = "a" + 1 // ERROR "literals|incompatible|convert|invalid"
|
|
var bad5 = "a" + 'a' // ERROR "literals|incompatible|convert|invalid"
|
|
|
|
var bad6 int = 1.5 // ERROR "convert|truncate"
|
|
var bad7 int = 1e100 // ERROR "overflow|truncated to int|truncated"
|
|
var bad8 float32 = 1e200 // ERROR "overflow"
|
|
|
|
// but these implicit conversions are okay
|
|
var good1 string = "a"
|
|
var good2 int = 1.0
|
|
var good3 int = 1e9
|
|
var good4 float64 = 1e20
|
|
|
|
// explicit conversion of string is okay
|
|
var _ = []rune("abc")
|
|
var _ = []byte("abc")
|
|
|
|
// implicit is not
|
|
var _ []int = "abc" // ERROR "cannot use|incompatible|invalid|cannot convert"
|
|
var _ []byte = "abc" // ERROR "cannot use|incompatible|invalid|cannot convert"
|
|
|
|
// named string is okay
|
|
type Tstring string
|
|
|
|
var ss Tstring = "abc"
|
|
var _ = []rune(ss)
|
|
var _ = []byte(ss)
|
|
|
|
// implicit is still not
|
|
var _ []rune = ss // ERROR "cannot use|incompatible|invalid"
|
|
var _ []byte = ss // ERROR "cannot use|incompatible|invalid"
|
|
|
|
// named slice is now ok
|
|
type Trune []rune
|
|
type Tbyte []byte
|
|
|
|
var _ = Trune("abc") // ok
|
|
var _ = Tbyte("abc") // ok
|
|
|
|
// implicit is still not
|
|
var _ Trune = "abc" // ERROR "cannot use|incompatible|invalid|cannot convert"
|
|
var _ Tbyte = "abc" // ERROR "cannot use|incompatible|invalid|cannot convert"
|