1// run
2
3// Copyright 2018 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test independent goroutines modifying a comprehensive
8// variety of vars during aggressive garbage collection.
9
10// The point is to catch GC regressions like fixedbugs/issue22781.go
11
12package main
13
14import (
15	"errors"
16	"runtime"
17	"runtime/debug"
18	"sync"
19)
20
21const (
22	goroutines = 8
23	allocs     = 8
24	mods       = 8
25
26	length = 9
27)
28
29func main() {
30	debug.SetGCPercent(1)
31	var wg sync.WaitGroup
32	for i := 0; i < goroutines; i++ {
33		for _, t := range types {
34			err := t.valid()
35			if err != nil {
36				panic(err)
37			}
38			wg.Add(1)
39			go func(f modifier) {
40				var wg2 sync.WaitGroup
41				for j := 0; j < allocs; j++ {
42					wg2.Add(1)
43					go func() {
44						f.t()
45						wg2.Done()
46					}()
47					wg2.Add(1)
48					go func() {
49						f.pointerT()
50						wg2.Done()
51					}()
52					wg2.Add(1)
53					go func() {
54						f.arrayT()
55						wg2.Done()
56					}()
57					wg2.Add(1)
58					go func() {
59						f.sliceT()
60						wg2.Done()
61					}()
62					wg2.Add(1)
63					go func() {
64						f.mapT()
65						wg2.Done()
66					}()
67					wg2.Add(1)
68					go func() {
69						f.mapPointerKeyT()
70						wg2.Done()
71					}()
72					wg2.Add(1)
73					go func() {
74						f.chanT()
75						wg2.Done()
76					}()
77					wg2.Add(1)
78					go func() {
79						f.interfaceT()
80						wg2.Done()
81					}()
82				}
83				wg2.Wait()
84				wg.Done()
85			}(t)
86		}
87	}
88	wg.Wait()
89}
90
91type modifier struct {
92	name           string
93	t              func()
94	pointerT       func()
95	arrayT         func()
96	sliceT         func()
97	mapT           func()
98	mapPointerKeyT func()
99	chanT          func()
100	interfaceT     func()
101}
102
103func (a modifier) valid() error {
104	switch {
105	case a.name == "":
106		return errors.New("modifier without name")
107	case a.t == nil:
108		return errors.New(a.name + " missing t")
109	case a.pointerT == nil:
110		return errors.New(a.name + " missing pointerT")
111	case a.arrayT == nil:
112		return errors.New(a.name + " missing arrayT")
113	case a.sliceT == nil:
114		return errors.New(a.name + " missing sliceT")
115	case a.mapT == nil:
116		return errors.New(a.name + " missing mapT")
117	case a.mapPointerKeyT == nil:
118		return errors.New(a.name + " missing mapPointerKeyT")
119	case a.chanT == nil:
120		return errors.New(a.name + " missing chanT")
121	case a.interfaceT == nil:
122		return errors.New(a.name + " missing interfaceT")
123	default:
124		return nil
125	}
126}
127
128var types = []modifier{
129	modifier{
130		name: "bool",
131		t: func() {
132			var a bool
133			for i := 0; i < mods; i++ {
134				a = !a
135				runtime.Gosched()
136			}
137		},
138		pointerT: func() {
139			a := func() *bool { return new(bool) }()
140			for i := 0; i < mods; i++ {
141				*a = !*a
142				runtime.Gosched()
143			}
144		},
145		arrayT: func() {
146			a := [length]bool{}
147			for i := 0; i < mods; i++ {
148				for j := 0; j < len(a); j++ {
149					a[j] = !a[j]
150					runtime.Gosched()
151				}
152			}
153		},
154		sliceT: func() {
155			a := make([]bool, length)
156			for i := 0; i < mods; i++ {
157				for j := 0; j < len(a); j++ {
158					a[j] = !a[j]
159					runtime.Gosched()
160				}
161			}
162		},
163		mapT: func() {
164			a := make(map[bool]bool)
165			for i := 0; i < mods; i++ {
166				a[false] = !a[false]
167				a[true] = !a[true]
168				runtime.Gosched()
169			}
170		},
171		mapPointerKeyT: func() {
172			a := make(map[*bool]bool)
173			for i := 0; i < length; i++ {
174				a[new(bool)] = false
175				runtime.Gosched()
176			}
177			for i := 0; i < mods; i++ {
178				for k, v := range a {
179					a[k] = !v
180					runtime.Gosched()
181				}
182			}
183		},
184		chanT: func() {
185			a := make(chan bool)
186			for i := 0; i < mods; i++ {
187				go func() { a <- false }()
188				<-a
189				runtime.Gosched()
190			}
191		},
192		interfaceT: func() {
193			a := interface{}(bool(false))
194			for i := 0; i < mods; i++ {
195				a = !a.(bool)
196				runtime.Gosched()
197			}
198		},
199	},
200	modifier{
201		name: "uint8",
202		t: func() {
203			var u uint8
204			for i := 0; i < mods; i++ {
205				u++
206				runtime.Gosched()
207			}
208		},
209		pointerT: func() {
210			a := func() *uint8 { return new(uint8) }()
211			for i := 0; i < mods; i++ {
212				*a++
213				runtime.Gosched()
214			}
215		},
216		arrayT: func() {
217			a := [length]uint8{}
218			for i := 0; i < mods; i++ {
219				for j := 0; j < len(a); j++ {
220					a[j]++
221					runtime.Gosched()
222				}
223			}
224		},
225		sliceT: func() {
226			a := make([]uint8, length)
227			for i := 0; i < mods; i++ {
228				for j := 0; j < len(a); j++ {
229					a[j]++
230					runtime.Gosched()
231				}
232			}
233		},
234		mapT: func() {
235			a := make(map[uint8]uint8)
236			for i := 0; i < length; i++ {
237				a[uint8(i)] = uint8(i)
238				runtime.Gosched()
239			}
240			for i := 0; i < mods; i++ {
241				for k, _ := range a {
242					a[k]++
243				}
244				runtime.Gosched()
245			}
246		},
247		mapPointerKeyT: func() {
248			a := make(map[*uint8]uint8)
249			for i := 0; i < length; i++ {
250				a[new(uint8)] = uint8(i)
251				runtime.Gosched()
252			}
253			for i := 0; i < mods; i++ {
254				for k, _ := range a {
255					a[k]++
256					runtime.Gosched()
257				}
258			}
259		},
260		chanT: func() {
261			a := make(chan uint8)
262			for i := 0; i < mods; i++ {
263				go func() { a <- uint8(i) }()
264				<-a
265				runtime.Gosched()
266			}
267		},
268		interfaceT: func() {
269			a := interface{}(uint8(0))
270			for i := 0; i < mods; i++ {
271				a = a.(uint8) + 1
272				runtime.Gosched()
273			}
274		},
275	},
276	modifier{
277		name: "uint16",
278		t: func() {
279			var u uint16
280			for i := 0; i < mods; i++ {
281				u++
282				runtime.Gosched()
283			}
284		},
285		pointerT: func() {
286			a := func() *uint16 { return new(uint16) }()
287			for i := 0; i < mods; i++ {
288				*a++
289				runtime.Gosched()
290			}
291		},
292		arrayT: func() {
293			a := [length]uint16{}
294			for i := 0; i < mods; i++ {
295				for j := 0; j < len(a); j++ {
296					a[j]++
297					runtime.Gosched()
298				}
299			}
300		},
301		sliceT: func() {
302			a := make([]uint16, length)
303			for i := 0; i < mods; i++ {
304				for j := 0; j < len(a); j++ {
305					a[j]++
306					runtime.Gosched()
307				}
308			}
309		},
310		mapT: func() {
311			a := make(map[uint16]uint16)
312			for i := 0; i < length; i++ {
313				a[uint16(i)] = uint16(i)
314				runtime.Gosched()
315			}
316			for i := 0; i < mods; i++ {
317				for k, _ := range a {
318					a[k]++
319				}
320				runtime.Gosched()
321			}
322		},
323		mapPointerKeyT: func() {
324			a := make(map[*uint16]uint16)
325			for i := 0; i < length; i++ {
326				a[new(uint16)] = uint16(i)
327				runtime.Gosched()
328			}
329			for i := 0; i < mods; i++ {
330				for k, _ := range a {
331					a[k]++
332					runtime.Gosched()
333				}
334			}
335		},
336		chanT: func() {
337			a := make(chan uint16)
338			for i := 0; i < mods; i++ {
339				go func() { a <- uint16(i) }()
340				<-a
341				runtime.Gosched()
342			}
343		},
344		interfaceT: func() {
345			a := interface{}(uint16(0))
346			for i := 0; i < mods; i++ {
347				a = a.(uint16) + 1
348				runtime.Gosched()
349			}
350		},
351	},
352	modifier{
353		name: "uint32",
354		t: func() {
355			var u uint32
356			for i := 0; i < mods; i++ {
357				u++
358				runtime.Gosched()
359			}
360		},
361		pointerT: func() {
362			a := func() *uint32 { return new(uint32) }()
363			for i := 0; i < mods; i++ {
364				*a++
365				runtime.Gosched()
366			}
367		},
368		arrayT: func() {
369			a := [length]uint32{}
370			for i := 0; i < mods; i++ {
371				for j := 0; j < len(a); j++ {
372					a[j]++
373					runtime.Gosched()
374				}
375			}
376		},
377		sliceT: func() {
378			a := make([]uint32, length)
379			for i := 0; i < mods; i++ {
380				for j := 0; j < len(a); j++ {
381					a[j]++
382					runtime.Gosched()
383				}
384			}
385		},
386		mapT: func() {
387			a := make(map[uint32]uint32)
388			for i := 0; i < length; i++ {
389				a[uint32(i)] = uint32(i)
390				runtime.Gosched()
391			}
392			for i := 0; i < mods; i++ {
393				for k, _ := range a {
394					a[k]++
395				}
396				runtime.Gosched()
397			}
398		},
399		mapPointerKeyT: func() {
400			a := make(map[*uint32]uint32)
401			for i := 0; i < length; i++ {
402				a[new(uint32)] = uint32(i)
403				runtime.Gosched()
404			}
405			for i := 0; i < mods; i++ {
406				for k, _ := range a {
407					a[k]++
408					runtime.Gosched()
409				}
410			}
411		},
412		chanT: func() {
413			a := make(chan uint32)
414			for i := 0; i < mods; i++ {
415				go func() { a <- uint32(i) }()
416				<-a
417				runtime.Gosched()
418			}
419		},
420		interfaceT: func() {
421			a := interface{}(uint32(0))
422			for i := 0; i < mods; i++ {
423				a = a.(uint32) + 1
424				runtime.Gosched()
425			}
426		},
427	},
428	modifier{
429		name: "uint64",
430		t: func() {
431			var u uint64
432			for i := 0; i < mods; i++ {
433				u++
434				runtime.Gosched()
435			}
436		},
437		pointerT: func() {
438			a := func() *uint64 { return new(uint64) }()
439			for i := 0; i < mods; i++ {
440				*a++
441				runtime.Gosched()
442			}
443		},
444		arrayT: func() {
445			a := [length]uint64{}
446			for i := 0; i < mods; i++ {
447				for j := 0; j < len(a); j++ {
448					a[j]++
449					runtime.Gosched()
450				}
451			}
452		},
453		sliceT: func() {
454			a := make([]uint64, length)
455			for i := 0; i < mods; i++ {
456				for j := 0; j < len(a); j++ {
457					a[j]++
458					runtime.Gosched()
459				}
460			}
461		},
462		mapT: func() {
463			a := make(map[uint64]uint64)
464			for i := 0; i < length; i++ {
465				a[uint64(i)] = uint64(i)
466				runtime.Gosched()
467			}
468			for i := 0; i < mods; i++ {
469				for k, _ := range a {
470					a[k]++
471				}
472				runtime.Gosched()
473			}
474		},
475		mapPointerKeyT: func() {
476			a := make(map[*uint64]uint64)
477			for i := 0; i < length; i++ {
478				a[new(uint64)] = uint64(i)
479				runtime.Gosched()
480			}
481			for i := 0; i < mods; i++ {
482				for k, _ := range a {
483					a[k]++
484					runtime.Gosched()
485				}
486			}
487		},
488		chanT: func() {
489			a := make(chan uint64)
490			for i := 0; i < mods; i++ {
491				go func() { a <- uint64(i) }()
492				<-a
493				runtime.Gosched()
494			}
495		},
496		interfaceT: func() {
497			a := interface{}(uint64(0))
498			for i := 0; i < mods; i++ {
499				a = a.(uint64) + 1
500				runtime.Gosched()
501			}
502		},
503	},
504	modifier{
505		name: "int8",
506		t: func() {
507			var u int8
508			for i := 0; i < mods; i++ {
509				u++
510				runtime.Gosched()
511			}
512		},
513		pointerT: func() {
514			a := func() *int8 { return new(int8) }()
515			for i := 0; i < mods; i++ {
516				*a++
517				runtime.Gosched()
518			}
519		},
520		arrayT: func() {
521			a := [length]int8{}
522			for i := 0; i < mods; i++ {
523				for j := 0; j < len(a); j++ {
524					a[j]++
525					runtime.Gosched()
526				}
527			}
528		},
529		sliceT: func() {
530			a := make([]int8, length)
531			for i := 0; i < mods; i++ {
532				for j := 0; j < len(a); j++ {
533					a[j]++
534					runtime.Gosched()
535				}
536			}
537		},
538		mapT: func() {
539			a := make(map[int8]int8)
540			for i := 0; i < length; i++ {
541				a[int8(i)] = int8(i)
542				runtime.Gosched()
543			}
544			for i := 0; i < mods; i++ {
545				for k, _ := range a {
546					a[k]++
547				}
548				runtime.Gosched()
549			}
550		},
551		mapPointerKeyT: func() {
552			a := make(map[*int8]int8)
553			for i := 0; i < length; i++ {
554				a[new(int8)] = int8(i)
555				runtime.Gosched()
556			}
557			for i := 0; i < mods; i++ {
558				for k, _ := range a {
559					a[k]++
560					runtime.Gosched()
561				}
562			}
563		},
564		chanT: func() {
565			a := make(chan int8)
566			for i := 0; i < mods; i++ {
567				go func() { a <- int8(i) }()
568				<-a
569				runtime.Gosched()
570			}
571		},
572		interfaceT: func() {
573			a := interface{}(int8(0))
574			for i := 0; i < mods; i++ {
575				a = a.(int8) + 1
576				runtime.Gosched()
577			}
578		},
579	},
580	modifier{
581		name: "int16",
582		t: func() {
583			var u int16
584			for i := 0; i < mods; i++ {
585				u++
586				runtime.Gosched()
587			}
588		},
589		pointerT: func() {
590			a := func() *int16 { return new(int16) }()
591			for i := 0; i < mods; i++ {
592				*a++
593				runtime.Gosched()
594			}
595		},
596		arrayT: func() {
597			a := [length]int16{}
598			for i := 0; i < mods; i++ {
599				for j := 0; j < len(a); j++ {
600					a[j]++
601					runtime.Gosched()
602				}
603			}
604		},
605		sliceT: func() {
606			a := make([]int16, length)
607			for i := 0; i < mods; i++ {
608				for j := 0; j < len(a); j++ {
609					a[j]++
610					runtime.Gosched()
611				}
612			}
613		},
614		mapT: func() {
615			a := make(map[int16]int16)
616			for i := 0; i < length; i++ {
617				a[int16(i)] = int16(i)
618				runtime.Gosched()
619			}
620			for i := 0; i < mods; i++ {
621				for k, _ := range a {
622					a[k]++
623				}
624				runtime.Gosched()
625			}
626		},
627		mapPointerKeyT: func() {
628			a := make(map[*int16]int16)
629			for i := 0; i < length; i++ {
630				a[new(int16)] = int16(i)
631				runtime.Gosched()
632			}
633			for i := 0; i < mods; i++ {
634				for k, _ := range a {
635					a[k]++
636					runtime.Gosched()
637				}
638			}
639		},
640		chanT: func() {
641			a := make(chan int16)
642			for i := 0; i < mods; i++ {
643				go func() { a <- int16(i) }()
644				<-a
645				runtime.Gosched()
646			}
647		},
648		interfaceT: func() {
649			a := interface{}(int16(0))
650			for i := 0; i < mods; i++ {
651				a = a.(int16) + 1
652				runtime.Gosched()
653			}
654		},
655	},
656	modifier{
657		name: "int32",
658		t: func() {
659			var u int32
660			for i := 0; i < mods; i++ {
661				u++
662				runtime.Gosched()
663			}
664		},
665		pointerT: func() {
666			a := func() *int32 { return new(int32) }()
667			for i := 0; i < mods; i++ {
668				*a++
669				runtime.Gosched()
670			}
671		},
672		arrayT: func() {
673			a := [length]int32{}
674			for i := 0; i < mods; i++ {
675				for j := 0; j < len(a); j++ {
676					a[j]++
677					runtime.Gosched()
678				}
679			}
680		},
681		sliceT: func() {
682			a := make([]int32, length)
683			for i := 0; i < mods; i++ {
684				for j := 0; j < len(a); j++ {
685					a[j]++
686					runtime.Gosched()
687				}
688			}
689		},
690		mapT: func() {
691			a := make(map[int32]int32)
692			for i := 0; i < length; i++ {
693				a[int32(i)] = int32(i)
694				runtime.Gosched()
695			}
696			for i := 0; i < mods; i++ {
697				for k, _ := range a {
698					a[k]++
699				}
700				runtime.Gosched()
701			}
702		},
703		mapPointerKeyT: func() {
704			a := make(map[*int32]int32)
705			for i := 0; i < length; i++ {
706				a[new(int32)] = int32(i)
707				runtime.Gosched()
708			}
709			for i := 0; i < mods; i++ {
710				for k, _ := range a {
711					a[k]++
712					runtime.Gosched()
713				}
714			}
715		},
716		chanT: func() {
717			a := make(chan int32)
718			for i := 0; i < mods; i++ {
719				go func() { a <- int32(i) }()
720				<-a
721				runtime.Gosched()
722			}
723		},
724		interfaceT: func() {
725			a := interface{}(int32(0))
726			for i := 0; i < mods; i++ {
727				a = a.(int32) + 1
728				runtime.Gosched()
729			}
730		},
731	},
732	modifier{
733		name: "int64",
734		t: func() {
735			var u int64
736			for i := 0; i < mods; i++ {
737				u++
738				runtime.Gosched()
739			}
740		},
741		pointerT: func() {
742			a := func() *int64 { return new(int64) }()
743			for i := 0; i < mods; i++ {
744				*a++
745				runtime.Gosched()
746			}
747		},
748		arrayT: func() {
749			a := [length]int64{}
750			for i := 0; i < mods; i++ {
751				for j := 0; j < len(a); j++ {
752					a[j]++
753					runtime.Gosched()
754				}
755			}
756		},
757		sliceT: func() {
758			a := make([]int64, length)
759			for i := 0; i < mods; i++ {
760				for j := 0; j < len(a); j++ {
761					a[j]++
762					runtime.Gosched()
763				}
764			}
765		},
766		mapT: func() {
767			a := make(map[int64]int64)
768			for i := 0; i < length; i++ {
769				a[int64(i)] = int64(i)
770				runtime.Gosched()
771			}
772			for i := 0; i < mods; i++ {
773				for k, _ := range a {
774					a[k]++
775				}
776				runtime.Gosched()
777			}
778		},
779		mapPointerKeyT: func() {
780			a := make(map[*int64]int64)
781			for i := 0; i < length; i++ {
782				a[new(int64)] = int64(i)
783				runtime.Gosched()
784			}
785			for i := 0; i < mods; i++ {
786				for k, _ := range a {
787					a[k]++
788					runtime.Gosched()
789				}
790			}
791		},
792		chanT: func() {
793			a := make(chan int64)
794			for i := 0; i < mods; i++ {
795				go func() { a <- int64(i) }()
796				<-a
797				runtime.Gosched()
798			}
799		},
800		interfaceT: func() {
801			a := interface{}(int64(0))
802			for i := 0; i < mods; i++ {
803				a = a.(int64) + 1
804				runtime.Gosched()
805			}
806		},
807	},
808	modifier{
809		name: "float32",
810		t: func() {
811			u := float32(1.01)
812			for i := 0; i < mods; i++ {
813				u *= 1.01
814				runtime.Gosched()
815			}
816		},
817		pointerT: func() {
818			a := func() *float32 { return new(float32) }()
819			*a = 1.01
820			for i := 0; i < mods; i++ {
821				*a *= 1.01
822				runtime.Gosched()
823			}
824		},
825		arrayT: func() {
826			a := [length]float32{}
827			for i := 0; i < length; i++ {
828				a[i] = float32(1.01)
829				runtime.Gosched()
830			}
831			for i := 0; i < mods; i++ {
832				for j := 0; j < len(a); j++ {
833					a[j] *= 1.01
834					runtime.Gosched()
835				}
836			}
837		},
838		sliceT: func() {
839			a := make([]float32, length)
840			for i := 0; i < length; i++ {
841				a[i] = float32(1.01)
842				runtime.Gosched()
843			}
844			for i := 0; i < mods; i++ {
845				for j := 0; j < len(a); j++ {
846					a[j] *= 1.01
847					runtime.Gosched()
848				}
849			}
850		},
851		mapT: func() {
852			a := make(map[float32]float32)
853			for i := 0; i < length; i++ {
854				a[float32(i)] = float32(i) + 0.01
855				runtime.Gosched()
856			}
857			for i := 0; i < mods; i++ {
858				for k, _ := range a {
859					a[k] *= 1.01
860				}
861				runtime.Gosched()
862			}
863		},
864		mapPointerKeyT: func() {
865			a := make(map[*float32]float32)
866			for i := 0; i < length; i++ {
867				a[new(float32)] = float32(i) + 0.01
868				runtime.Gosched()
869			}
870			for i := 0; i < mods; i++ {
871				for k, _ := range a {
872					a[k] *= 1.01
873					runtime.Gosched()
874				}
875			}
876		},
877		chanT: func() {
878			a := make(chan float32)
879			for i := 0; i < mods; i++ {
880				go func() { a <- float32(i) }()
881				<-a
882				runtime.Gosched()
883			}
884		},
885		interfaceT: func() {
886			a := interface{}(float32(0))
887			for i := 0; i < mods; i++ {
888				a = a.(float32) * 1.01
889				runtime.Gosched()
890			}
891		},
892	},
893	modifier{
894		name: "float64",
895		t: func() {
896			u := float64(1.01)
897			for i := 0; i < mods; i++ {
898				u *= 1.01
899				runtime.Gosched()
900			}
901		},
902		pointerT: func() {
903			a := func() *float64 { return new(float64) }()
904			*a = 1.01
905			for i := 0; i < mods; i++ {
906				*a *= 1.01
907				runtime.Gosched()
908			}
909		},
910		arrayT: func() {
911			a := [length]float64{}
912			for i := 0; i < length; i++ {
913				a[i] = float64(1.01)
914				runtime.Gosched()
915			}
916			for i := 0; i < mods; i++ {
917				for j := 0; j < len(a); j++ {
918					a[j] *= 1.01
919					runtime.Gosched()
920				}
921			}
922		},
923		sliceT: func() {
924			a := make([]float64, length)
925			for i := 0; i < length; i++ {
926				a[i] = float64(1.01)
927				runtime.Gosched()
928			}
929			for i := 0; i < mods; i++ {
930				for j := 0; j < len(a); j++ {
931					a[j] *= 1.01
932					runtime.Gosched()
933				}
934			}
935		},
936		mapT: func() {
937			a := make(map[float64]float64)
938			for i := 0; i < length; i++ {
939				a[float64(i)] = float64(i) + 0.01
940				runtime.Gosched()
941			}
942			for i := 0; i < mods; i++ {
943				for k, _ := range a {
944					a[k] *= 1.01
945				}
946				runtime.Gosched()
947			}
948		},
949		mapPointerKeyT: func() {
950			a := make(map[*float64]float64)
951			for i := 0; i < length; i++ {
952				a[new(float64)] = float64(i) + 0.01
953				runtime.Gosched()
954			}
955			for i := 0; i < mods; i++ {
956				for k, _ := range a {
957					a[k] *= 1.01
958					runtime.Gosched()
959				}
960			}
961		},
962		chanT: func() {
963			a := make(chan float64)
964			for i := 0; i < mods; i++ {
965				go func() { a <- float64(i) }()
966				<-a
967				runtime.Gosched()
968			}
969		},
970		interfaceT: func() {
971			a := interface{}(float64(0))
972			for i := 0; i < mods; i++ {
973				a = a.(float64) * 1.01
974				runtime.Gosched()
975			}
976		},
977	},
978	modifier{
979		name: "complex64",
980		t: func() {
981			c := complex64(complex(float32(1.01), float32(1.01)))
982			for i := 0; i < mods; i++ {
983				c = complex(real(c)*1.01, imag(c)*1.01)
984				runtime.Gosched()
985			}
986		},
987		pointerT: func() {
988			a := func() *complex64 { return new(complex64) }()
989			*a = complex64(complex(float32(1.01), float32(1.01)))
990			for i := 0; i < mods; i++ {
991				*a *= complex(real(*a)*1.01, imag(*a)*1.01)
992				runtime.Gosched()
993			}
994		},
995		arrayT: func() {
996			a := [length]complex64{}
997			for i := 0; i < length; i++ {
998				a[i] = complex64(complex(float32(1.01), float32(1.01)))
999				runtime.Gosched()
1000			}
1001			for i := 0; i < mods; i++ {
1002				for j := 0; j < len(a); j++ {
1003					a[j] *= complex(real(a[j])*1.01, imag(a[j])*1.01)
1004					runtime.Gosched()
1005				}
1006			}
1007		},
1008		sliceT: func() {
1009			a := make([]complex64, length)
1010			for i := 0; i < length; i++ {
1011				a[i] = complex64(complex(float32(1.01), float32(1.01)))
1012				runtime.Gosched()
1013			}
1014			for i := 0; i < mods; i++ {
1015				for j := 0; j < len(a); j++ {
1016					a[j] *= complex(real(a[j])*1.01, imag(a[j])*1.01)
1017					runtime.Gosched()
1018				}
1019			}
1020		},
1021		mapT: func() {
1022			a := make(map[complex64]complex64)
1023			for i := 0; i < length; i++ {
1024				a[complex64(complex(float32(i), float32(i)))] = complex64(complex(float32(i), float32(i))) + 0.01
1025				runtime.Gosched()
1026			}
1027			for i := 0; i < mods; i++ {
1028				for k, _ := range a {
1029					a[k] *= complex(real(a[k])*1.01, imag(a[k])*1.01)
1030				}
1031				runtime.Gosched()
1032			}
1033		},
1034		mapPointerKeyT: func() {
1035			a := make(map[*complex64]complex64)
1036			for i := 0; i < length; i++ {
1037				a[new(complex64)] = complex64(complex(float32(i), float32(i))) + 0.01
1038				runtime.Gosched()
1039			}
1040			for i := 0; i < mods; i++ {
1041				for k, _ := range a {
1042					a[k] *= complex(real(a[k])*1.01, imag(a[k])*1.01)
1043					runtime.Gosched()
1044				}
1045			}
1046		},
1047		chanT: func() {
1048			a := make(chan complex64)
1049			for i := 0; i < mods; i++ {
1050				go func() { a <- complex64(complex(float32(i), float32(i))) }()
1051				<-a
1052				runtime.Gosched()
1053			}
1054		},
1055		interfaceT: func() {
1056			a := interface{}(complex64(complex(float32(1.01), float32(1.01))))
1057			for i := 0; i < mods; i++ {
1058				a = a.(complex64) * complex(real(a.(complex64))*1.01, imag(a.(complex64))*1.01)
1059				runtime.Gosched()
1060			}
1061		},
1062	},
1063	modifier{
1064		name: "complex128",
1065		t: func() {
1066			c := complex128(complex(float64(1.01), float64(1.01)))
1067			for i := 0; i < mods; i++ {
1068				c = complex(real(c)*1.01, imag(c)*1.01)
1069				runtime.Gosched()
1070			}
1071		},
1072		pointerT: func() {
1073			a := func() *complex128 { return new(complex128) }()
1074			*a = complex128(complex(float64(1.01), float64(1.01)))
1075			for i := 0; i < mods; i++ {
1076				*a *= complex(real(*a)*1.01, imag(*a)*1.01)
1077				runtime.Gosched()
1078			}
1079		},
1080		arrayT: func() {
1081			a := [length]complex128{}
1082			for i := 0; i < length; i++ {
1083				a[i] = complex128(complex(float64(1.01), float64(1.01)))
1084				runtime.Gosched()
1085			}
1086			for i := 0; i < mods; i++ {
1087				for j := 0; j < len(a); j++ {
1088					a[j] *= complex(real(a[j])*1.01, imag(a[j])*1.01)
1089					runtime.Gosched()
1090				}
1091			}
1092		},
1093		sliceT: func() {
1094			a := make([]complex128, length)
1095			for i := 0; i < length; i++ {
1096				a[i] = complex128(complex(float64(1.01), float64(1.01)))
1097				runtime.Gosched()
1098			}
1099			for i := 0; i < mods; i++ {
1100				for j := 0; j < len(a); j++ {
1101					a[j] *= complex(real(a[j])*1.01, imag(a[j])*1.01)
1102					runtime.Gosched()
1103				}
1104			}
1105		},
1106		mapT: func() {
1107			a := make(map[complex128]complex128)
1108			for i := 0; i < length; i++ {
1109				a[complex128(complex(float64(i), float64(i)))] = complex128(complex(float64(i), float64(i))) + 0.01
1110				runtime.Gosched()
1111			}
1112			for i := 0; i < mods; i++ {
1113				for k, _ := range a {
1114					a[k] *= complex(real(a[k])*1.01, imag(a[k])*1.01)
1115				}
1116				runtime.Gosched()
1117			}
1118		},
1119		mapPointerKeyT: func() {
1120			a := make(map[*complex128]complex128)
1121			for i := 0; i < length; i++ {
1122				a[new(complex128)] = complex128(complex(float64(i), float64(i))) + 0.01
1123				runtime.Gosched()
1124			}
1125			for i := 0; i < mods; i++ {
1126				for k, _ := range a {
1127					a[k] *= complex(real(a[k])*1.01, imag(a[k])*1.01)
1128					runtime.Gosched()
1129				}
1130			}
1131		},
1132		chanT: func() {
1133			a := make(chan complex128)
1134			for i := 0; i < mods; i++ {
1135				go func() { a <- complex128(complex(float64(i), float64(i))) }()
1136				<-a
1137				runtime.Gosched()
1138			}
1139		},
1140		interfaceT: func() {
1141			a := interface{}(complex128(complex(float64(1.01), float64(1.01))))
1142			for i := 0; i < mods; i++ {
1143				a = a.(complex128) * complex(real(a.(complex128))*1.01, imag(a.(complex128))*1.01)
1144				runtime.Gosched()
1145			}
1146		},
1147	},
1148	modifier{
1149		name: "byte",
1150		t: func() {
1151			var a byte
1152			for i := 0; i < mods; i++ {
1153				a++
1154				runtime.Gosched()
1155			}
1156		},
1157		pointerT: func() {
1158			a := func() *byte { return new(byte) }()
1159			for i := 0; i < mods; i++ {
1160				*a++
1161				runtime.Gosched()
1162			}
1163		},
1164		arrayT: func() {
1165			a := [length]byte{}
1166			for i := 0; i < mods; i++ {
1167				for j := 0; j < len(a); j++ {
1168					a[j]++
1169					runtime.Gosched()
1170				}
1171			}
1172		},
1173		sliceT: func() {
1174			a := make([]byte, length)
1175			for i := 0; i < mods; i++ {
1176				for j := 0; j < len(a); j++ {
1177					a[j]++
1178					runtime.Gosched()
1179				}
1180			}
1181		},
1182		mapT: func() {
1183			a := make(map[byte]byte)
1184			for i := 0; i < length; i++ {
1185				a[byte(i)] = byte(i)
1186				runtime.Gosched()
1187			}
1188			for i := 0; i < mods; i++ {
1189				for k, _ := range a {
1190					a[k]++
1191				}
1192				runtime.Gosched()
1193			}
1194		},
1195		mapPointerKeyT: func() {
1196			a := make(map[*byte]byte)
1197			for i := 0; i < length; i++ {
1198				a[new(byte)] = byte(i)
1199				runtime.Gosched()
1200			}
1201			for i := 0; i < mods; i++ {
1202				for k, _ := range a {
1203					a[k]++
1204					runtime.Gosched()
1205				}
1206			}
1207		},
1208		chanT: func() {
1209			a := make(chan byte)
1210			for i := 0; i < mods; i++ {
1211				go func() { a <- byte(i) }()
1212				<-a
1213				runtime.Gosched()
1214			}
1215		},
1216		interfaceT: func() {
1217			a := interface{}(byte(0))
1218			for i := 0; i < mods; i++ {
1219				a = a.(byte) + 1
1220				runtime.Gosched()
1221			}
1222		},
1223	},
1224	modifier{
1225		name: "rune",
1226		t: func() {
1227			var a rune
1228			for i := 0; i < mods; i++ {
1229				a++
1230				runtime.Gosched()
1231			}
1232		},
1233		pointerT: func() {
1234			a := func() *rune { return new(rune) }()
1235			for i := 0; i < mods; i++ {
1236				*a++
1237				runtime.Gosched()
1238			}
1239		},
1240		arrayT: func() {
1241			a := [length]rune{}
1242			for i := 0; i < mods; i++ {
1243				for j := 0; j < len(a); j++ {
1244					a[j]++
1245					runtime.Gosched()
1246				}
1247			}
1248		},
1249		sliceT: func() {
1250			a := make([]rune, length)
1251			for i := 0; i < mods; i++ {
1252				for j := 0; j < len(a); j++ {
1253					a[j]++
1254					runtime.Gosched()
1255				}
1256			}
1257		},
1258		mapT: func() {
1259			a := make(map[rune]rune)
1260			for i := 0; i < length; i++ {
1261				a[rune(i)] = rune(i)
1262				runtime.Gosched()
1263			}
1264			for i := 0; i < mods; i++ {
1265				for k, _ := range a {
1266					a[k]++
1267				}
1268				runtime.Gosched()
1269			}
1270		},
1271		mapPointerKeyT: func() {
1272			a := make(map[*rune]rune)
1273			for i := 0; i < length; i++ {
1274				a[new(rune)] = rune(i)
1275				runtime.Gosched()
1276			}
1277			for i := 0; i < mods; i++ {
1278				for k, _ := range a {
1279					a[k]++
1280					runtime.Gosched()
1281				}
1282			}
1283		},
1284		chanT: func() {
1285			a := make(chan rune)
1286			for i := 0; i < mods; i++ {
1287				go func() { a <- rune(i) }()
1288				<-a
1289				runtime.Gosched()
1290			}
1291		},
1292		interfaceT: func() {
1293			a := interface{}(rune(0))
1294			for i := 0; i < mods; i++ {
1295				a = a.(rune) + 1
1296				runtime.Gosched()
1297			}
1298		},
1299	},
1300	modifier{
1301		name: "uint",
1302		t: func() {
1303			var a uint
1304			for i := 0; i < mods; i++ {
1305				a++
1306				runtime.Gosched()
1307			}
1308		},
1309		pointerT: func() {
1310			a := func() *uint { return new(uint) }()
1311			for i := 0; i < mods; i++ {
1312				*a++
1313				runtime.Gosched()
1314			}
1315		},
1316		arrayT: func() {
1317			a := [length]uint{}
1318			for i := 0; i < mods; i++ {
1319				for j := 0; j < len(a); j++ {
1320					a[j]++
1321					runtime.Gosched()
1322				}
1323			}
1324		},
1325		sliceT: func() {
1326			a := make([]uint, length)
1327			for i := 0; i < mods; i++ {
1328				for j := 0; j < len(a); j++ {
1329					a[j]++
1330					runtime.Gosched()
1331				}
1332			}
1333		},
1334		mapT: func() {
1335			a := make(map[uint]uint)
1336			for i := 0; i < length; i++ {
1337				a[uint(i)] = uint(i)
1338				runtime.Gosched()
1339			}
1340			for i := 0; i < mods; i++ {
1341				for k, _ := range a {
1342					a[k]++
1343				}
1344				runtime.Gosched()
1345			}
1346		},
1347		mapPointerKeyT: func() {
1348			a := make(map[*uint]uint)
1349			for i := 0; i < length; i++ {
1350				a[new(uint)] = uint(i)
1351				runtime.Gosched()
1352			}
1353			for i := 0; i < mods; i++ {
1354				for k, _ := range a {
1355					a[k]++
1356					runtime.Gosched()
1357				}
1358			}
1359		},
1360		chanT: func() {
1361			a := make(chan uint)
1362			for i := 0; i < mods; i++ {
1363				go func() { a <- uint(i) }()
1364				<-a
1365				runtime.Gosched()
1366			}
1367		},
1368		interfaceT: func() {
1369			a := interface{}(uint(0))
1370			for i := 0; i < mods; i++ {
1371				a = a.(uint) + 1
1372				runtime.Gosched()
1373			}
1374		},
1375	},
1376	modifier{
1377		name: "int",
1378		t: func() {
1379			var a int
1380			for i := 0; i < mods; i++ {
1381				a++
1382				runtime.Gosched()
1383			}
1384		},
1385		pointerT: func() {
1386			a := func() *int { return new(int) }()
1387			for i := 0; i < mods; i++ {
1388				*a++
1389				runtime.Gosched()
1390			}
1391		},
1392		arrayT: func() {
1393			a := [length]int{}
1394			for i := 0; i < mods; i++ {
1395				for j := 0; j < len(a); j++ {
1396					a[j]++
1397					runtime.Gosched()
1398				}
1399			}
1400		},
1401		sliceT: func() {
1402			a := make([]int, length)
1403			for i := 0; i < mods; i++ {
1404				for j := 0; j < len(a); j++ {
1405					a[j]++
1406					runtime.Gosched()
1407				}
1408			}
1409		},
1410		mapT: func() {
1411			a := make(map[int]int)
1412			for i := 0; i < length; i++ {
1413				a[int(i)] = int(i)
1414				runtime.Gosched()
1415			}
1416			for i := 0; i < mods; i++ {
1417				for k, _ := range a {
1418					a[k]++
1419				}
1420				runtime.Gosched()
1421			}
1422		},
1423		mapPointerKeyT: func() {
1424			a := make(map[*int]int)
1425			for i := 0; i < length; i++ {
1426				a[new(int)] = int(i)
1427				runtime.Gosched()
1428			}
1429			for i := 0; i < mods; i++ {
1430				for k, _ := range a {
1431					a[k]++
1432					runtime.Gosched()
1433				}
1434			}
1435		},
1436		chanT: func() {
1437			a := make(chan int)
1438			for i := 0; i < mods; i++ {
1439				go func() { a <- int(i) }()
1440				<-a
1441				runtime.Gosched()
1442			}
1443		},
1444		interfaceT: func() {
1445			a := interface{}(int(0))
1446			for i := 0; i < mods; i++ {
1447				a = a.(int) + 1
1448				runtime.Gosched()
1449			}
1450		},
1451	},
1452	modifier{
1453		name: "uintptr",
1454		t: func() {
1455			var a uintptr
1456			for i := 0; i < mods; i++ {
1457				a++
1458				runtime.Gosched()
1459			}
1460		},
1461		pointerT: func() {
1462			a := func() *uintptr { return new(uintptr) }()
1463			for i := 0; i < mods; i++ {
1464				*a++
1465				runtime.Gosched()
1466			}
1467		},
1468		arrayT: func() {
1469			a := [length]uintptr{}
1470			for i := 0; i < mods; i++ {
1471				for j := 0; j < len(a); j++ {
1472					a[j]++
1473					runtime.Gosched()
1474				}
1475			}
1476		},
1477		sliceT: func() {
1478			a := make([]uintptr, length)
1479			for i := 0; i < mods; i++ {
1480				for j := 0; j < len(a); j++ {
1481					a[j]++
1482					runtime.Gosched()
1483				}
1484			}
1485		},
1486		mapT: func() {
1487			a := make(map[uintptr]uintptr)
1488			for i := 0; i < length; i++ {
1489				a[uintptr(i)] = uintptr(i)
1490				runtime.Gosched()
1491			}
1492			for i := 0; i < mods; i++ {
1493				for k, _ := range a {
1494					a[k]++
1495				}
1496				runtime.Gosched()
1497			}
1498		},
1499		mapPointerKeyT: func() {
1500			a := make(map[*uintptr]uintptr)
1501			for i := 0; i < length; i++ {
1502				a[new(uintptr)] = uintptr(i)
1503				runtime.Gosched()
1504			}
1505			for i := 0; i < mods; i++ {
1506				for k, _ := range a {
1507					a[k]++
1508					runtime.Gosched()
1509				}
1510			}
1511		},
1512		chanT: func() {
1513			a := make(chan uintptr)
1514			for i := 0; i < mods; i++ {
1515				go func() { a <- uintptr(i) }()
1516				<-a
1517				runtime.Gosched()
1518			}
1519		},
1520		interfaceT: func() {
1521			a := interface{}(uintptr(0))
1522			for i := 0; i < mods; i++ {
1523				a = a.(uintptr) + 1
1524				runtime.Gosched()
1525			}
1526		},
1527	},
1528	modifier{
1529		name: "string",
1530		t: func() {
1531			var s string
1532			f := func(a string) string { return a }
1533			for i := 0; i < mods; i++ {
1534				s = str(i)
1535				s = f(s)
1536			}
1537		},
1538		pointerT: func() {
1539			a := func() *string { return new(string) }()
1540			for i := 0; i < mods; i++ {
1541				*a = str(i)
1542				runtime.Gosched()
1543			}
1544		},
1545		arrayT: func() {
1546			a := [length]string{}
1547			for i := 0; i < mods; i++ {
1548				for j := 0; j < len(a); j++ {
1549					a[j] = str(i)
1550					runtime.Gosched()
1551				}
1552			}
1553		},
1554		sliceT: func() {
1555			a := make([]string, length)
1556			for i := 0; i < mods; i++ {
1557				for j := 0; j < len(a); j++ {
1558					a[j] = str(i)
1559					runtime.Gosched()
1560				}
1561			}
1562		},
1563		mapT: func() {
1564			a := make(map[string]string)
1565			for i := 0; i < length; i++ {
1566				a[string(i)] = str(i)
1567				runtime.Gosched()
1568			}
1569			for i := 0; i < mods; i++ {
1570				for k, _ := range a {
1571					a[k] = str(i)
1572				}
1573				runtime.Gosched()
1574			}
1575		},
1576		mapPointerKeyT: func() {
1577			a := make(map[*string]string)
1578			for i := 0; i < length; i++ {
1579				a[new(string)] = str(i)
1580				runtime.Gosched()
1581			}
1582			for i := 0; i < mods; i++ {
1583				for k, _ := range a {
1584					a[k] = str(i)
1585					runtime.Gosched()
1586				}
1587			}
1588		},
1589		chanT: func() {
1590			a := make(chan string)
1591			for i := 0; i < mods; i++ {
1592				go func() { a <- str(i) }()
1593				<-a
1594				runtime.Gosched()
1595			}
1596		},
1597		interfaceT: func() {
1598			a := interface{}(str(0))
1599			f := func(a string) string { return a }
1600			for i := 0; i < mods; i++ {
1601				a = str(i)
1602				a = f(a.(string))
1603				runtime.Gosched()
1604			}
1605		},
1606	},
1607	modifier{
1608		name: "structT",
1609		t: func() {
1610			s := newStructT()
1611			for i := 0; i < mods; i++ {
1612				s.u8++
1613				s.u16++
1614				s.u32++
1615				s.u64++
1616				s.i8++
1617				s.i16++
1618				s.i32++
1619				s.i64++
1620				s.f32 *= 1.01
1621				s.f64 *= 1.01
1622				s.c64 = complex(real(s.c64)*1.01, imag(s.c64)*1.01)
1623				s.c128 = complex(real(s.c128)*1.01, imag(s.c128)*1.01)
1624				s.b++
1625				s.r++
1626				s.u++
1627				s.in++
1628				s.uip++
1629				s.s = str(i)
1630				runtime.Gosched()
1631			}
1632		},
1633		pointerT: func() {
1634			s := func() *structT {
1635				t := newStructT()
1636				return &t
1637			}()
1638			for i := 0; i < mods; i++ {
1639				s.u8++
1640				s.u16++
1641				s.u32++
1642				s.u64++
1643				s.i8++
1644				s.i16++
1645				s.i32++
1646				s.i64++
1647				s.f32 *= 1.01
1648				s.f64 *= 1.01
1649				s.c64 = complex(real(s.c64)*1.01, imag(s.c64)*1.01)
1650				s.c128 = complex(real(s.c128)*1.01, imag(s.c128)*1.01)
1651				s.b++
1652				s.r++
1653				s.u++
1654				s.in++
1655				s.uip++
1656				s.s = str(i)
1657				runtime.Gosched()
1658			}
1659		},
1660		arrayT: func() {
1661			a := [length]structT{}
1662			for i := 0; i < len(a); i++ {
1663				a[i] = newStructT()
1664			}
1665			for i := 0; i < mods; i++ {
1666				for j := 0; j < len(a); j++ {
1667					a[j].u8++
1668					a[j].u16++
1669					a[j].u32++
1670					a[j].u64++
1671					a[j].i8++
1672					a[j].i16++
1673					a[j].i32++
1674					a[j].i64++
1675					a[j].f32 *= 1.01
1676					a[j].f64 *= 1.01
1677					a[j].c64 = complex(real(a[j].c64)*1.01, imag(a[j].c64)*1.01)
1678					a[j].c128 = complex(real(a[j].c128)*1.01, imag(a[j].c128)*1.01)
1679					a[j].b++
1680					a[j].r++
1681					a[j].u++
1682					a[j].in++
1683					a[j].uip++
1684					a[j].s = str(i)
1685					runtime.Gosched()
1686				}
1687			}
1688		},
1689		sliceT: func() {
1690			a := make([]structT, length)
1691			for i := 0; i < len(a); i++ {
1692				a[i] = newStructT()
1693			}
1694			for i := 0; i < mods; i++ {
1695				for j := 0; j < len(a); j++ {
1696					a[j].u8++
1697					a[j].u16++
1698					a[j].u32++
1699					a[j].u64++
1700					a[j].i8++
1701					a[j].i16++
1702					a[j].i32++
1703					a[j].i64++
1704					a[j].f32 *= 1.01
1705					a[j].f64 *= 1.01
1706					a[j].c64 = complex(real(a[j].c64)*1.01, imag(a[j].c64)*1.01)
1707					a[j].c128 = complex(real(a[j].c128)*1.01, imag(a[j].c128)*1.01)
1708					a[j].b++
1709					a[j].r++
1710					a[j].u++
1711					a[j].in++
1712					a[j].uip++
1713					a[j].s = str(i)
1714					runtime.Gosched()
1715				}
1716			}
1717		},
1718		mapT: func() {
1719			a := make(map[structT]structT)
1720			for i := 0; i < length; i++ {
1721				m := newStructT()
1722				m.in = i
1723				a[m] = newStructT()
1724				runtime.Gosched()
1725			}
1726			for i := 0; i < mods; i++ {
1727				for j, _ := range a {
1728					m := a[j]
1729					m.u8++
1730					m.u16++
1731					m.u32++
1732					m.u64++
1733					m.i8++
1734					m.i16++
1735					m.i32++
1736					m.i64++
1737					m.f32 *= 1.01
1738					m.f64 *= 1.01
1739					m.c64 = complex(real(a[j].c64)*1.01, imag(a[j].c64)*1.01)
1740					m.c128 = complex(real(a[j].c128)*1.01, imag(a[j].c128)*1.01)
1741					m.b++
1742					m.r++
1743					m.u++
1744					m.in++
1745					m.uip++
1746					m.s = str(i)
1747					a[j] = m
1748					runtime.Gosched()
1749				}
1750				runtime.Gosched()
1751			}
1752		},
1753		mapPointerKeyT: func() {
1754			a := make(map[*structT]structT)
1755			f := func() *structT {
1756				m := newStructT()
1757				return &m
1758			}
1759			for i := 0; i < length; i++ {
1760				m := f()
1761				m.in = i
1762				a[m] = newStructT()
1763				runtime.Gosched()
1764			}
1765			for i := 0; i < mods; i++ {
1766				for j, _ := range a {
1767					m := a[j]
1768					m.u8++
1769					m.u16++
1770					m.u32++
1771					m.u64++
1772					m.i8++
1773					m.i16++
1774					m.i32++
1775					m.i64++
1776					m.f32 *= 1.01
1777					m.f64 *= 1.01
1778					m.c64 = complex(real(a[j].c64)*1.01, imag(a[j].c64)*1.01)
1779					m.c128 = complex(real(a[j].c128)*1.01, imag(a[j].c128)*1.01)
1780					m.b++
1781					m.r++
1782					m.u++
1783					m.in++
1784					m.uip++
1785					m.s = str(i)
1786					a[j] = m
1787					runtime.Gosched()
1788				}
1789				runtime.Gosched()
1790			}
1791		},
1792		chanT: func() {
1793			a := make(chan structT)
1794			for i := 0; i < mods; i++ {
1795				go func() { a <- newStructT() }()
1796				<-a
1797				runtime.Gosched()
1798			}
1799		},
1800		interfaceT: func() {
1801			a := interface{}(newStructT())
1802			for i := 0; i < mods; i++ {
1803				a = a.(structT)
1804				runtime.Gosched()
1805			}
1806		},
1807	},
1808}
1809
1810type structT struct {
1811	u8   uint8
1812	u16  uint16
1813	u32  uint32
1814	u64  uint64
1815	i8   int8
1816	i16  int16
1817	i32  int32
1818	i64  int64
1819	f32  float32
1820	f64  float64
1821	c64  complex64
1822	c128 complex128
1823	b    byte
1824	r    rune
1825	u    uint
1826	in   int
1827	uip  uintptr
1828	s    string
1829}
1830
1831func newStructT() structT {
1832	return structT{
1833		f32:  1.01,
1834		f64:  1.01,
1835		c64:  complex(float32(1.01), float32(1.01)),
1836		c128: complex(float64(1.01), float64(1.01)),
1837	}
1838}
1839
1840func str(in int) string {
1841	switch in % 3 {
1842	case 0:
1843		return "Hello"
1844	case 1:
1845		return "world"
1846	case 2:
1847		return "!"
1848	}
1849	return "?"
1850}
1851