Commit c97ddf9c authored by Caio Marcelo de Oliveira Filho's avatar Caio Marcelo de Oliveira Filho Committed by Matthew Dempsky

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/20245Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent ed811698
...@@ -521,6 +521,11 @@ OpSwitch: ...@@ -521,6 +521,11 @@ OpSwitch:
n.Type = nil n.Type = nil
return 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. // TODO(marvin): Fix Node.EType type union.
op = Op(n.Etype) op = Op(n.Etype)
} else { } else {
...@@ -632,12 +637,6 @@ OpSwitch: ...@@ -632,12 +637,6 @@ OpSwitch:
if t.Etype != TIDEAL && !Eqtype(l.Type, r.Type) { if t.Etype != TIDEAL && !Eqtype(l.Type, r.Type) {
defaultlit2(&l, &r, true) 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 { if Isinter(r.Type) == Isinter(l.Type) || aop == 0 {
Yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type) Yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type)
n.Type = nil n.Type = nil
......
// 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\)"
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment