Commit 24c6dd98 authored by LE Manh Cuong's avatar LE Manh Cuong Committed by Matthew Dempsky

cmd/compile: fix internal error on complex comparison

Complex type is the only TIDEAL that lack of support for all comparison
operators. When rewriting constant comparison into literal node, that
missing cause compiler raise an internal error.

Checking the operator is available for complex type before that fix the
problem.

We can make this check works more generally if there's more type lack of
supporting all comparison operators added, but it does not seem to be
happened, so just check explicitly for complex only.

Fixes #32723

Change-Id: I4938b1bdcbcdae9a9d87436024984bd2ab12995e
Reviewed-on: https://go-review.googlesource.com/c/go/+/183459
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
parent b136267b
......@@ -763,6 +763,13 @@ func typecheck1(n *Node, top int) (res *Node) {
t = l.Type
if iscmp[n.Op] {
// TIDEAL includes complex constant, but only OEQ and ONE are defined for complex,
// so check that the n.op is available for complex here before doing evconst.
if !okfor[n.Op][TCOMPLEX128] && (Isconst(l, CTCPLX) || Isconst(r, CTCPLX)) {
yyerror("invalid operation: %v (operator %v not defined on untyped complex)", n, n.Op)
n.Type = nil
return n
}
evconst(n)
t = types.Idealbool
if n.Op != OLITERAL {
......
// errorcheck
// Copyright 2019 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.
// Complex literal comparison
package p
const x = 1i
const y = 1i < 2i // ERROR "invalid operation: .*not defined on untyped complex"
const z = x < 2i // ERROR "invalid operation: .*not defined on untyped complex"
func f() {
_ = 1i < 2i // ERROR "invalid operation: .*not defined on untyped complex"
_ = 1i < 2 // ERROR "invalid operation: .*not defined on untyped complex"
_ = 1 < 2i // ERROR "invalid operation: .*not defined on untyped complex"
c := 1i
_ = c < 2i // ERROR "invalid operation: .*not defined on complex128"
}
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