return true
}
-func (check *Checker) unary(x *operand, op token.Token) {
+// The unary expression e may be nil. It's passed in for better error messages only.
+func (check *Checker) unary(x *operand, e *ast.UnaryExpr, op token.Token) {
switch op {
case token.AND:
// spec: "As an exception to the addressability
// Typed constants must be representable in
// their type after each constant operation.
if isTyped(typ) {
+ if e != nil {
+ x.expr = e // for better error message
+ }
check.representable(x, typ)
}
return
token.LOR: isBoolean,
}
-func (check *Checker) binary(x *operand, lhs, rhs ast.Expr, op token.Token) {
+// The binary expression e may be nil. It's passed in for better error messages only.
+func (check *Checker) binary(x *operand, e *ast.BinaryExpr, lhs, rhs ast.Expr, op token.Token) {
var y operand
check.expr(x, lhs)
// Typed constants must be representable in
// their type after each constant operation.
if isTyped(typ) {
+ if e != nil {
+ x.expr = e // for better error message
+ }
check.representable(x, typ)
}
return
if x.mode == invalid {
goto Error
}
- check.unary(x, e.Op)
+ check.unary(x, e, e.Op)
if x.mode == invalid {
goto Error
}
}
case *ast.BinaryExpr:
- check.binary(x, e.X, e.Y, e.Op)
+ check.binary(x, e, e.X, e.Y, e.Op)
if x.mode == invalid {
goto Error
}
}
var x operand
Y := &ast.BasicLit{ValuePos: s.X.Pos(), Kind: token.INT, Value: "1"} // use x's position
- check.binary(&x, s.X, Y, op)
+ check.binary(&x, nil, s.X, Y, op)
if x.mode == invalid {
return
}
return
}
var x operand
- check.binary(&x, s.Lhs[0], s.Rhs[0], op)
+ check.binary(&x, nil, s.Lhs[0], s.Rhs[0], op)
if x.mode == invalid {
return
}
b12 = <-b0 /* ERROR "cannot receive" */
b13 = & & /* ERROR "cannot take address" */ b0
+ // byte
+ _ = byte(0)
+ _ = byte(- /* ERROR "cannot convert" */ 1)
+ _ = - /* ERROR "-byte\(1\) \(constant -1 of type byte\) overflows byte" */ byte(1) // test for issue 11367
+ _ = byte /* ERROR "overflows byte" */ (0) - byte(1)
+
// int
i0 = 1
i1 int = i0