Home | History | Annotate | Download | only in fixedbugs
      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 
     10 package main
     11 
     12 import (
     13 	"fmt"
     14 	"strings"
     15 )
     16 
     17 const template = `
     18 func 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 
     36 func 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 
     59 func 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