Skip to content

Commit d0f4875

Browse files
committed
removed broken optimization
1 parent 269de2e commit d0f4875

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

compiler/analysis/escape.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,6 @@ type escapingObjectCollector struct {
5050
func (v *escapingObjectCollector) Visit(node ast.Node) (w ast.Visitor) {
5151
if id, ok := node.(*ast.Ident); ok {
5252
if obj, ok := v.analysis.info.Uses[id].(*types.Var); ok {
53-
switch obj.Type().Underlying().(type) {
54-
case *types.Struct, *types.Array:
55-
// always by reference
56-
return nil
57-
}
58-
5953
for s := obj.Parent(); s != nil; s = s.Parent() {
6054
if s == v.analysis.topScope {
6155
v.analysis.escaping[obj] = true

tests/misc_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,23 @@ func TestLoopClosure(t *testing.T) {
226226
}
227227
}
228228

229+
func TestLoopClosureWithStruct(t *testing.T) {
230+
type T struct{ A int }
231+
ts := []T{{0}, {1}, {2}}
232+
fns := make([]func() T, 3)
233+
for i, t := range ts {
234+
t := t
235+
fns[i] = func() T {
236+
return t
237+
}
238+
}
239+
for i := range fns {
240+
if fns[i]().A != i {
241+
t.Fail()
242+
}
243+
}
244+
}
245+
229246
func TestNilInterfaceError(t *testing.T) {
230247
defer func() {
231248
if err := recover(); err == nil || !strings.Contains(err.(error).Error(), "nil pointer dereference") {

0 commit comments

Comments
 (0)