Commit 4eb98327 authored by Robert Griesemer's avatar Robert Griesemer

go/constant: improved fatal error messages

Fixes #17812.

Change-Id: I08202165dd3f72ae04420e7b6129b8b689e74f5c
Reviewed-on: https://go-review.googlesource.com/32870Reviewed-by: default avatarAlan Donovan <adonovan@google.com>
parent 9d139ac3
...@@ -848,6 +848,8 @@ Error: ...@@ -848,6 +848,8 @@ Error:
func ord(x Value) int { func ord(x Value) int {
switch x.(type) { switch x.(type) {
default:
return -1 // force invalid value into "x position" in match
case unknownVal: case unknownVal:
return 0 return 0
case boolVal, stringVal: case boolVal, stringVal:
...@@ -862,8 +864,6 @@ func ord(x Value) int { ...@@ -862,8 +864,6 @@ func ord(x Value) int {
return 5 return 5
case complexVal: case complexVal:
return 6 return 6
default:
panic("unreachable")
} }
} }
...@@ -880,9 +880,6 @@ func match(x, y Value) (_, _ Value) { ...@@ -880,9 +880,6 @@ func match(x, y Value) (_, _ Value) {
// ord(x) <= ord(y) // ord(x) <= ord(y)
switch x := x.(type) { switch x := x.(type) {
case unknownVal:
return x, x
case boolVal, stringVal, complexVal: case boolVal, stringVal, complexVal:
return x, y return x, y
...@@ -921,6 +918,7 @@ func match(x, y Value) (_, _ Value) { ...@@ -921,6 +918,7 @@ func match(x, y Value) (_, _ Value) {
case complexVal: case complexVal:
return vtoc(x), y return vtoc(x), y
} }
case floatVal: case floatVal:
switch y := y.(type) { switch y := y.(type) {
case floatVal: case floatVal:
...@@ -930,7 +928,7 @@ func match(x, y Value) (_, _ Value) { ...@@ -930,7 +928,7 @@ func match(x, y Value) (_, _ Value) {
} }
} }
panic("unreachable") return x, x // force unknown and invalid values into "x position" in callers of match
} }
// BinaryOp returns the result of the binary expression x op y. // BinaryOp returns the result of the binary expression x op y.
...@@ -1171,7 +1169,7 @@ func cmpZero(x int, op token.Token) bool { ...@@ -1171,7 +1169,7 @@ func cmpZero(x int, op token.Token) bool {
case token.GEQ: case token.GEQ:
return x >= 0 return x >= 0
} }
panic("unreachable") panic(fmt.Sprintf("invalid comparison %v %s 0", x, op))
} }
// Compare returns the result of the comparison x op y. // Compare returns the result of the comparison x op y.
......
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