Skip to content

Commit

Permalink
cmd/compile/internal/types2: print "nil" rather than "untyped nil"
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
griesemer committed Nov 22, 2021
1 parent 9678f79 commit 83bfed9
Show file tree
Hide file tree
Showing 8 changed files with 25 additions and 28 deletions.
3 changes: 0 additions & 3 deletions src/cmd/compile/internal/types2/assignments.go
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/types2/operand.go
Expand Up @@ -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))
}
Expand Down
6 changes: 3 additions & 3 deletions src/cmd/compile/internal/types2/testdata/check/stmt0.src
Expand Up @@ -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
Expand Down
Expand Up @@ -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 */ )
}
Expand Down
18 changes: 9 additions & 9 deletions src/cmd/compile/internal/types2/testdata/spec/assignability.go2
Expand Up @@ -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"
Expand Down
9 changes: 4 additions & 5 deletions test/fixedbugs/issue6004.go
Expand Up @@ -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"
}

2 changes: 1 addition & 1 deletion test/fixedbugs/issue6402.go
Expand Up @@ -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"
}
11 changes: 6 additions & 5 deletions test/fixedbugs/issue7223.go
Expand Up @@ -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"
}

0 comments on commit 83bfed9

Please sign in to comment.