OSDN Git Service

compiler: Fix type checking for append.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Feb 2012 21:30:48 +0000 (21:30 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Feb 2012 21:30:48 +0000 (21:30 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183816 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/expressions.cc

index 5563dde..25b7987 100644 (file)
@@ -7657,7 +7657,10 @@ Builtin_call_expression::do_lower(Gogo* gogo, Named_object* function,
            this->set_is_error();
            return this;
          }
-       this->lower_varargs(gogo, function, inserter, slice_type, 2);
+       Type* element_type = slice_type->array_type()->element_type();
+       this->lower_varargs(gogo, function, inserter,
+                           Type::make_array_type(element_type, NULL),
+                           2);
       }
       break;
 
@@ -8624,16 +8627,20 @@ Builtin_call_expression::do_check_types(Gogo*)
              break;
          }
 
+       // The language says that the second argument must be
+       // assignable to a slice of the element type of the first
+       // argument.  We already know the first argument is a slice
+       // type.
+       Array_type* at = args->front()->type()->array_type();
+       Type* arg2_type = Type::make_array_type(at->element_type(), NULL);
        std::string reason;
-       if (!Type::are_assignable(args->front()->type(), args->back()->type(),
-                                 &reason))
+       if (!Type::are_assignable(arg2_type, args->back()->type(), &reason))
          {
            if (reason.empty())
-             this->report_error(_("arguments 1 and 2 have different types"));
+             this->report_error(_("argument 2 has invalid type"));
            else
              {
-               error_at(this->location(),
-                        "arguments 1 and 2 have different types (%s)",
+               error_at(this->location(), "argument 2 has invalid type (%s)",
                         reason.c_str());
                this->set_is_error();
              }