compiler: give error for non-int arguments to make
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 5 Feb 2018 01:46:07 +0000 (01:46 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 5 Feb 2018 01:46:07 +0000 (01:46 +0000)
    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

    Reviewed-on: https://go-review.googlesource.com/91697

From-SVN: r257376

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index a89373199c09e08aa8947a5a13769e36cca3c3e4..edfec3911d9a5cde6f272905efde3f230261e6e9 100644 (file)
@@ -1,4 +1,4 @@
-0c8c4fca4b52bc2323561a432436af5343e0f7b4
+312af623f48633989e9eb6e559ede84a23998ece
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index c90ef8de79578ae683fead9cd643ca76e7060cab..715f6255d48283d9d3634ca1334fc3cf9f171ac2 100644 (file)
@@ -7497,6 +7497,11 @@ Builtin_call_expression::lower_make(Statement_inserter* inserter)
     {
       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 @@ Builtin_call_expression::lower_make(Statement_inserter* inserter)
     {
       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 @@ Builtin_call_expression::do_type()
       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 @@ Builtin_call_expression::do_type()
        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: