Commit e33e47e8 authored by Shenghou Ma's avatar Shenghou Ma

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
parent d4a9bbef
...@@ -3231,29 +3231,38 @@ static int ...@@ -3231,29 +3231,38 @@ static int
checkmake(Type *t, char *arg, Node *n) checkmake(Type *t, char *arg, Node *n)
{ {
if(n->op == OLITERAL) { if(n->op == OLITERAL) {
n->val = toint(n->val); switch(n->val.ctype) {
if(mpcmpfixc(n->val.u.xval, 0) < 0) { case CTINT:
yyerror("negative %s argument in make(%T)", arg, t); case CTRUNE:
return -1; case CTFLT:
} case CTCPLX:
if(mpcmpfixfix(n->val.u.xval, maxintval[TINT]) > 0) { n->val = toint(n->val);
yyerror("%s argument too large in make(%T)", arg, t); if(mpcmpfixc(n->val.u.xval, 0) < 0) {
return -1; 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;
} }
// 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); yyerror("non-integer %s argument in make(%T) - %T", arg, t, n->type);
return -1; return -1;
} }
// Defaultlit still necessary for non-constant: n might be 1<<k.
defaultlit(&n, types[TINT]);
return 0; return 0;
} }
......
// 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"
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment