|  | // Copyright 2012 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 case for issue 3106: Better synchronization of | 
|  | // parser after certain syntax errors. | 
|  |  | 
|  | package main | 
|  |  | 
|  | func f() { | 
|  | var m Mutex | 
|  | c := MakeCond(&m) | 
|  | percent := 0 | 
|  | const step = 10 | 
|  | for i := 0; i < 5; i++ { | 
|  | go func() { | 
|  | for { | 
|  | // Emulates some useful work. | 
|  | time.Sleep(1e8) | 
|  | m.Lock() | 
|  | defer | 
|  | if /* ERROR "expected ';', found 'if'" */ percent == 100 { | 
|  | m.Unlock() | 
|  | break | 
|  | } | 
|  | percent++ | 
|  | if percent % step == 0 { | 
|  | //c.Signal() | 
|  | } | 
|  | m.Unlock() | 
|  | } | 
|  | }() | 
|  | } | 
|  | for { | 
|  | m.Lock() | 
|  | if percent == 0 || percent % step != 0 { | 
|  | c.Wait() | 
|  | } | 
|  | fmt.Print(",") | 
|  | if percent == 100 { | 
|  | m.Unlock() | 
|  | break | 
|  | } | 
|  | m.Unlock() | 
|  | } | 
|  | } |