Commit 81b46f1b authored by Rémy Oudompheng's avatar Rémy Oudompheng

cmd/6g: fix componentgen for funarg structs.

Fixes #4518.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6932045
parent 7e9d9eb1
...@@ -1632,6 +1632,12 @@ componentgen(Node *nr, Node *nl) ...@@ -1632,6 +1632,12 @@ componentgen(Node *nr, Node *nl)
case TSTRUCT: case TSTRUCT:
loffset = nodl.xoffset; loffset = nodl.xoffset;
roffset = nodr.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) { for(t=nl->type->type; t; t=t->down) {
nodl.xoffset = loffset + t->width; nodl.xoffset = loffset + t->width;
nodl.type = t->type; nodl.type = t->type;
......
// 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())
}
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