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 return nil
case variable, mapindex: case variable, mapindex:
// ok // ok
case nilvalue:
check.error(&z, "cannot assign to nil") // default would print "untyped nil"
return nil
default: default:
if sel, ok := z.expr.(*syntax.SelectorExpr); ok { if sel, ok := z.expr.(*syntax.SelectorExpr); ok {
var op operand var op operand

View File

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

View File

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

View File

@ -9,7 +9,7 @@ func _[
T1 []int, T1 []int,
T2 ~float64 | ~complex128 | chan 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 */ ) _ = T1(1 /* ERROR cannot convert 1 .* to T1 */ )
_ = T2(2 /* ERROR cannot convert 2 .* to T2 */ ) _ = 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" // "x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type"
func _[TP Interface](X TP) { func _[TP Interface](X TP) {
b = nil // ERROR cannot use untyped nil b = nil // ERROR cannot use nil
a = nil // ERROR cannot use untyped nil a = nil // ERROR cannot use nil
l = nil l = nil
s = nil // ERROR cannot use untyped nil s = nil // ERROR cannot use nil
p = nil p = nil
f = nil f = nil
i = nil i = nil
m = nil m = nil
c = nil c = nil
d = nil // ERROR cannot use untyped nil d = nil // ERROR cannot use nil
B = nil // ERROR cannot use untyped nil B = nil // ERROR cannot use nil
A = nil // ERROR cannot use untyped nil A = nil // ERROR cannot use nil
L = nil L = nil
S = nil // ERROR cannot use untyped nil S = nil // ERROR cannot use nil
P = nil P = nil
F = nil F = nil
I = nil I = nil
M = nil M = nil
C = nil C = nil
D = nil // ERROR cannot use untyped nil D = nil // ERROR cannot use nil
X = nil // ERROR cannot use untyped nil X = nil // ERROR cannot use nil
} }
// "x is an untyped constant representable by a value of type T" // "x is an untyped constant representable by a value of type T"

View File

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

View File

@ -9,5 +9,5 @@
package p package p
func f() uintptr { 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 package main
var bits1 uint = 10 var bits1 uint = 10
const bits2 uint = 10 const bits2 uint = 10
func main() { func main() {
_ = make([]byte, 1<<bits1) _ = make([]byte, 1<<bits1)
_ = make([]byte, 1<<bits2) _ = make([]byte, 1<<bits2)
_ = make([]byte, nil) // ERROR "non-integer.*len|untyped nil" _ = make([]byte, nil) // ERROR "non-integer.*len|nil"
_ = make([]byte, nil, 2) // ERROR "non-integer.*len|untyped nil" _ = make([]byte, nil, 2) // ERROR "non-integer.*len|nil"
_ = make([]byte, 1, nil) // ERROR "non-integer.*cap|untyped nil" _ = make([]byte, 1, nil) // ERROR "non-integer.*cap|nil"
_ = make([]byte, true) // ERROR "non-integer.*len|untyped bool" _ = make([]byte, true) // ERROR "non-integer.*len|untyped bool"
_ = make([]byte, "abc") // ERROR "non-integer.*len|untyped string" _ = make([]byte, "abc") // ERROR "non-integer.*len|untyped string"
} }