mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
cmd/gc: diagnose "make([]T, non-integer)" correctly.
Fixes #7223. LGTM=rsc R=golang-codereviews, gobot, rsc CC=golang-codereviews https://golang.org/cl/63040043
This commit is contained in:
parent
d4a9bbef51
commit
e33e47e844
2 changed files with 46 additions and 17 deletions
|
@ -3231,29 +3231,38 @@ static int
|
|||
checkmake(Type *t, char *arg, Node *n)
|
||||
{
|
||||
if(n->op == OLITERAL) {
|
||||
n->val = toint(n->val);
|
||||
if(mpcmpfixc(n->val.u.xval, 0) < 0) {
|
||||
yyerror("negative %s argument in make(%T)", arg, t);
|
||||
return -1;
|
||||
switch(n->val.ctype) {
|
||||
case CTINT:
|
||||
case CTRUNE:
|
||||
case CTFLT:
|
||||
case CTCPLX:
|
||||
n->val = toint(n->val);
|
||||
if(mpcmpfixc(n->val.u.xval, 0) < 0) {
|
||||
yyerror("negative %s argument in make(%T)", arg, t);
|
||||
return -1;
|
||||
}
|
||||
if(mpcmpfixfix(n->val.u.xval, maxintval[TINT]) > 0) {
|
||||
yyerror("%s argument too large in make(%T)", arg, t);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Delay defaultlit until after we've checked range, to avoid
|
||||
// a redundant "constant NNN overflows int" error.
|
||||
defaultlit(&n, types[TINT]);
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if(mpcmpfixfix(n->val.u.xval, maxintval[TINT]) > 0) {
|
||||
yyerror("%s argument too large in make(%T)", arg, t);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Delay defaultlit until after we've checked range, to avoid
|
||||
// a redundant "constant NNN overflows int" error.
|
||||
defaultlit(&n, types[TINT]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Defaultlit still necessary for non-constant: n might be 1<<k.
|
||||
defaultlit(&n, types[TINT]);
|
||||
|
||||
if(!isint[n->type->etype]) {
|
||||
if(!isint[n->type->etype] && n->type->etype != TIDEAL) {
|
||||
yyerror("non-integer %s argument in make(%T) - %T", arg, t, n->type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Defaultlit still necessary for non-constant: n might be 1<<k.
|
||||
defaultlit(&n, types[TINT]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
20
test/fixedbugs/issue7223.go
Normal file
20
test/fixedbugs/issue7223.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2014 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package main
|
||||
|
||||
var bits1 uint = 10
|
||||
const bits2 uint = 10
|
||||
|
||||
func main() {
|
||||
_ = make([]byte, 1<<bits1)
|
||||
_ = make([]byte, 1<<bits2)
|
||||
_ = make([]byte, nil) // ERROR "non-integer.*len"
|
||||
_ = make([]byte, nil, 2) // ERROR "non-integer.*len"
|
||||
_ = make([]byte, 1, nil) // ERROR "non-integer.*cap"
|
||||
_ = make([]byte, true) // ERROR "non-integer.*len"
|
||||
_ = make([]byte, "abc") // ERROR "non-integer.*len"
|
||||
}
|
Loading…
Reference in a new issue