Source file
test/escape2n.go
1
2
3
4
5
6
7
8
9
10
11
12 package foo
13
14 import (
15 "fmt"
16 "unsafe"
17 )
18
19 var gxx *int
20
21 func foo1(x int) {
22 gxx = &x
23 }
24
25 func foo2(yy *int) {
26 gxx = yy
27 }
28
29 func foo3(x int) *int {
30 return &x
31 }
32
33 type T *T
34
35 func foo3b(t T) {
36 *t = t
37 }
38
39
40 func foo4(xx, yy *int) {
41 xx = yy
42 }
43
44
45 func foo5(xx **int, yy *int) {
46 xx = &yy
47 }
48
49 func foo6(xx **int, yy *int) {
50 *xx = yy
51 }
52
53 func foo7(xx **int, yy *int) {
54 **xx = *yy
55 }
56
57 func foo8(xx, yy *int) int {
58 xx = yy
59 return *xx
60 }
61
62 func foo9(xx, yy *int) *int {
63 xx = yy
64 return xx
65 }
66
67 func foo10(xx, yy *int) {
68 *xx = *yy
69 }
70
71 func foo11() int {
72 x, y := 0, 42
73 xx := &x
74 yy := &y
75 *xx = *yy
76 return x
77 }
78
79 var xxx **int
80
81 func foo12(yyy **int) {
82 xxx = yyy
83 }
84
85
86
87 func foo13(yyy **int) {
88 *xxx = *yyy
89 }
90
91 func foo14(yyy **int) {
92 **xxx = **yyy
93 }
94
95 func foo15(yy *int) {
96 xxx = &yy
97 }
98
99 func foo16(yy *int) {
100 *xxx = yy
101 }
102
103 func foo17(yy *int) {
104 **xxx = *yy
105 }
106
107 func foo18(y int) {
108 *xxx = &y
109 }
110
111 func foo19(y int) {
112 **xxx = y
113 }
114
115 type Bar struct {
116 i int
117 ii *int
118 }
119
120 func NewBar() *Bar {
121 return &Bar{42, nil}
122 }
123
124 func NewBarp(x *int) *Bar {
125 return &Bar{42, x}
126 }
127
128 func NewBarp2(x *int) *Bar {
129 return &Bar{*x, nil}
130 }
131
132 func (b *Bar) NoLeak() int {
133 return *(b.ii)
134 }
135
136 func (b *Bar) Leak() *int {
137 return &b.i
138 }
139
140 func (b *Bar) AlsoNoLeak() *int {
141 return b.ii
142 }
143
144 func (b Bar) AlsoLeak() *int {
145 return b.ii
146 }
147
148 func (b Bar) LeaksToo() *int {
149 v := 0
150 b.ii = &v
151 return b.ii
152 }
153
154 func (b *Bar) LeaksABit() *int {
155 v := 0
156 b.ii = &v
157 return b.ii
158 }
159
160 func (b Bar) StillNoLeak() int {
161 v := 0
162 b.ii = &v
163 return b.i
164 }
165
166 func goLeak(b *Bar) {
167 go b.NoLeak()
168 }
169
170 type Bar2 struct {
171 i [12]int
172 ii []int
173 }
174
175 func NewBar2() *Bar2 {
176 return &Bar2{[12]int{42}, nil}
177 }
178
179 func (b *Bar2) NoLeak() int {
180 return b.i[0]
181 }
182
183 func (b *Bar2) Leak() []int {
184 return b.i[:]
185 }
186
187 func (b *Bar2) AlsoNoLeak() []int {
188 return b.ii[0:1]
189 }
190
191 func (b Bar2) AgainNoLeak() [12]int {
192 return b.i
193 }
194
195 func (b *Bar2) LeakSelf() {
196 b.ii = b.i[0:4]
197 }
198
199 func (b *Bar2) LeakSelf2() {
200 var buf []int
201 buf = b.i[0:]
202 b.ii = buf
203 }
204
205 func foo21() func() int {
206 x := 42
207 return func() int {
208 return x
209 }
210 }
211
212 func foo21a() func() int {
213 x := 42
214 return func() int {
215 x++
216 return x
217 }
218 }
219
220 func foo22() int {
221 x := 42
222 return func() int {
223 return x
224 }()
225 }
226
227 func foo23(x int) func() int {
228 return func() int {
229 return x
230 }
231 }
232
233 func foo23a(x int) func() int {
234 f := func() int {
235 return x
236 }
237 return f
238 }
239
240 func foo23b(x int) *(func() int) {
241 f := func() int { return x }
242 return &f
243 }
244
245 func foo23c(x int) func() int {
246 return func() int {
247 x++
248 return x
249 }
250 }
251
252 func foo24(x int) int {
253 return func() int {
254 return x
255 }()
256 }
257
258 var x *int
259
260 func fooleak(xx *int) int {
261 x = xx
262 return *x
263 }
264
265 func foonoleak(xx *int) int {
266 return *x + *xx
267 }
268
269 func foo31(x int) int {
270 return fooleak(&x)
271 }
272
273 func foo32(x int) int {
274 return foonoleak(&x)
275 }
276
277 type Foo struct {
278 xx *int
279 x int
280 }
281
282 var F Foo
283 var pf *Foo
284
285 func (f *Foo) fooleak() {
286 pf = f
287 }
288
289 func (f *Foo) foonoleak() {
290 F.x = f.x
291 }
292
293 func (f *Foo) Leak() {
294 f.fooleak()
295 }
296
297 func (f *Foo) NoLeak() {
298 f.foonoleak()
299 }
300
301 func foo41(x int) {
302 F.xx = &x
303 }
304
305 func (f *Foo) foo42(x int) {
306 f.xx = &x
307 }
308
309 func foo43(f *Foo, x int) {
310 f.xx = &x
311 }
312
313 func foo44(yy *int) {
314 F.xx = yy
315 }
316
317 func (f *Foo) foo45() {
318 F.x = f.x
319 }
320
321
322 func (f *Foo) foo46() {
323 F.xx = f.xx
324 }
325
326 func (f *Foo) foo47() {
327 f.xx = &f.x
328 }
329
330 var ptrSlice []*int
331
332 func foo50(i *int) {
333 ptrSlice[0] = i
334 }
335
336 var ptrMap map[*int]*int
337
338 func foo51(i *int) {
339 ptrMap[i] = i
340 }
341
342 func indaddr1(x int) *int {
343 return &x
344 }
345
346 func indaddr2(x *int) *int {
347 return *&x
348 }
349
350 func indaddr3(x *int32) *int {
351 return *(**int)(unsafe.Pointer(&x))
352 }
353
354
355
356 func Float32bits(f float32) uint32 {
357 return *(*uint32)(unsafe.Pointer(&f))
358 }
359
360 func Float32frombits(b uint32) float32 {
361 return *(*float32)(unsafe.Pointer(&b))
362 }
363
364 func Float64bits(f float64) uint64 {
365 return *(*uint64)(unsafe.Pointer(&f))
366 }
367
368 func Float64frombits(b uint64) float64 {
369 return *(*float64)(unsafe.Pointer(&b))
370 }
371
372
373 func float64bitsptr(f float64) *uint64 {
374 return (*uint64)(unsafe.Pointer(&f))
375 }
376
377 func float64ptrbitsptr(f *float64) *uint64 {
378 return (*uint64)(unsafe.Pointer(f))
379 }
380
381 func typesw(i interface{}) *int {
382 switch val := i.(type) {
383 case *int:
384 return val
385 case *int8:
386 v := int(*val)
387 return &v
388 }
389 return nil
390 }
391
392 func exprsw(i *int) *int {
393 switch j := i; *j + 110 {
394 case 12:
395 return j
396 case 42:
397 return nil
398 }
399 return nil
400
401 }
402
403
404 func foo60(i *int) *int {
405 var a [12]*int
406 a[0] = i
407 return a[1]
408 }
409
410 func foo60a(i *int) *int {
411 var a [12]*int
412 a[0] = i
413 return nil
414 }
415
416
417 func foo61(i *int) *int {
418 type S struct {
419 a, b *int
420 }
421 var s S
422 s.a = i
423 return s.b
424 }
425
426 func foo61a(i *int) *int {
427 type S struct {
428 a, b *int
429 }
430 var s S
431 s.a = i
432 return nil
433 }
434
435
436
437
438 func foo62(i *int) *int {
439 type S struct {
440 a, b *int
441 }
442 s := new(S)
443 s.a = i
444 return nil
445 }
446
447 type M interface {
448 M()
449 }
450
451 func foo63(m M) {
452 }
453
454 func foo64(m M) {
455 m.M()
456 }
457
458 func foo64b(m M) {
459 defer m.M()
460 }
461
462 type MV int
463
464 func (MV) M() {}
465
466 func foo65() {
467 var mv MV
468 foo63(&mv)
469 }
470
471 func foo66() {
472 var mv MV
473 foo64(&mv)
474 }
475
476 func foo67() {
477 var mv MV
478 foo63(mv)
479 }
480
481 func foo68() {
482 var mv MV
483
484 foo64(mv)
485 }
486
487 func foo69(m M) {
488 foo64(m)
489 }
490
491 func foo70(mv1 *MV, m M) {
492 m = mv1
493 foo64(m)
494 }
495
496 func foo71(x *int) []*int {
497 var y []*int
498 y = append(y, x)
499 return y
500 }
501
502 func foo71a(x int) []*int {
503 var y []*int
504 y = append(y, &x)
505 return y
506 }
507
508 func foo72() {
509 var x int
510 var y [1]*int
511 y[0] = &x
512 }
513
514 func foo72aa() [10]*int {
515 var x int
516 var y [10]*int
517 y[0] = &x
518 return y
519 }
520
521 func foo72a() {
522 var y [10]*int
523 for i := 0; i < 10; i++ {
524
525 x := i
526 y[i] = &x
527 }
528 return
529 }
530
531 func foo72b() [10]*int {
532 var y [10]*int
533 for i := 0; i < 10; i++ {
534 x := i
535 y[i] = &x
536 }
537 return y
538 }
539
540
541 func foo73() {
542 s := []int{3, 2, 1}
543 for _, v := range s {
544 vv := v
545
546 defer func() {
547 println(vv)
548 }()
549 }
550 }
551
552 func foo731() {
553 s := []int{3, 2, 1}
554 for _, v := range s {
555 vv := v
556
557 defer func() {
558 vv = 42
559 println(vv)
560 }()
561 }
562 }
563
564 func foo74() {
565 s := []int{3, 2, 1}
566 for _, v := range s {
567 vv := v
568
569 fn := func() {
570 println(vv)
571 }
572 defer fn()
573 }
574 }
575
576 func foo74a() {
577 s := []int{3, 2, 1}
578 for _, v := range s {
579 vv := v
580
581 fn := func() {
582 vv += 1
583 println(vv)
584 }
585 defer fn()
586 }
587 }
588
589
590 func foo74b() {
591 var array [3]func()
592 s := []int{3, 2, 1}
593 for i, v := range s {
594 vv := v
595
596 array[i] = func() {
597 println(vv)
598 }
599 }
600 }
601
602 func foo74c() {
603 var array [3]func()
604 s := []int{3, 2, 1}
605 for i, v := range s {
606 vv := v
607
608 array[i] = func() {
609 println(&vv)
610 }
611 }
612 }
613
614 func myprint(y *int, x ...interface{}) *int {
615 return y
616 }
617
618 func myprint1(y *int, x ...interface{}) *interface{} {
619 return &x[0]
620 }
621
622 func foo75(z *int) {
623 myprint(z, 1, 2, 3)
624 }
625
626 func foo75a(z *int) {
627 myprint1(z, 1, 2, 3)
628 }
629
630 func foo75esc(z *int) {
631 gxx = myprint(z, 1, 2, 3)
632 }
633
634 func foo75aesc(z *int) {
635 var ppi **interface{}
636 *ppi = myprint1(z, 1, 2, 3)
637 }
638
639 func foo75aesc1(z *int) {
640 sink = myprint1(z, 1, 2, 3)
641 }
642
643 func foo76(z *int) {
644 myprint(nil, z)
645 }
646
647 func foo76a(z *int) {
648 myprint1(nil, z)
649 }
650
651 func foo76b() {
652 myprint(nil, 1, 2, 3)
653 }
654
655 func foo76c() {
656 myprint1(nil, 1, 2, 3)
657 }
658
659 func foo76d() {
660 defer myprint(nil, 1, 2, 3)
661 }
662
663 func foo76e() {
664 defer myprint1(nil, 1, 2, 3)
665 }
666
667 func foo76f() {
668 for {
669
670 defer myprint(nil, 1, 2, 3)
671 }
672 }
673
674 func foo76g() {
675 for {
676 defer myprint1(nil, 1, 2, 3)
677 }
678 }
679
680 func foo77(z []interface{}) {
681 myprint(nil, z...)
682 }
683
684 func foo77a(z []interface{}) {
685 myprint1(nil, z...)
686 }
687
688 func foo77b(z []interface{}) {
689 var ppi **interface{}
690 *ppi = myprint1(nil, z...)
691 }
692
693 func foo77c(z []interface{}) {
694 sink = myprint1(nil, z...)
695 }
696
697 func dotdotdot() {
698 i := 0
699 myprint(nil, &i)
700
701 j := 0
702 myprint1(nil, &j)
703 }
704
705 func foo78(z int) *int {
706 return &z
707 }
708
709 func foo78a(z int) *int {
710 y := &z
711 x := &y
712 return *x
713 }
714
715 func foo79() *int {
716 return new(int)
717 }
718
719 func foo80() *int {
720 var z *int
721 for {
722
723 z = new(int)
724 }
725 _ = z
726 return nil
727 }
728
729 func foo81() *int {
730 for {
731 z := new(int)
732 _ = z
733 }
734 return nil
735 }
736
737 func tee(p *int) (x, y *int) { return p, p }
738
739 func noop(x, y *int) {}
740
741 func foo82() {
742 var x, y, z int
743 go noop(tee(&z))
744 go noop(&x, &y)
745 for {
746 var u, v, w int
747 defer noop(tee(&u))
748 defer noop(&v, &w)
749 }
750 }
751
752 type Fooer interface {
753 Foo()
754 }
755
756 type LimitedFooer struct {
757 Fooer
758 N int64
759 }
760
761 func LimitFooer(r Fooer, n int64) Fooer {
762 return &LimitedFooer{r, n}
763 }
764
765 func foo90(x *int) map[*int]*int {
766 return map[*int]*int{nil: x}
767 }
768
769 func foo91(x *int) map[*int]*int {
770 return map[*int]*int{x: nil}
771 }
772
773 func foo92(x *int) [2]*int {
774 return [2]*int{x, nil}
775 }
776
777
778 func foo93(c chan *int) *int {
779 for v := range c {
780 return v
781 }
782 return nil
783 }
784
785
786 func foo94(m map[*int]*int, b bool) *int {
787 for k, v := range m {
788 if b {
789 return k
790 }
791 return v
792 }
793 return nil
794 }
795
796
797 func foo95(m map[*int]*int, x *int) {
798 m[x] = x
799 }
800
801
802 func foo96(m []*int) *int {
803 return m[0]
804 }
805
806
807 func foo97(m [1]*int) *int {
808 return m[0]
809 }
810
811
812 func foo98(m map[int]*int) *int {
813 return m[0]
814 }
815
816
817 func foo99(m *[1]*int) []*int {
818 return m[:]
819 }
820
821
822 func foo100(m []*int) *int {
823 for _, v := range m {
824 return v
825 }
826 return nil
827 }
828
829
830 func foo101(m [1]*int) *int {
831 for _, v := range m {
832 return v
833 }
834 return nil
835 }
836
837
838 func foo101a(m [1]*int) *int {
839 for i := range m {
840 return &i
841 }
842 return nil
843 }
844
845
846 func foo102(m []*int, x *int) {
847 m[0] = x
848 }
849
850
851 func foo103(m [1]*int, x *int) {
852 m[0] = x
853 }
854
855 var y []*int
856
857
858 func foo104(x []*int) {
859 copy(y, x)
860 }
861
862
863 func foo105(x []*int) {
864 _ = append(y, x...)
865 }
866
867
868 func foo106(x *int) {
869 _ = append(y, x)
870 }
871
872 func foo107(x *int) map[*int]*int {
873 return map[*int]*int{x: nil}
874 }
875
876 func foo108(x *int) map[*int]*int {
877 return map[*int]*int{nil: x}
878 }
879
880 func foo109(x *int) *int {
881 m := map[*int]*int{x: nil}
882 for k, _ := range m {
883 return k
884 }
885 return nil
886 }
887
888 func foo110(x *int) *int {
889 m := map[*int]*int{nil: x}
890 return m[nil]
891 }
892
893 func foo111(x *int) *int {
894 m := []*int{x}
895 return m[0]
896 }
897
898 func foo112(x *int) *int {
899 m := [1]*int{x}
900 return m[0]
901 }
902
903 func foo113(x *int) *int {
904 m := Bar{ii: x}
905 return m.ii
906 }
907
908 func foo114(x *int) *int {
909 m := &Bar{ii: x}
910 return m.ii
911 }
912
913 func foo115(x *int) *int {
914 return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1))
915 }
916
917 func foo116(b bool) *int {
918 if b {
919 x := 1
920 return &x
921 } else {
922 y := 1
923 return &y
924 }
925 return nil
926 }
927
928 func foo117(unknown func(interface{})) {
929 x := 1
930 unknown(&x)
931 }
932
933 func foo118(unknown func(*int)) {
934 x := 1
935 unknown(&x)
936 }
937
938 func external(*int)
939
940 func foo119(x *int) {
941 external(x)
942 }
943
944 func foo120() {
945
946 L1:
947 L2:
948 L3:
949 L4:
950 L5:
951 L6:
952 L7:
953 L8:
954 L9:
955 L10:
956 L11:
957 L12:
958 L13:
959 L14:
960 L15:
961 L16:
962 L17:
963 L18:
964 L19:
965 L20:
966 L21:
967 L22:
968 L23:
969 L24:
970 L25:
971 L26:
972 L27:
973 L28:
974 L29:
975 L30:
976 L31:
977 L32:
978 L33:
979 L34:
980 L35:
981 L36:
982 L37:
983 L38:
984 L39:
985 L40:
986 L41:
987 L42:
988 L43:
989 L44:
990 L45:
991 L46:
992 L47:
993 L48:
994 L49:
995 L50:
996 L51:
997 L52:
998 L53:
999 L54:
1000 L55:
1001 L56:
1002 L57:
1003 L58:
1004 L59:
1005 L60:
1006 L61:
1007 L62:
1008 L63:
1009 L64:
1010 L65:
1011 L66:
1012 L67:
1013 L68:
1014 L69:
1015 L70:
1016 L71:
1017 L72:
1018 L73:
1019 L74:
1020 L75:
1021 L76:
1022 L77:
1023 L78:
1024 L79:
1025 L80:
1026 L81:
1027 L82:
1028 L83:
1029 L84:
1030 L85:
1031 L86:
1032 L87:
1033 L88:
1034 L89:
1035 L90:
1036 L91:
1037 L92:
1038 L93:
1039 L94:
1040 L95:
1041 L96:
1042 L97:
1043 L98:
1044 L99:
1045 L100:
1046
1047 goto L1
1048 goto L2
1049 goto L3
1050 goto L4
1051 goto L5
1052 goto L6
1053 goto L7
1054 goto L8
1055 goto L9
1056 goto L10
1057 goto L11
1058 goto L12
1059 goto L13
1060 goto L14
1061 goto L15
1062 goto L16
1063 goto L17
1064 goto L18
1065 goto L19
1066 goto L20
1067 goto L21
1068 goto L22
1069 goto L23
1070 goto L24
1071 goto L25
1072 goto L26
1073 goto L27
1074 goto L28
1075 goto L29
1076 goto L30
1077 goto L31
1078 goto L32
1079 goto L33
1080 goto L34
1081 goto L35
1082 goto L36
1083 goto L37
1084 goto L38
1085 goto L39
1086 goto L40
1087 goto L41
1088 goto L42
1089 goto L43
1090 goto L44
1091 goto L45
1092 goto L46
1093 goto L47
1094 goto L48
1095 goto L49
1096 goto L50
1097 goto L51
1098 goto L52
1099 goto L53
1100 goto L54
1101 goto L55
1102 goto L56
1103 goto L57
1104 goto L58
1105 goto L59
1106 goto L60
1107 goto L61
1108 goto L62
1109 goto L63
1110 goto L64
1111 goto L65
1112 goto L66
1113 goto L67
1114 goto L68
1115 goto L69
1116 goto L70
1117 goto L71
1118 goto L72
1119 goto L73
1120 goto L74
1121 goto L75
1122 goto L76
1123 goto L77
1124 goto L78
1125 goto L79
1126 goto L80
1127 goto L81
1128 goto L82
1129 goto L83
1130 goto L84
1131 goto L85
1132 goto L86
1133 goto L87
1134 goto L88
1135 goto L89
1136 goto L90
1137 goto L91
1138 goto L92
1139 goto L93
1140 goto L94
1141 goto L95
1142 goto L96
1143 goto L97
1144 goto L98
1145 goto L99
1146 goto L100
1147 }
1148
1149 func foo121() {
1150 for i := 0; i < 10; i++ {
1151 defer myprint(nil, i)
1152 go myprint(nil, i)
1153 }
1154 }
1155
1156
1157 func foo121b() {
1158 for i := 0; i < 10; i++ {
1159 defer fmt.Printf("%d", i)
1160 go fmt.Printf("%d", i)
1161 }
1162 }
1163
1164
1165 func foo122() {
1166 var i *int
1167
1168 goto L1
1169 L1:
1170 i = new(int)
1171 _ = i
1172 }
1173
1174
1175 func foo123() {
1176 var i *int
1177
1178 L1:
1179 i = new(int)
1180
1181 goto L1
1182 _ = i
1183 }
1184
1185 func foo124(x **int) {
1186 var i int
1187 p := &i
1188 func() {
1189 *x = p
1190 }()
1191 }
1192
1193 func foo125(ch chan *int) {
1194 var i int
1195 p := &i
1196 func() {
1197 ch <- p
1198 }()
1199 }
1200
1201 func foo126() {
1202 var px *int
1203 for {
1204
1205 var i int
1206 func() {
1207 px = &i
1208 }()
1209 }
1210 _ = px
1211 }
1212
1213 var px *int
1214
1215 func foo127() {
1216 var i int
1217 p := &i
1218 q := p
1219 px = q
1220 }
1221
1222 func foo128() {
1223 var i int
1224 p := &i
1225 q := p
1226 _ = q
1227 }
1228
1229 func foo129() {
1230 var i int
1231 p := &i
1232 func() {
1233 q := p
1234 func() {
1235 r := q
1236 px = r
1237 }()
1238 }()
1239 }
1240
1241 func foo130() {
1242 for {
1243 var i int
1244 func() {
1245 px = &i
1246 }()
1247 }
1248 }
1249
1250 func foo131() {
1251 var i int
1252 func() {
1253 px = &i
1254 }()
1255 }
1256
1257 func foo132() {
1258 var i int
1259 go func() {
1260 px = &i
1261 }()
1262 }
1263
1264 func foo133() {
1265 var i int
1266 defer func() {
1267 px = &i
1268 }()
1269 }
1270
1271 func foo134() {
1272 var i int
1273 p := &i
1274 func() {
1275 q := p
1276 func() {
1277 r := q
1278 _ = r
1279 }()
1280 }()
1281 }
1282
1283 func foo135() {
1284 var i int
1285 p := &i
1286 go func() {
1287 q := p
1288 func() {
1289 r := q
1290 _ = r
1291 }()
1292 }()
1293 }
1294
1295 func foo136() {
1296 var i int
1297 p := &i
1298 go func() {
1299 q := p
1300 func() {
1301 r := q
1302 px = r
1303 }()
1304 }()
1305 }
1306
1307 func foo137() {
1308 var i int
1309 p := &i
1310 func() {
1311 q := p
1312 go func() {
1313 r := q
1314 _ = r
1315 }()
1316 }()
1317 }
1318
1319 func foo138() *byte {
1320 type T struct {
1321 x [1]byte
1322 }
1323 t := new(T)
1324 return &t.x[0]
1325 }
1326
1327 func foo139() *byte {
1328 type T struct {
1329 x struct {
1330 y byte
1331 }
1332 }
1333 t := new(T)
1334 return &t.x.y
1335 }
1336
1337
1338 func foo140() interface{} {
1339 type T struct {
1340 X string
1341 }
1342 type U struct {
1343 X string
1344 T *T
1345 }
1346 t := &T{}
1347 return U{
1348 X: t.X,
1349 T: t,
1350 }
1351 }
1352
1353
1354
1355 func F1([]byte)
1356
1357 func F2([]byte)
1358
1359
1360
1361 func F3(x []byte)
1362
1363 func F4(x []byte)
1364
1365 func G() {
1366 var buf1 [10]byte
1367 F1(buf1[:])
1368
1369 var buf2 [10]byte
1370 F2(buf2[:])
1371
1372 var buf3 [10]byte
1373 F3(buf3[:])
1374
1375 var buf4 [10]byte
1376 F4(buf4[:])
1377 }
1378
1379 type Tm struct {
1380 x int
1381 }
1382
1383 func (t *Tm) M() {
1384 }
1385
1386 func foo141() {
1387 var f func()
1388
1389 t := new(Tm)
1390 f = t.M
1391 _ = f
1392 }
1393
1394 var gf func()
1395
1396 func foo142() {
1397 t := new(Tm)
1398 gf = t.M
1399 }
1400
1401
1402 func foo143() {
1403 for i := 0; i < 1000; i++ {
1404 func() {
1405 for i := 0; i < 1; i++ {
1406 var t Tm
1407 t.M()
1408 }
1409 }()
1410 }
1411 }
1412
1413
1414
1415
1416
1417
1418
1419 func foo144a(*int)
1420
1421 func foo144() {
1422 var x int
1423 foo144a(&x)
1424 var y int
1425 foo144b(&y)
1426 }
1427
1428
1429
1430 func foo144b(*int)
1431
1432
1433
1434 type List struct {
1435 Next *List
1436 }
1437
1438 func foo145(l List) {
1439 var p *List
1440 for p = &l; p.Next != nil; p = p.Next {
1441 }
1442 }
1443
1444 func foo146(l List) {
1445 var p *List
1446 p = &l
1447 for ; p.Next != nil; p = p.Next {
1448 }
1449 }
1450
1451 func foo147(l List) {
1452 var p *List
1453 p = &l
1454 for p.Next != nil {
1455 p = p.Next
1456 }
1457 }
1458
1459 func foo148(l List) {
1460 for p := &l; p.Next != nil; p = p.Next {
1461 }
1462 }
1463
1464
1465
1466 func foo149(l List) {
1467 var p *List
1468 for {
1469 for p = &l; p.Next != nil; p = p.Next {
1470 }
1471 }
1472 }
1473
1474
1475
1476 var save150 []byte
1477
1478 func foo150(x ...byte) {
1479 save150 = x
1480 }
1481
1482 func bar150() {
1483 foo150(1, 2, 3)
1484 }
1485
1486
1487
1488 var save151 *int
1489
1490 func foo151(x *int) {
1491 save151 = x
1492 }
1493
1494 func bar151() {
1495 var a [64]int
1496 a[4] = 101
1497 foo151(&(&a)[4:8][0])
1498 }
1499
1500 func bar151b() {
1501 var a [10]int
1502 b := a[:]
1503 foo151(&b[4:8][0])
1504 }
1505
1506 func bar151c() {
1507 var a [64]int
1508 a[4] = 101
1509 foo151(&(&a)[4:8:8][0])
1510 }
1511
1512 func bar151d() {
1513 var a [10]int
1514 b := a[:]
1515 foo151(&b[4:8:8][0])
1516 }
1517
1518
1519
1520 type U struct {
1521 s *string
1522 }
1523
1524 func (u *U) String() *string {
1525 return u.s
1526 }
1527
1528 type V struct {
1529 s *string
1530 }
1531
1532 func NewV(u U) *V {
1533 return &V{u.String()}
1534 }
1535
1536 func foo152() {
1537 a := "a"
1538 u := U{&a}
1539 v := NewV(u)
1540 println(v)
1541 }
1542
1543
1544
1545 func foo153(v interface{}) *int {
1546 switch x := v.(type) {
1547 case int:
1548 return &x
1549 }
1550 panic(0)
1551 }
1552
1553
1554
1555 func f() (x int, y *int) {
1556 y = &x
1557 return
1558 }
1559
1560 func g() (x interface{}) {
1561 x = &x
1562 return
1563 }
1564
1565 var sink interface{}
1566
1567 type Lit struct {
1568 p *int
1569 }
1570
1571 func ptrlitNoescape() {
1572
1573 i := 0
1574 x := &Lit{&i}
1575 _ = x
1576 }
1577
1578 func ptrlitNoEscape2() {
1579
1580 i := 0
1581 x := &Lit{&i}
1582 sink = *x
1583 }
1584
1585 func ptrlitEscape() {
1586
1587 i := 0
1588 x := &Lit{&i}
1589 sink = x
1590 }
1591
1592
1593
1594 type Buffer struct {
1595 arr [64]byte
1596 arrPtr *[64]byte
1597 buf1 []byte
1598 buf2 []byte
1599 str1 string
1600 str2 string
1601 }
1602
1603 func (b *Buffer) foo() {
1604 b.buf1 = b.buf1[1:2]
1605 b.buf1 = b.buf1[1:2:3]
1606 b.buf1 = b.buf2[1:2]
1607 b.buf1 = b.buf2[1:2:3]
1608 }
1609
1610 func (b *Buffer) bar() {
1611 b.buf1 = b.arr[1:2]
1612 }
1613
1614 func (b *Buffer) arrayPtr() {
1615 b.buf1 = b.arrPtr[1:2]
1616 b.buf1 = b.arrPtr[1:2:3]
1617 }
1618
1619 func (b *Buffer) baz() {
1620 b.str1 = b.str1[1:2]
1621 b.str1 = b.str2[1:2]
1622 }
1623
1624 func (b *Buffer) bat() {
1625 o := new(Buffer)
1626 o.buf1 = b.buf1[1:2]
1627 sink = o
1628 }
1629
1630 func quux(sp *string, bp *[]byte) {
1631 *sp = (*sp)[1:2]
1632 *bp = (*bp)[1:2]
1633 }
1634
1635 type StructWithString struct {
1636 p *int
1637 s string
1638 }
1639
1640
1641
1642
1643 func fieldFlowTracking() {
1644 var x StructWithString
1645 i := 0
1646 x.p = &i
1647 sink = x.s
1648 }
1649
1650
1651
1652 func slicebytetostring0() {
1653 b := make([]byte, 20)
1654 s := string(b)
1655 _ = s
1656 }
1657
1658 func slicebytetostring1() {
1659 b := make([]byte, 20)
1660 s := string(b)
1661 s1 := s[0:1]
1662 _ = s1
1663 }
1664
1665 func slicebytetostring2() {
1666 b := make([]byte, 20)
1667 s := string(b)
1668 s1 := s[0:1]
1669 sink = &s1
1670 }
1671
1672 func slicebytetostring3() {
1673 b := make([]byte, 20)
1674 s := string(b)
1675 s1 := s[0:1]
1676 sink = s1
1677 }
1678
1679 func addstr0() {
1680 s0 := "a"
1681 s1 := "b"
1682 s := s0 + s1
1683 _ = s
1684 }
1685
1686 func addstr1() {
1687 s0 := "a"
1688 s1 := "b"
1689 s := "c"
1690 s += s0 + s1
1691 _ = s
1692 }
1693
1694 func addstr2() {
1695 b := make([]byte, 20)
1696 s0 := "a"
1697 s := string(b) + s0
1698 _ = s
1699 }
1700
1701 func addstr3() {
1702 s0 := "a"
1703 s1 := "b"
1704 s := s0 + s1
1705 s2 := s[0:1]
1706 sink = s2
1707 }
1708
1709 func intstring0() bool {
1710
1711 x := '0'
1712 s := string(x)
1713 return s == "0"
1714 }
1715
1716 func intstring1() string {
1717
1718 x := '0'
1719 s := string(x)
1720 return s
1721 }
1722
1723 func intstring2() {
1724
1725 x := '0'
1726 s := string(x)
1727 sink = &s
1728 }
1729
1730 func stringtoslicebyte0() {
1731 s := "foo"
1732 x := []byte(s)
1733 _ = x
1734 }
1735
1736 func stringtoslicebyte1() []byte {
1737 s := "foo"
1738 return []byte(s)
1739 }
1740
1741 func stringtoslicebyte2() {
1742 s := "foo"
1743 sink = []byte(s)
1744 }
1745
1746 func stringtoslicerune0() {
1747 s := "foo"
1748 x := []rune(s)
1749 _ = x
1750 }
1751
1752 func stringtoslicerune1() []rune {
1753 s := "foo"
1754 return []rune(s)
1755 }
1756
1757 func stringtoslicerune2() {
1758 s := "foo"
1759 sink = []rune(s)
1760 }
1761
1762 func slicerunetostring0() {
1763 r := []rune{1, 2, 3}
1764 s := string(r)
1765 _ = s
1766 }
1767
1768 func slicerunetostring1() string {
1769 r := []rune{1, 2, 3}
1770 return string(r)
1771 }
1772
1773 func slicerunetostring2() {
1774 r := []rune{1, 2, 3}
1775 sink = string(r)
1776 }
1777
1778 func makemap0() {
1779 m := make(map[int]int)
1780 m[0] = 0
1781 m[1]++
1782 delete(m, 1)
1783 sink = m[0]
1784 }
1785
1786 func makemap1() map[int]int {
1787 return make(map[int]int)
1788 }
1789
1790 func makemap2() {
1791 m := make(map[int]int)
1792 sink = m
1793 }
1794
1795 func nonescapingEface(m map[interface{}]bool) bool {
1796 return m["foo"]
1797 }
1798
1799 func nonescapingIface(m map[M]bool) bool {
1800 return m[MV(0)]
1801 }
1802
1803 func issue10353() {
1804 x := new(int)
1805 issue10353a(x)()
1806 }
1807
1808 func issue10353a(x *int) func() {
1809 return func() {
1810 println(*x)
1811 }
1812 }
1813
1814 func issue10353b() {
1815 var f func()
1816 for {
1817 x := new(int)
1818 f = func() {
1819 println(*x)
1820 }
1821 }
1822 _ = f
1823 }
1824
1825 func issue11387(x int) func() int {
1826 f := func() int { return x }
1827 slice1 := []func() int{f}
1828 slice2 := make([]func() int, 1)
1829 copy(slice2, slice1)
1830 return slice2[0]
1831 }
1832
1833 func issue12397(x, y int) {
1834
1835 if false {
1836 gxx = &x
1837 } else {
1838 gxx = &y
1839 }
1840
1841 if true {
1842 gxx = &y
1843 } else {
1844 gxx = &x
1845 }
1846 }
1847
View as plain text