go/test/fixedbugs/issue7997.go
Russ Cox 1357f548b0 cmd/gc: fix two select temporary bugs
The introduction of temporaries in order.c was not
quite right for two corner cases:

1) The rewrite that pushed new variables on the lhs of
a receive into the body of the case was dropping the
declaration of the variables. If the variables escape,
the declaration is what allocates them.
Caught by escape analysis sanity check.
In fact the declarations should move into the body
always, so that we only allocate if the corresponding
case is selected. Do that. (This is an optimization that
was already present in Go 1.2. The new order code just
made it stop working.)

Fixes #7997.

2) The optimization to turn a single-recv select into
an ordinary receive assumed it could take the address
of the destination; not so if the destination is _.

Fixes #7998.

LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/100480043
2014-05-15 19:16:18 -04:00

54 lines
733 B
Go

// compile
// Copyright 2014 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.
// /tmp/x.go:3: internal error: f &p (type *int) recorded as live on entry
package p
func f(ch chan int) *int {
select {
case p1x := <-ch:
return &p1x
default:
// ok
}
select {
case p1 := <-ch:
return &p1
default:
// ok
}
select {
case p2 := <-ch:
return &p2
case p3 := <-ch:
return &p3
default:
// ok
}
select {
case p4, ok := <-ch:
if ok {
return &p4
}
default:
// ok
}
select {
case p5, ok := <-ch:
if ok {
return &p5
}
case p6, ok := <-ch:
if !ok {
return &p6
}
default:
// ok
}
return nil
}