robs wednesday bug

R=r
OCL=15327
CL=15327
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index e36eece..1d776d4 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -666,6 +666,8 @@
 /*
  *	walk.c
  */
+void	addtotop(Node*);
+void	gettype(Node*, Node*);
 void	walk(Node*);
 void	walkstate(Node*);
 void	walktype(Node*, int);
diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y
index 15c5637..9d05bf4 100644
--- a/src/cmd/gc/go.y
+++ b/src/cmd/gc/go.y
@@ -247,20 +247,22 @@
 		dodclvar($$, $2);
 
 		$$ = nod(OAS, $$, $4);
+		addtotop($$);
 	}
 |	new_name '=' expr
 	{
-		gettype($3);
+		$$ = nod(OAS, $1, N);
+		gettype($3, $$);
 		defaultlit($3);
 		dodclvar($1, $3->type);
-		$$ = nod(OAS, $1, $3);
+		$$->right = $3;
 	}
 
 constdcl:
 	new_name type '=' expr
 	{
 		Node *c = treecopy($4);
-		gettype(c);
+		gettype(c, N);
 		convlit(c, $2);
 		dodclconst($1, c);
 
@@ -270,7 +272,7 @@
 |	new_name '=' expr
 	{
 		Node *c = treecopy($3);
-		gettype(c);
+		gettype(c, N);
 		dodclconst($1, c);
 
 		lastconst = $3;
@@ -282,7 +284,7 @@
 |	new_name type
 	{
 		Node *c = treecopy(lastconst);
-		gettype(c);
+		gettype(c, N);
 		convlit(c, $2);
 		dodclconst($1, c);
 
@@ -291,7 +293,7 @@
 |	new_name
 	{
 		Node *c = treecopy(lastconst);
-		gettype(c);
+		gettype(c, N);
 		dodclconst($1, c);
 
 		iota += 1;
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 2975149..503f926 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -76,12 +76,14 @@
 }
 
 void
-gettype(Node *n)
+gettype(Node *n, Node *a)
 {
 	if(debug['W'])
 		dump("\nbefore gettype", n);
 	walktype(n, Erv);
-	addtotop(n);
+	if(a == N && addtop != N)
+		fatal("gettype: addtop");
+	addtotop(a);
 	if(debug['W'])
 		dump("after gettype", n);
 }