compiler: Don't crash on append with single argument.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 17 Dec 2014 01:04:39 +0000 (01:04 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 17 Dec 2014 01:04:39 +0000 (01:04 +0000)
Instead of allocating an empty slice literal, use a slice
value with a nil pointer.

From-SVN: r218806

gcc/go/gofrontend/expressions.cc

index 9f68f77dc47d706e25f1a0199681e0ff69c650a4..83ee6d923bb2803c5679d554e2d4e6505eae2652 100644 (file)
@@ -6878,7 +6878,11 @@ Builtin_call_expression::do_flatten(Gogo*, Named_object*,
            ++pa)
         {
           if ((*pa)->is_nil_expression())
-            *pa = Expression::make_slice_composite_literal(at, NULL, loc);
+           {
+             Expression* nil = Expression::make_nil(loc);
+             Expression* zero = Expression::make_integer_ul(0, NULL, loc);
+             *pa = Expression::make_slice_value(at, nil, zero, zero, loc);
+           }
           if (!(*pa)->is_variable())
             {
               Temporary_statement* temp =
@@ -14087,7 +14091,8 @@ class Slice_value_expression : public Expression
 int
 Slice_value_expression::do_traverse(Traverse* traverse)
 {
-  if (Expression::traverse(&this->valptr_, traverse) == TRAVERSE_EXIT
+  if (Type::traverse(this->type_, traverse) == TRAVERSE_EXIT
+      || Expression::traverse(&this->valptr_, traverse) == TRAVERSE_EXIT
       || Expression::traverse(&this->len_, traverse) == TRAVERSE_EXIT
       || Expression::traverse(&this->cap_, traverse) == TRAVERSE_EXIT)
     return TRAVERSE_EXIT;