get rid of static/dynamic array distinction

R=r
OCL=14634
CL=14634
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index 2db8c32..54c437d 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -481,7 +481,7 @@
 	if(n->op != ODCLFIELD || n->type == T)
 		fatal("stotype: oops %N\n", n);
 
-	if(n->type->etype == TDARRAY)
+	if(n->type->etype == TARRAY && n->type->bound < 0)
 		yyerror("type of a structure field cannot be an open array");
 
 	f = typ(TFIELD);
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 57f823d..226952f 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -147,18 +147,16 @@
 		break;
 
 	case TARRAY:
-	case TDARRAY:
 		reexport(t->type);
 
 		/* type 2 */
 		Bprint(bout, "\ttype ");
 		if(s->export != 0)
 			Bprint(bout, "!");
-		if(et == TDARRAY) {
+		if(t->bound >= 0)
+			Bprint(bout, "%lS [%lud] %lS\n", s, t->bound, t->type->sym);
+		else
 			Bprint(bout, "%lS [] %lS\n", s, t->type->sym);
-			break;
-		}
-		Bprint(bout, "%lS [%lud] %lS\n", s, t->bound, t->type->sym);
 		break;
 
 	case TPTR32:
@@ -522,13 +520,10 @@
 	Type *t;
 	Sym *s;
 
-	if(b == nil) {
-		t = typ(TDARRAY);
-		t->dbound = N;
-	} else {
-		t = typ(TARRAY);
+	t = typ(TARRAY);
+	t->bound = -1;
+	if(b != nil)
 		t->bound = mpgetfix(b->u.xval);
-	}
 	s = pkglookup(st->sym->name, st->psym->name);
 	t->type = s->otype;
 
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 02e1581..4237278 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -140,8 +140,7 @@
 	vlong	argwid;
 
 	// TARRAY
-	int32	bound;
-	Node*	dbound;
+	int32	bound;		// negative is dynamic array
 };
 #define	T	((Type*)0)
 
@@ -303,7 +302,7 @@
 
 	TFUNC,
 	TARRAY,
-	TDARRAY,
+	T_old_DARRAY,
 	TSTRUCT,
 	TCHAN,
 	TMAP,
@@ -558,6 +557,8 @@
 Type*	aindex(Node*, Type*);
 int	isnil(Node*);
 int	isptrto(Type*, int);
+int	isptrarray(Type*);
+int	isptrdarray(Type*);
 int	isinter(Type*);
 int	isbytearray(Type*);
 int	eqtype(Type*, Type*, int);
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 66e20b8..b925e50 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -376,38 +376,28 @@
 	Type *r;
 	int bound;
 
+	bound = -1;	// open bound
 	walktype(b, Erv);
 	switch(whatis(b)) {
 	default:	// variable bound
-		walktype(b, Erv);
-		if(b->type != T && isint[b->type->etype])
-			goto dyn;
 		yyerror("array bound must be an integer expression");
-		bound = 0;
 		break;
 
 	case Wnil:	// open bound
-		goto dyn;
+		break;
 
 	case Wlitint:	// fixed bound
 		bound = mpgetfix(b->val.u.xval);
+		if(bound < 0)
+			yyerror("array bound must be non negative");
 		break;
 	}
 
 	// fixed array
 	r = typ(TARRAY);
 	r->type = t;
-	r->dbound = b;
 	r->bound = bound;
 	return r;
-
-dyn:
-	// dynamic array
-	r = typ(TDARRAY);
-	r->type = t;
-	r->dbound = b;
-	r->bound = 0;
-	return r;
 }
 
 void
@@ -806,7 +796,7 @@
 	[TPTR64]	= "PTR64",
 	[TFUNC]		= "FUNC",
 	[TARRAY]	= "ARRAY",
-	[TDARRAY]	= "DARRAY",
+//	[TDARRAY]	= "DARRAY",
 	[TSTRUCT]	= "STRUCT",
 	[TCHAN]		= "CHAN",
 	[TMAP]		= "MAP",
@@ -1008,14 +998,10 @@
 		break;
 
 	case TARRAY:
-		snprint(buf1, sizeof(buf1), "[%ld]%T", t->bound, t->type);
-		strncat(buf, buf1, sizeof(buf));
-		break;
-
-	case TDARRAY:
-		snprint(buf1, sizeof(buf1), "[]%T", t->type);
-		if(t->dbound != N)
-			snprint(buf1, sizeof(buf1), "[<expr>]%T", t->type);
+		if(t->bound >= 0)
+			snprint(buf1, sizeof(buf1), "[%ld]%T", t->bound, t->type);
+		else
+			snprint(buf1, sizeof(buf1), "[]%T", t->type);
 		strncat(buf, buf1, sizeof(buf));
 		break;
 
@@ -1217,6 +1203,24 @@
 }
 
 int
+isptrarray(Type *t)
+{
+	if(isptrto(t, TARRAY))
+		if(t->type->bound >= 0)
+			return 1;
+	return 0;
+}
+
+int
+isptrdarray(Type *t)
+{
+	if(isptrto(t, TARRAY))
+		if(t->type->bound < 0)
+			return 1;
+	return 0;
+}
+
+int
 isinter(Type *t)
 {
 	if(t != T && t->etype == TINTER)
@@ -1324,7 +1328,6 @@
 	case TPTR64:
 	case TCHAN:
 	case TARRAY:
-	case TDARRAY:
 		stp = &st->type;
 		goto loop;
 
@@ -1395,7 +1398,6 @@
 	case TPTR64:
 	case TCHAN:
 	case TARRAY:
-	case TDARRAY:
 		nt = shallow(t);
 		nt->type = deep(t->type);
 		break;
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 5b2fc97..23ec5db 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -430,7 +430,7 @@
 		}
 
 		// convert dynamic to static generated by ONEW
-		if(isptrto(t, TARRAY) && isptrto(l->type, TDARRAY))
+		if(isptrarray(t) && isptrdarray(l->type))
 			goto ret;
 
 //		if(t->etype == TARRAY) {
@@ -560,10 +560,10 @@
 			goto badt;
 		case TSTRING:
 		case TMAP:
-		case TDARRAY:
 			break;
 		case TARRAY:
-			nodconst(n, types[TINT32], t->bound);
+			if(t->bound >= 0)
+				nodconst(n, types[TINT32], t->bound);
 			break;
 		}
 		n->type = types[TINT32];
@@ -582,10 +582,9 @@
 		switch(t->etype) {
 		default:
 			goto badt;
-		case TDARRAY:
-			break;
 		case TARRAY:
-			nodconst(n, types[TINT32], t->bound);
+			if(t->bound >= 0)
+				nodconst(n, types[TINT32], t->bound);
 			break;
 		}
 		n->type = types[TINT32];
@@ -652,7 +651,6 @@
 				*n = *mapop(n, top);
 			break;
 
-		case TDARRAY:
 		case TARRAY:
 			// right side must be an int
 			if(n->right->type == T) {
@@ -704,7 +702,7 @@
 			*n = *stringop(n, top);
 			goto ret;
 		}
-		if(t->etype == TDARRAY || t->etype == TARRAY) {
+		if(t->etype == TARRAY) {
 			*n = *arrayop(n, top);
 			goto ret;
 		}
@@ -1435,8 +1433,8 @@
 		if(isptrto(t1, TSTRUCT))
 			return 1;
 
-	if(isptrto(t1, TDARRAY))
-		if(isptrto(t2, TARRAY))
+	if(isptrdarray(t1))
+		if(isptrarray(t2))
 			return 1;
 	return 0;
 }
@@ -1542,7 +1540,6 @@
 		r = chanop(n, Erv);
 		return r;
 
-	case TDARRAY:
 	case TARRAY:
 		r = arrayop(n, Erv);
 		return r;
@@ -2134,7 +2131,7 @@
 		return T;
 	}
 
-	if(t->etype != TDARRAY && t->etype != TARRAY) {
+	if(t->etype != TARRAY) {
 		fatal("fixarray: %lT not array", tm);
 		return T;
 	}
@@ -2172,15 +2169,19 @@
 		r = a;
 
 		a = listfirst(&save, &n->left);		// max
+		a = listnext(&save);
 		if(a == N)
 			a = nodintconst(0);
 		a = nod(OCONV, a, N);
 		a->type = types[TUINT32];
 		r = list(a, r);
 
-		a = t->dbound;				// nel
-		if(a == N)
+		a = listfirst(&save, &n->left);		// nel
+		if(a == N) {
+			if(t->bound < 0)
+				yyerror("new open array must have size");
 			a = nodintconst(t->bound);
+		}
 		a = nod(OCONV, a, N);
 		a->type = types[TUINT32];
 		r = list(a, r);
@@ -2221,7 +2222,7 @@
 		return n;
 
 	case OSLICE:
-		if(isptrto(n->left->type, TARRAY))
+		if(isptrarray(n->left->type))
 			goto slicestatic;
 
 		// arrayslices(old *[]any, lb uint32, hb uint32, width uint32) (ary *[]any)
@@ -2381,7 +2382,7 @@
 		return n;
 	}
 
-	if(isptrto(lt, TDARRAY) && isptrto(rt, TARRAY)) {
+	if(isptrdarray(lt) && isptrarray(rt)) {
 		if(!eqtype(lt->type->type, rt->type->type, 0))
 			goto bad;
 		*n = *arrayop(n, Etop);