| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | // errorcheck -0 -m -l | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-10 14:32:26 -07:00
										 |  |  | // Copyright 2015 The Go Authors. All rights reserved. | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | // Use of this source code is governed by a BSD-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Test escape analysis for maps. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package escape | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var sink interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map0() { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:08:53 +03:00
										 |  |  | 	m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | 	// BAD: i should not escape | 
					
						
							|  |  |  | 	i := 0 // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	// BAD: j should not escape | 
					
						
							|  |  |  | 	j := 0     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | 	_ = m | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map1() *int { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:08:53 +03:00
										 |  |  | 	m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | 	// BAD: i should not escape | 
					
						
							|  |  |  | 	i := 0       // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0       // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j   // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | 	return m[&i] // ERROR "&i does not escape" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map2() map[*int]*int { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:08:53 +03:00
										 |  |  | 	m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) escapes to heap" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | 	i := 0                   // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0                   // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j               // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | 	return m | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map3() []*int { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:08:53 +03:00
										 |  |  | 	m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | 	i := 0                   // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	// BAD: j should not escape | 
					
						
							|  |  |  | 	j := 0     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | 	var r []*int | 
					
						
							|  |  |  | 	for k := range m { | 
					
						
							|  |  |  | 		r = append(r, k) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return r | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map4() []*int { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:08:53 +03:00
										 |  |  | 	m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | 	// BAD: i should not escape | 
					
						
							|  |  |  | 	i := 0     // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | 	var r []*int | 
					
						
							|  |  |  | 	for k, v := range m { | 
					
						
							|  |  |  | 		// We want to test exactly "for k, v := range m" rather than "for _, v := range m". | 
					
						
							|  |  |  | 		// The following if is merely to use (but not leak) k. | 
					
						
							|  |  |  | 		if k != nil { | 
					
						
							|  |  |  | 			r = append(r, v) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return r | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map5(m map[*int]*int) { // ERROR "m does not escape" | 
					
						
							|  |  |  | 	i := 0     // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map6(m map[*int]*int) { // ERROR "m does not escape" | 
					
						
							|  |  |  | 	if m != nil { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:08:53 +03:00
										 |  |  | 		m = make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	i := 0     // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map7() { | 
					
						
							|  |  |  | 	// BAD: i should not escape | 
					
						
							|  |  |  | 	i := 0 // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	// BAD: j should not escape | 
					
						
							|  |  |  | 	j := 0                     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m := map[*int]*int{&i: &j} // ERROR "&i escapes to heap" "&j escapes to heap" "literal does not escape" | 
					
						
							|  |  |  | 	_ = m | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map8() { | 
					
						
							|  |  |  | 	i := 0                     // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0                     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m := map[*int]*int{&i: &j} // ERROR "&i escapes to heap" "&j escapes to heap" "literal escapes to heap" | 
					
						
							| 
									
										
										
										
											2015-02-19 16:27:32 +03:00
										 |  |  | 	sink = m // ERROR "m escapes to heap" | 
					
						
							| 
									
										
										
										
											2015-02-19 18:14:13 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func map9() *int { | 
					
						
							|  |  |  | 	// BAD: i should not escape | 
					
						
							|  |  |  | 	i := 0                     // ERROR "moved to heap: i" | 
					
						
							|  |  |  | 	j := 0                     // ERROR "moved to heap: j" | 
					
						
							|  |  |  | 	m := map[*int]*int{&i: &j} // ERROR "&i escapes to heap" "&j escapes to heap" "literal does not escape" | 
					
						
							|  |  |  | 	return m[nil] | 
					
						
							|  |  |  | } |