ref: 86f01268aef860fafca5e93913e657efc58b240e
parent: 674df8f71072a8ee390e55e2659e9559d6acf4b1
author: Ori Bernstein <[email protected]>
date: Fri Jun 29 09:09:43 EDT 2012
Create nodes for match statements correctly.
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -561,7 +561,7 @@
;
matchstmt: Tmatch exprln matches Tendblk
- {$$ = NULL;}
+ {$$ = mkmatchstmt($1->line, $2, $3.nl, $3.nn);}
;
matches : match
@@ -573,11 +573,11 @@
lappend(&$$.nl, &$$.nn, $2);}
;
-match : pat Tcolon block {$$ = NULL;}
+match : pat Tcolon block {$$ = mkmatch($1->line, $1, $3);}
| Tendln {$$ = NULL;}
;
-pat : literal {$$ = NULL;}
+pat : literal {$$ = $1;}
;
block : blockbody Tendblk
--- a/parse/infer.c
+++ b/parse/infer.c
@@ -688,7 +688,8 @@
case Nmatchstmt:
infernode(n->matchstmt.val, NULL, sawret);
for (i = 0; i < n->matchstmt.nmatches; i++)
- infernode(n->matchstmt.matches[i], NULL, sawret);
+ infernode(n->matchstmt.matches[i], ret, sawret);
+ break;
case Nmatch:
infernode(n->match.pat, NULL, sawret);
infernode(n->match.block, ret, sawret);
@@ -868,9 +869,11 @@
typesub(n->matchstmt.val);
for (i = 0; i < n->matchstmt.nmatches; i++)
typesub(n->matchstmt.matches[i]);
+ break;
case Nmatch:
typesub(n->match.pat);
typesub(n->match.block);
+ break;
case Nexpr:
settype(n, tyfix(n, type(n)));
for (i = 0; i < n->expr.nargs; i++)