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,6 +3231,11 @@ static int ...@@ -3231,6 +3231,11 @@ static int
checkmake(Type *t, char *arg, Node *n) checkmake(Type *t, char *arg, Node *n)
{ {
if(n->op == OLITERAL) { if(n->op == OLITERAL) {
switch(n->val.ctype) {
case CTINT:
case CTRUNE:
case CTFLT:
case CTCPLX:
n->val = toint(n->val); n->val = toint(n->val);
if(mpcmpfixc(n->val.u.xval, 0) < 0) { if(mpcmpfixc(n->val.u.xval, 0) < 0) {
yyerror("negative %s argument in make(%T)", arg, t); yyerror("negative %s argument in make(%T)", arg, t);
...@@ -3245,15 +3250,19 @@ checkmake(Type *t, char *arg, Node *n) ...@@ -3245,15 +3250,19 @@ checkmake(Type *t, char *arg, Node *n)
// a redundant "constant NNN overflows int" error. // a redundant "constant NNN overflows int" error.
defaultlit(&n, types[TINT]); defaultlit(&n, types[TINT]);
return 0; return 0;
default:
break;
}
} }
// Defaultlit still necessary for non-constant: n might be 1<<k. if(!isint[n->type->etype] && n->type->etype != TIDEAL) {
defaultlit(&n, types[TINT]);
if(!isint[n->type->etype]) {
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