mirror of
https://github.com/golang/go
synced 2024-11-11 22:20:22 -07:00
cmd/6g: fix componentgen for funarg structs.
Fixes #4518. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/6932045
This commit is contained in:
parent
7e9d9eb17b
commit
81b46f1bcd
@ -1632,6 +1632,12 @@ componentgen(Node *nr, Node *nl)
|
||||
case TSTRUCT:
|
||||
loffset = nodl.xoffset;
|
||||
roffset = nodr.xoffset;
|
||||
// funarg structs may not begin at offset zero.
|
||||
if(nl->type->etype == TSTRUCT && nl->type->funarg && nl->type->type)
|
||||
loffset -= nl->type->type->width;
|
||||
if(nr != N && nr->type->etype == TSTRUCT && nr->type->funarg && nr->type->type)
|
||||
roffset -= nr->type->type->width;
|
||||
|
||||
for(t=nl->type->type; t; t=t->down) {
|
||||
nodl.xoffset = loffset + t->width;
|
||||
nodl.type = t->type;
|
||||
|
67
test/fixedbugs/issue4518.go
Normal file
67
test/fixedbugs/issue4518.go
Normal file
@ -0,0 +1,67 @@
|
||||
// run
|
||||
|
||||
// Copyright 2012 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Issue 4518. In some circumstances "return F(...)"
|
||||
// where F has multiple returns is miscompiled by 6g due to
|
||||
// bold assumptions in componentgen.
|
||||
|
||||
package main
|
||||
|
||||
func DontInline() {}
|
||||
|
||||
func F(e interface{}) (int, int) {
|
||||
DontInline()
|
||||
return 3, 7
|
||||
}
|
||||
|
||||
func G() (int, int) {
|
||||
DontInline()
|
||||
return 3, 7
|
||||
}
|
||||
|
||||
func bogus1(d interface{}) (int, int) {
|
||||
switch {
|
||||
default:
|
||||
return F(d)
|
||||
}
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
func bogus2() (int, int) {
|
||||
switch {
|
||||
default:
|
||||
return F(3)
|
||||
}
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
func bogus3(d interface{}) (int, int) {
|
||||
switch {
|
||||
default:
|
||||
return G()
|
||||
}
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
func bogus4() (int, int) {
|
||||
switch {
|
||||
default:
|
||||
return G()
|
||||
}
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
func check(a, b int) {
|
||||
if a != 3 || b != 7 {
|
||||
println(a, b)
|
||||
panic("a != 3 || b != 7")
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
check(bogus1(42))
|
||||
check(bogus2())
|
||||
}
|
Loading…
Reference in New Issue
Block a user