summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/parser.nim22
-rw-r--r--tests/parser/tprocexprasstmt.nim3
2 files changed, 18 insertions, 7 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 22d3b8595..dbfbec733 100644
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -1157,7 +1157,6 @@ proc parseProcExpr(p: var Parser; isExpr: bool; kind: TNodeKind): PNode =
   #| routineExpr = ('proc' | 'func' | 'iterator') paramListColon pragma? ('=' COMMENT? stmt)?
   # either a proc type or a anonymous proc
   let info = parLineInfo(p)
-  getTok(p)
   let hasSignature = p.tok.tokType in {tkParLe, tkColon} and p.tok.indent < 0
   let params = parseParamList(p)
   let pragmas = optPragmas(p)
@@ -1168,7 +1167,7 @@ proc parseProcExpr(p: var Parser; isExpr: bool; kind: TNodeKind): PNode =
       params = params, name = p.emptyNode, pattern = p.emptyNode,
       genericParams = p.emptyNode, pragmas = pragmas, exceptions = p.emptyNode)
   else:
-    result = newNodeI(nkProcTy, info)
+    result = newNodeI(if kind == nkIteratorDef: nkIteratorTy else: nkProcTy, info)
     if hasSignature:
       result.add(params)
       if kind == nkFuncDef:
@@ -1309,12 +1308,15 @@ proc primary(p: var Parser, mode: PrimaryMode): PNode =
 
   case p.tok.tokType
   of tkTuple: result = parseTuple(p, mode == pmTypeDef)
-  of tkProc: result = parseProcExpr(p, mode notin {pmTypeDesc, pmTypeDef}, nkLambda)
-  of tkFunc: result = parseProcExpr(p, mode notin {pmTypeDesc, pmTypeDef}, nkFuncDef)
-  of tkIterator:
+  of tkProc:
+    getTok(p)
     result = parseProcExpr(p, mode notin {pmTypeDesc, pmTypeDef}, nkLambda)
-    if result.kind == nkLambda: result.transitionSonsKind(nkIteratorDef)
-    else: result.transitionSonsKind(nkIteratorTy)
+  of tkFunc:
+    getTok(p)
+    result = parseProcExpr(p, mode notin {pmTypeDesc, pmTypeDef}, nkFuncDef)
+  of tkIterator:
+    getTok(p)
+    result = parseProcExpr(p, mode notin {pmTypeDesc, pmTypeDef}, nkIteratorDef)
   of tkEnum:
     if mode == pmTypeDef:
       prettySection:
@@ -1832,6 +1834,12 @@ proc parseRoutine(p: var Parser, kind: TNodeKind): PNode =
   result = newNodeP(kind, p)
   getTok(p)
   optInd(p, result)
+  if kind in {nkProcDef, nkLambda, nkIteratorDef, nkFuncDef} and
+      p.tok.tokType notin {tkSymbol, tokKeywordLow..tokKeywordHigh, tkAccent}:
+    # no name; lambda or proc type
+    # in every context that we can parse a routine, we can also parse these
+    result = parseProcExpr(p, true, if kind == nkProcDef: nkLambda else: kind)
+    return
   result.add(identVis(p))
   if p.tok.tokType == tkCurlyLe and p.validInd: result.add(p.parsePattern)
   else: result.add(p.emptyNode)
diff --git a/tests/parser/tprocexprasstmt.nim b/tests/parser/tprocexprasstmt.nim
new file mode 100644
index 000000000..a02dde6f6
--- /dev/null
+++ b/tests/parser/tprocexprasstmt.nim
@@ -0,0 +1,3 @@
+func r(): auto =
+  func(): int = 2
+discard r()()
tter Kartik K. Agaram <vc@akkartik.com> 2015-04-22 22:40:46 -0700 1146 - yet another out-of-bounds access' href='/akkartik/mu/commit/cpp/035call?h=hlt&id=f1e953d0cf7f5669a55b1337a87e646c1262d139'>f1e953d0 ^
1ead3562 ^
bc643692 ^

f1e953d0 ^
d7494165 ^

bc643692 ^

d7494165 ^
bc643692 ^


f1e953d0 ^
ec926027 ^




363be37f ^
ac0e9db5 ^
ca01193d ^
363be37f ^
50eab110 ^



1fa53058 ^


ec926027 ^
31401373 ^
ec926027 ^



ca01193d ^
363be37f ^
69e14325 ^
5eb49929 ^
e2240eb4 ^

363be37f ^
77cdc6d0 ^

dd2e01e4 ^
77cdc6d0 ^

31401373 ^
d72f3799 ^
0b0cfb6f ^
7284d503 ^
67573caf ^




7284d503 ^

ac0e9db5 ^

31401373 ^
67573caf ^
ec926027 ^
7c8493b3 ^

31401373 ^
795f5244 ^
ec926027 ^
dcfca05e ^

31401373 ^
1fa53058 ^



795f5244 ^
dcfca05e ^
f89378d5 ^
2142ccfc ^

f3760b0f ^
1b76245c ^
2142ccfc ^

f1a6f323 ^
9cf71627 ^
5810092d ^
513bfed8 ^




2142ccfc ^
77cdc6d0 ^

dd2e01e4 ^
77cdc6d0 ^

012d2ee1 ^
af085cf6 ^




3eeea0a2 ^

9cf71627 ^
5f98a10c ^

1ead3562 ^
2cb36cd0 ^

5f98a10c ^
2cb36cd0 ^

5f98a10c ^
1ead3562 ^
2cb36cd0 ^

5f98a10c ^
2cb36cd0 ^
7284d503 ^
64cf0a59 ^
69e14325 ^


df8bb4c3 ^
f6d47435 ^
5eb49929 ^
31401373 ^
795f5244 ^
5eb49929 ^

f1e953d0 ^
ec926027 ^

ac0e9db5 ^
2e8c5d39 ^
77cdc6d0 ^
dd2e01e4 ^
77cdc6d0 ^


31401373 ^
b75e94b3 ^
9fdda88b ^
5f98a10c ^
8eff7919 ^
f6d47435 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167