1// errorcheck
2
3// Copyright 2015 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// Check that we correctly construct (and report errors)
8// for unary expressions of the form <-x where we only
9// know after parsing x whether <-x is a receive operation
10// or a channel type.
11
12package n
13
14func f() {
15	// test case from issue 13273
16	<-chan int((chan int)(nil))
17
18	<-chan int(nil)
19	<-chan chan int(nil)
20	<-chan chan chan int(nil)
21	<-chan chan chan chan int(nil)
22	<-chan chan chan chan chan int(nil)
23
24	<-chan<-chan int(nil)
25	<-chan<-chan<-chan int(nil)
26	<-chan<-chan<-chan<-chan int(nil)
27	<-chan<-chan<-chan<-chan<-chan int(nil)
28
29	<-chan (<-chan int)(nil)
30	<-chan (<-chan (<-chan int))(nil)
31	<-chan (<-chan (<-chan (<-chan int)))(nil)
32	<-chan (<-chan (<-chan (<-chan (<-chan int))))(nil)
33
34	<-(<-chan int)(nil)
35	<-(<-chan chan int)(nil)
36	<-(<-chan chan chan int)(nil)
37	<-(<-chan chan chan chan int)(nil)
38	<-(<-chan chan chan chan chan int)(nil)
39
40	<-(<-chan<-chan int)(nil)
41	<-(<-chan<-chan<-chan int)(nil)
42	<-(<-chan<-chan<-chan<-chan int)(nil)
43	<-(<-chan<-chan<-chan<-chan<-chan int)(nil)
44
45	<-(<-chan (<-chan int))(nil)
46	<-(<-chan (<-chan (<-chan int)))(nil)
47	<-(<-chan (<-chan (<-chan (<-chan int))))(nil)
48	<-(<-chan (<-chan (<-chan (<-chan (<-chan int)))))(nil)
49
50	type _ <-<-chan int // ERROR "unexpected <-, expected chan|expected .*chan.*"
51	<-<-chan int // ERROR "unexpected <-, expected chan|expecting {" (new parser: same error as for type decl)
52
53	type _ <-chan<-int // ERROR "unexpected int, expected chan|expected .*chan.*|expected chan|expected .*;.* or .*}.* or newline"
54	<-chan<-int // ERROR "unexpected int, expected chan|expecting {" (new parser: same error as for type decl)
55}
56