1
0
mirror of https://github.com/golang/go synced 2024-09-23 17:20:13 -06:00

cmd/compile/internal/types2: print "nil" rather than "untyped nil"

When we have a typed nil, we already say so; thus it is sufficient
to use "nil" in all the other cases.

This is closer to (1.17) compiler behavior. In cases where the
1.17 compiler prints "untyped nil" (e.g., wrong uses of "copy"),
we already print a different message. We can do better in those
cases as well; will be addressed in a separate CL (see #49735).

Fixes #48852.

Change-Id: I9a7a72e0f99185b00f80040c5510a693b1ea80f6
Reviewed-on: https://go-review.googlesource.com/c/go/+/366276
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2021-11-22 13:53:21 -08:00
parent 9678f79414
commit 83bfed916b
8 changed files with 25 additions and 28 deletions

View File

@ -220,9 +220,6 @@ func (check *Checker) assignVar(lhs syntax.Expr, x *operand) Type {
return nil
case variable, mapindex:
// ok
case nilvalue:
check.error(&z, "cannot assign to nil") // default would print "untyped nil"
return nil
default:
if sel, ok := z.expr.(*syntax.SelectorExpr); ok {
var op operand

View File

@ -116,7 +116,7 @@ func operandString(x *operand, qf Qualifier) string {
case nil, Typ[Invalid]:
return "nil (with invalid type)"
case Typ[UntypedNil]:
return "untyped nil"
return "nil"
default:
return fmt.Sprintf("nil (of type %s)", TypeString(x.typ, qf))
}

View File

@ -69,10 +69,10 @@ func assignments1() {
// test cases for issue 5800
var (
_ int = nil /* ERROR "untyped nil" */
_ [10]int = nil /* ERROR "untyped nil" */
_ int = nil /* ERROR "nil" */
_ [10]int = nil /* ERROR "nil" */
_ []byte = nil
_ struct{} = nil /* ERROR "untyped nil" */
_ struct{} = nil /* ERROR "nil" */
_ func() = nil
_ map[int]string = nil
_ chan int = nil

View File

@ -9,7 +9,7 @@ func _[
T1 []int,
T2 ~float64 | ~complex128 | chan int,
]() {
_ = T0(nil /* ERROR cannot convert untyped nil to T0 */ )
_ = T0(nil /* ERROR cannot convert nil to T0 */ )
_ = T1(1 /* ERROR cannot convert 1 .* to T1 */ )
_ = T2(2 /* ERROR cannot convert 2 .* to T2 */ )
}

View File

@ -153,28 +153,28 @@ func _[
// "x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type"
func _[TP Interface](X TP) {
b = nil // ERROR cannot use untyped nil
a = nil // ERROR cannot use untyped nil
b = nil // ERROR cannot use nil
a = nil // ERROR cannot use nil
l = nil
s = nil // ERROR cannot use untyped nil
s = nil // ERROR cannot use nil
p = nil
f = nil
i = nil
m = nil
c = nil
d = nil // ERROR cannot use untyped nil
d = nil // ERROR cannot use nil
B = nil // ERROR cannot use untyped nil
A = nil // ERROR cannot use untyped nil
B = nil // ERROR cannot use nil
A = nil // ERROR cannot use nil
L = nil
S = nil // ERROR cannot use untyped nil
S = nil // ERROR cannot use nil
P = nil
F = nil
I = nil
M = nil
C = nil
D = nil // ERROR cannot use untyped nil
X = nil // ERROR cannot use untyped nil
D = nil // ERROR cannot use nil
X = nil // ERROR cannot use nil
}
// "x is an untyped constant representable by a value of type T"

View File

@ -7,9 +7,8 @@
package main
func main() {
_ = nil // ERROR "use of untyped nil"
_, _ = nil, 1 // ERROR "use of untyped nil"
_, _ = 1, nil // ERROR "use of untyped nil"
_ = append(nil, 1, 2, 3) // ERROR "untyped nil"
_ = nil // ERROR "use of untyped nil"
_, _ = nil, 1 // ERROR "use of untyped nil"
_, _ = 1, nil // ERROR "use of untyped nil"
_ = append(nil, 1, 2, 3) // ERROR "untyped nil|nil"
}

View File

@ -9,5 +9,5 @@
package p
func f() uintptr {
return nil // ERROR "cannot use nil as type uintptr in return argument|incompatible type|cannot use untyped nil"
return nil // ERROR "cannot use nil as type uintptr in return argument|incompatible type|cannot use nil"
}

View File

@ -7,14 +7,15 @@
package main
var bits1 uint = 10
const bits2 uint = 10
func main() {
_ = make([]byte, 1<<bits1)
_ = make([]byte, 1<<bits2)
_ = make([]byte, nil) // ERROR "non-integer.*len|untyped nil"
_ = make([]byte, nil, 2) // ERROR "non-integer.*len|untyped nil"
_ = make([]byte, 1, nil) // ERROR "non-integer.*cap|untyped nil"
_ = make([]byte, true) // ERROR "non-integer.*len|untyped bool"
_ = make([]byte, "abc") // ERROR "non-integer.*len|untyped string"
_ = make([]byte, nil) // ERROR "non-integer.*len|nil"
_ = make([]byte, nil, 2) // ERROR "non-integer.*len|nil"
_ = make([]byte, 1, nil) // ERROR "non-integer.*cap|nil"
_ = make([]byte, true) // ERROR "non-integer.*len|untyped bool"
_ = make([]byte, "abc") // ERROR "non-integer.*len|untyped string"
}