mirror of
https://github.com/golang/go
synced 2024-11-25 05:57:57 -07:00
gc: disallow [...][...]int{{1,2,3}}
Fixes #1600. R=ken2 CC=golang-dev https://golang.org/cl/4819045
This commit is contained in:
parent
e5437ab065
commit
bf899befdb
@ -531,6 +531,7 @@ enum
|
|||||||
Eindir = 1<<8, // indirecting through expression
|
Eindir = 1<<8, // indirecting through expression
|
||||||
Eaddr = 1<<9, // taking address of expression
|
Eaddr = 1<<9, // taking address of expression
|
||||||
Eproc = 1<<10, // inside a go statement
|
Eproc = 1<<10, // inside a go statement
|
||||||
|
Ecomplit = 1<<11, // type in composite literal
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BITS 5
|
#define BITS 5
|
||||||
|
@ -239,6 +239,8 @@ reswitch:
|
|||||||
t->bound = -1; // slice
|
t->bound = -1; // slice
|
||||||
} else if(l->op == ODDD) {
|
} else if(l->op == ODDD) {
|
||||||
t->bound = -100; // to be filled in
|
t->bound = -100; // to be filled in
|
||||||
|
if(!(top&Ecomplit))
|
||||||
|
yyerror("use of [...] array outside of array literal");
|
||||||
} else {
|
} else {
|
||||||
l = typecheck(&n->left, Erv);
|
l = typecheck(&n->left, Erv);
|
||||||
switch(consttype(l)) {
|
switch(consttype(l)) {
|
||||||
@ -1342,11 +1344,6 @@ ret:
|
|||||||
case TNIL:
|
case TNIL:
|
||||||
case TBLANK:
|
case TBLANK:
|
||||||
break;
|
break;
|
||||||
case TARRAY:
|
|
||||||
if(t->bound == -100) {
|
|
||||||
yyerror("use of [...] array outside of array literal");
|
|
||||||
t->bound = 1;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
checkwidth(t);
|
checkwidth(t);
|
||||||
}
|
}
|
||||||
@ -1971,7 +1968,7 @@ typecheckcomplit(Node **np)
|
|||||||
}
|
}
|
||||||
|
|
||||||
setlineno(n->right);
|
setlineno(n->right);
|
||||||
l = typecheck(&n->right /* sic */, Etype);
|
l = typecheck(&n->right /* sic */, Etype|Ecomplit);
|
||||||
if((t = l->type) == T)
|
if((t = l->type) == T)
|
||||||
goto error;
|
goto error;
|
||||||
nerr = nerrors;
|
nerr = nerrors;
|
||||||
@ -2039,7 +2036,7 @@ typecheckcomplit(Node **np)
|
|||||||
l->right->right = typenod(pushtype);
|
l->right->right = typenod(pushtype);
|
||||||
typecheck(&l->right, Erv);
|
typecheck(&l->right, Erv);
|
||||||
defaultlit(&l->right, t->type);
|
defaultlit(&l->right, t->type);
|
||||||
l->right = assignconv(l->right, t->type, "array index");
|
l->right = assignconv(l->right, t->type, "array element");
|
||||||
}
|
}
|
||||||
if(t->bound == -100)
|
if(t->bound == -100)
|
||||||
t->bound = len;
|
t->bound = len;
|
||||||
|
@ -44,4 +44,6 @@ func bad(args ...int) {
|
|||||||
_ = unsafe.Pointer(&x...) // ERROR "[.][.][.]"
|
_ = unsafe.Pointer(&x...) // ERROR "[.][.][.]"
|
||||||
_ = unsafe.Sizeof(x...) // ERROR "[.][.][.]"
|
_ = unsafe.Sizeof(x...) // ERROR "[.][.][.]"
|
||||||
_ = [...]byte("foo") // ERROR "[.][.][.]"
|
_ = [...]byte("foo") // ERROR "[.][.][.]"
|
||||||
|
_ = [...][...]int{{1,2,3},{4,5,6}} // ERROR "[.][.][.]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user