// 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()) | |
} |