1// runoutput
2
3// Copyright 2013 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// issue 5162: bad array equality when multiple comparisons
8// happen in the same expression.
9
10package main
11
12import (
13	"fmt"
14	"strings"
15)
16
17const template = `
18func CheckEqNNN_TTT() {
19	onesA := [NNN]ttt{ONES}
20	onesB := [NNN]ttt{ONES}
21	twos := [NNN]ttt{TWOS}
22	if onesA != onesB {
23		println("onesA != onesB in CheckEqNNN_TTT")
24	}
25	if onesA == twos {
26		println("onesA == twos in CheckEqNNN_TTT")
27	}
28	if onesB == twos {
29		println("onesB == twos in CheckEqNNN_TTT")
30	}
31	if s := fmt.Sprint(onesA == onesB, onesA != twos, onesB != twos); s != "true true true" {
32		println("fail in CheckEqNNN_TTT:", s)
33	}
34}
35
36func CheckEqNNN_TTTExtraVar() {
37	onesA := [NNN]ttt{ONES}
38	onesB := [NNN]ttt{ONES}
39	twos := [NNN]ttt{TWOS}
40	onesX := onesA
41	if onesA != onesB {
42		println("onesA != onesB in CheckEqNNN_TTTExtraVar")
43	}
44	if onesA == twos {
45		println("onesA == twos in CheckEqNNN_TTTExtraVar")
46	}
47	if onesB == twos {
48		println("onesB == twos in CheckEqNNN_TTTExtraVar")
49	}
50	if s := fmt.Sprint(onesA == onesB, onesA != twos, onesB != twos); s != "true true true" {
51		println("fail in CheckEqNNN_TTTExtraVar:", s)
52	}
53	if s := fmt.Sprint(onesB == onesX); s != "true" {
54		println("extra var fail in CheckEqNNN_TTTExtraVar")
55	}
56}
57`
58
59func main() {
60	fmt.Print("// run\n\n")
61	fmt.Print("// THIS FILE IS AUTO-GENERATED\n\n")
62	fmt.Print("package main\n\n")
63	fmt.Println(`import "fmt"`)
64
65	types := []string{
66		"int", "int8", "int16", "int32", "int64",
67		"uint", "uint8", "uint16", "uint32", "uint64",
68		"float32", "float64"}
69	tocall := make([]string, 0, 32*len(types))
70	for i := 1; i <= 32; i++ {
71		for _, typ := range types {
72			src := template
73			src = strings.Replace(src, "NNN", fmt.Sprint(i), -1)
74			src = strings.Replace(src, "TTT", strings.Title(typ), -1)
75			src = strings.Replace(src, "ttt", typ, -1)
76			src = strings.Replace(src, "ONES", "1"+strings.Repeat(", 1", i-1), -1)
77			src = strings.Replace(src, "TWOS", "2"+strings.Repeat(", 2", i-1), -1)
78			fmt.Print(src)
79			tocall = append(tocall, fmt.Sprintf("CheckEq%d_%s", i, strings.Title(typ)))
80		}
81	}
82	fmt.Println("func main() {")
83	for _, fun := range tocall {
84		fmt.Printf("\t%s()\n", fun)
85		fmt.Printf("\t%sExtraVar()\n", fun)
86	}
87	fmt.Println("}")
88}
89