| // 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. | |
| // This file contains tests for the copylock checker's | |
| // range statement analysis. | |
| package testdata | |
| import "sync" | |
| func rangeMutex() { | |
| var mu sync.Mutex | |
| var i int | |
| var s []sync.Mutex | |
| for range s { | |
| } | |
| for i = range s { | |
| } | |
| for i := range s { | |
| } | |
| for i, _ = range s { | |
| } | |
| for i, _ := range s { | |
| } | |
| for _, mu = range s { // ERROR "range var mu copies lock: sync.Mutex" | |
| } | |
| for _, m := range s { // ERROR "range var m copies lock: sync.Mutex" | |
| } | |
| for i, mu = range s { // ERROR "range var mu copies lock: sync.Mutex" | |
| } | |
| for i, m := range s { // ERROR "range var m copies lock: sync.Mutex" | |
| } | |
| var a [3]sync.Mutex | |
| for _, m := range a { // ERROR "range var m copies lock: sync.Mutex" | |
| } | |
| var m map[sync.Mutex]sync.Mutex | |
| for k := range m { // ERROR "range var k copies lock: sync.Mutex" | |
| } | |
| for mu, _ = range m { // ERROR "range var mu copies lock: sync.Mutex" | |
| } | |
| for k, _ := range m { // ERROR "range var k copies lock: sync.Mutex" | |
| } | |
| for _, mu = range m { // ERROR "range var mu copies lock: sync.Mutex" | |
| } | |
| for _, v := range m { // ERROR "range var v copies lock: sync.Mutex" | |
| } | |
| var c chan sync.Mutex | |
| for range c { | |
| } | |
| for mu = range c { // ERROR "range var mu copies lock: sync.Mutex" | |
| } | |
| for v := range c { // ERROR "range var v copies lock: sync.Mutex" | |
| } | |
| // Test non-idents in range variables | |
| var t struct { | |
| i int | |
| mu sync.Mutex | |
| } | |
| for t.i, t.mu = range s { // ERROR "range var t.mu copies lock: sync.Mutex" | |
| } | |
| } |