From 455c29af83524a484ac407a35f4c69ff710d7acb Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 20 Jan 2021 17:03:36 -0800 Subject: [PATCH] [dev.typeparams] cmd/compile/internal/types2: convert untyped arguments to delete For the predeclared "delete" function, types2 was checking that the second argument was assignable to the map's key type, but not actually updating the Types map as appropriate. So this could leave untyped constants in the AST. The error "cannot convert" is somewhat less precise than the previous "not assignable" error, but it's consistent with how types2 reports other erroneous assignments of untyped constants. Change-Id: Ic3ca3a3611ad0e4646c050e93088cdf992234e5f Reviewed-on: https://go-review.googlesource.com/c/go/+/285059 Trust: Matthew Dempsky Trust: Robert Griesemer Run-TryBot: Matthew Dempsky Reviewed-by: Robert Griesemer TryBot-Result: Go Bot --- src/cmd/compile/internal/types2/builtins.go | 4 ++-- src/cmd/compile/internal/types2/testdata/builtins.src | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/types2/builtins.go b/src/cmd/compile/internal/types2/builtins.go index 43da6a1529..bd1ea0fdc1 100644 --- a/src/cmd/compile/internal/types2/builtins.go +++ b/src/cmd/compile/internal/types2/builtins.go @@ -368,8 +368,8 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( return } - if !x.assignableTo(check, m.key, nil) { - check.invalidArgf(x, "%s is not assignable to %s", x, m.key) + check.assignment(x, m.key, "argument to delete") + if x.mode == invalid { return } diff --git a/src/cmd/compile/internal/types2/testdata/builtins.src b/src/cmd/compile/internal/types2/testdata/builtins.src index 69cc48798e..e473bd1df2 100644 --- a/src/cmd/compile/internal/types2/testdata/builtins.src +++ b/src/cmd/compile/internal/types2/testdata/builtins.src @@ -283,7 +283,7 @@ func delete1() { delete() // ERROR not enough arguments delete(1) // ERROR not enough arguments delete(1, 2, 3) // ERROR too many arguments - delete(m, 0 /* ERROR not assignable */) + delete(m, 0 /* ERROR cannot convert */) delete(m, s) _ = delete /* ERROR used as value */ (m, s) -- 2.48.1