Commit 3f209abb authored by Russ Cox's avatar Russ Cox

cmd/internal/gc: detect bad append(f()) during type check

Today's earlier fix can stay, but it's a band-aid over the real problem,
which is that bad code was slipping through the type checker
into the back end (and luckily causing a type error there).

I discovered this because my new append does not use the same
temporaries and failed the test as written.

Fixes #9521.

Change-Id: I7e33e2ea15743406e15c6f3fdf73e1edecda69bd
Reviewed-on: https://go-review.googlesource.com/9921Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
parent 29dc4b40
...@@ -1636,11 +1636,10 @@ OpSwitch: ...@@ -1636,11 +1636,10 @@ OpSwitch:
} }
// Unpack multiple-return result before type-checking. // Unpack multiple-return result before type-checking.
var funarg *Type
if Istype(t, TSTRUCT) && t.Funarg != 0 { if Istype(t, TSTRUCT) && t.Funarg != 0 {
t = t.Type funarg = t
if Istype(t, TFIELD) { t = t.Type.Type
t = t.Type
}
} }
n.Type = t n.Type = t
...@@ -1678,12 +1677,20 @@ OpSwitch: ...@@ -1678,12 +1677,20 @@ OpSwitch:
break OpSwitch break OpSwitch
} }
if funarg != nil {
for t := funarg.Type.Down; t != nil; t = t.Down {
if assignop(t.Type, n.Type.Type, nil) == 0 {
Yyerror("cannot append %v value to []%v", t.Type, n.Type.Type)
}
}
} else {
for args = args.Next; args != nil; args = args.Next { for args = args.Next; args != nil; args = args.Next {
if args.N.Type == nil { if args.N.Type == nil {
continue continue
} }
args.N = assignconv(args.N, t.Type, "append") args.N = assignconv(args.N, t.Type, "append")
} }
}
break OpSwitch break OpSwitch
......
...@@ -10,7 +10,9 @@ ...@@ -10,7 +10,9 @@
package main package main
func f() (_, _ []int) { return } func f() (_, _ []int) { return }
func g() (x []int, y float64) { return }
func main() { func main() {
_ = append(f()) // ERROR "cannot use _" _ = append(f()) // ERROR "cannot append \[\]int value to \[\]int"
_ = append(g()) // ERROR "cannot append float64 value to \[\]int"
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment