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