|  | // run | 
|  |  | 
|  | // Copyright 2014 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // Test order of calls to builtin functions. | 
|  | // Discovered during CL 144530045 review. | 
|  |  | 
|  | package main | 
|  |  | 
|  | func main() { | 
|  | // append | 
|  | { | 
|  | x := make([]int, 0) | 
|  | f := func() int { x = make([]int, 2); return 2 } | 
|  | a, b, c := append(x, 1), f(), append(x, 1) | 
|  | if len(a) != 1 || len(c) != 3 { | 
|  | bug() | 
|  | println("append call not ordered:", len(a), b, len(c)) | 
|  | } | 
|  | } | 
|  |  | 
|  | // cap | 
|  | { | 
|  | x := make([]int, 1) | 
|  | f := func() int { x = make([]int, 3); return 2 } | 
|  | a, b, c := cap(x), f(), cap(x) | 
|  | if a != 1 || c != 3 { | 
|  | bug() | 
|  | println("cap call not ordered:", a, b, c) | 
|  | } | 
|  | } | 
|  |  | 
|  | // complex | 
|  | { | 
|  | x := 1.0 | 
|  | f := func() int { x = 3; return 2 } | 
|  | a, b, c := complex(x, 0), f(), complex(x, 0) | 
|  | if real(a) != 1 || real(c) != 3 { | 
|  | bug() | 
|  | println("complex call not ordered:", a, b, c) | 
|  | } | 
|  | } | 
|  |  | 
|  | // copy | 
|  | { | 
|  | tmp := make([]int, 100) | 
|  | x := make([]int, 1) | 
|  | f := func() int { x = make([]int, 3); return 2 } | 
|  | a, b, c := copy(tmp, x), f(), copy(tmp, x) | 
|  | if a != 1 || c != 3 { | 
|  | bug() | 
|  | println("copy call not ordered:", a, b, c) | 
|  | } | 
|  | } | 
|  |  | 
|  | // imag | 
|  | { | 
|  | x := 1i | 
|  | f := func() int { x = 3i; return 2 } | 
|  | a, b, c := imag(x), f(), imag(x) | 
|  | if a != 1 || c != 3 { | 
|  | bug() | 
|  | println("imag call not ordered:", a, b, c) | 
|  | } | 
|  | } | 
|  |  | 
|  | // len | 
|  | { | 
|  | x := make([]int, 1) | 
|  | f := func() int { x = make([]int, 3); return 2 } | 
|  | a, b, c := len(x), f(), len(x) | 
|  | if a != 1 || c != 3 { | 
|  | bug() | 
|  | println("len call not ordered:", a, b, c) | 
|  | } | 
|  | } | 
|  |  | 
|  | // make | 
|  | { | 
|  | x := 1 | 
|  | f := func() int { x = 3; return 2 } | 
|  | a, b, c := make([]int, x), f(), make([]int, x) | 
|  | if len(a) != 1 || len(c) != 3 { | 
|  | bug() | 
|  | println("make call not ordered:", len(a), b, len(c)) | 
|  | } | 
|  | } | 
|  |  | 
|  | // real | 
|  | { | 
|  | x := 1 + 0i | 
|  | f := func() int { x = 3; return 2 } | 
|  | a, b, c := real(x), f(), real(x) | 
|  | if a != 1 || c != 3 { | 
|  | bug() | 
|  | println("real call not ordered:", a, b, c) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | var bugged = false | 
|  |  | 
|  | func bug() { | 
|  | if !bugged { | 
|  | println("BUG") | 
|  | bugged = true | 
|  | } | 
|  | } |