compiler: give error for non-int arguments to make

This implements a requirement of the language spec.

While we're here fix the value returned by the type method of a
builtin call expression to make, although this doesn't seem to make
any difference anywhere since we lower this to a runtime call before
the determine_types pass anyhow.

There is already a test for this error in the master repository:
test/fixedbugs/issue16949.go. It just hasn't made it into the gccgo
testsuite yet.

Fixes golang/go#16949

Change-Id: Ib1891bcdd889eb082a08ecd712e0cb67cec6a66a
Reviewed-on: https://go-review.googlesource.com/91697
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/go/expressions.cc b/go/expressions.cc
index c90ef8d..715f625 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -7497,6 +7497,11 @@
     {
       len_arg = *parg;
       len_arg->determine_type(&int_context);
+      if (len_arg->type()->integer_type() == NULL)
+	{
+	  go_error_at(len_arg->location(), "non-integer len argument in make");
+	  return Expression::make_error(this->location());
+	}
       if (!this->check_int_value(len_arg, true, &len_small))
 	return Expression::make_error(this->location());
       ++parg;
@@ -7512,6 +7517,11 @@
     {
       cap_arg = *parg;
       cap_arg->determine_type(&int_context);
+      if (cap_arg->type()->integer_type() == NULL)
+	{
+	  go_error_at(cap_arg->location(), "non-integer cap argument in make");
+	  return Expression::make_error(this->location());
+	}
       if (!this->check_int_value(cap_arg, false, &cap_small))
 	return Expression::make_error(this->location());
 
@@ -8306,7 +8316,6 @@
       return Type::make_error_type();
 
     case BUILTIN_NEW:
-    case BUILTIN_MAKE:
       {
 	const Expression_list* args = this->args();
 	if (args == NULL || args->empty())
@@ -8314,6 +8323,14 @@
 	return Type::make_pointer_type(args->front()->type());
       }
 
+    case BUILTIN_MAKE:
+      {
+	const Expression_list* args = this->args();
+	if (args == NULL || args->empty())
+	  return Type::make_error_type();
+	return args->front()->type();
+      }
+
     case BUILTIN_CAP:
     case BUILTIN_COPY:
     case BUILTIN_LEN: