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:
Shenghou Ma 2014-02-23 16:31:48 -05:00
parent d4a9bbef51
commit e33e47e844
2 changed files with 46 additions and 17 deletions

View file

@ -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;
}

View 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"
}