shithub: mc

Download patch

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++)