From e33e47e844cdce5a5dedfd0c1c72e480f12db6f1 Mon Sep 17 00:00:00 2001
From: Shenghou Ma <minux.ma@gmail.com>
Date: Sun, 23 Feb 2014 16:31:48 -0500
Subject: [PATCH] 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
---
 src/cmd/gc/typecheck.c      | 43 ++++++++++++++++++++++---------------
 test/fixedbugs/issue7223.go | 20 +++++++++++++++++
 2 files changed, 46 insertions(+), 17 deletions(-)
 create mode 100644 test/fixedbugs/issue7223.go

diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c
index ac2e8a4559..05efab4040 100644
--- a/src/cmd/gc/typecheck.c
+++ b/src/cmd/gc/typecheck.c
@@ -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;
-		}
-		if(mpcmpfixfix(n->val.u.xval, maxintval[TINT]) > 0) {
-			yyerror("%s argument too large 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;
 		}
-		
-		// 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;
 }
 
diff --git a/test/fixedbugs/issue7223.go b/test/fixedbugs/issue7223.go
new file mode 100644
index 0000000000..c5955d5994
--- /dev/null
+++ b/test/fixedbugs/issue7223.go
@@ -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"
+}
-- 
2.30.9