mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
cmd/compile: don't emit conversion error in non-numeric increment/decrement
In increment and decrement statements, explicit check that the type of operand is numeric earlier. This avoids a related but less clear error about converting "1" to be emitted. So, when compiling package main func main() { var x bool x++ } instead of emitting two errors prog.go:5: cannot convert 1 to type bool prog.go:5: invalid operation: x++ (non-numeric type bool) just emits the second error. Fixes #12525. Change-Id: I6e81330703765bef0d6eb6c57098c1336af7c799 Reviewed-on: https://go-review.googlesource.com/20245 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
ed8116989d
commit
c97ddf9c10
|
@ -521,6 +521,11 @@ OpSwitch:
|
|||
n.Type = nil
|
||||
return
|
||||
}
|
||||
if n.Implicit && !okforarith[l.Type.Etype] {
|
||||
Yyerror("invalid operation: %v (non-numeric type %v)", n, l.Type)
|
||||
n.Type = nil
|
||||
return
|
||||
}
|
||||
// TODO(marvin): Fix Node.EType type union.
|
||||
op = Op(n.Etype)
|
||||
} else {
|
||||
|
@ -632,12 +637,6 @@ OpSwitch:
|
|||
|
||||
if t.Etype != TIDEAL && !Eqtype(l.Type, r.Type) {
|
||||
defaultlit2(&l, &r, true)
|
||||
if n.Op == OASOP && n.Implicit {
|
||||
Yyerror("invalid operation: %v (non-numeric type %v)", n, l.Type)
|
||||
n.Type = nil
|
||||
return
|
||||
}
|
||||
|
||||
if Isinter(r.Type) == Isinter(l.Type) || aop == 0 {
|
||||
Yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type)
|
||||
n.Type = nil
|
||||
|
|
26
test/fixedbugs/issue12525.go
Normal file
26
test/fixedbugs/issue12525.go
Normal file
|
@ -0,0 +1,26 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2016 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.
|
||||
|
||||
// Issue 12525: confusing error trying to increment boolean value
|
||||
|
||||
package main
|
||||
|
||||
func main() {
|
||||
var i int
|
||||
i++
|
||||
|
||||
var f float64
|
||||
f++
|
||||
|
||||
var c complex128
|
||||
c++
|
||||
|
||||
var b bool
|
||||
b++ // ERROR "invalid operation: b\+\+ \(non-numeric type bool\)"
|
||||
|
||||
var s string
|
||||
s-- // ERROR "invalid operation: s-- \(non-numeric type string\)"
|
||||
}
|
Loading…
Reference in a new issue