go-gcc.cc (constructor_expression): Don't initialize zero-sized fields, just evaluate...
authorChris Manghane <cmang@google.com>
Tue, 6 Jan 2015 18:57:06 +0000 (18:57 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 6 Jan 2015 18:57:06 +0000 (18:57 +0000)
* go-gcc.cc (constructor_expression): Don't initialize zero-sized
fields, just evaluate the values for side effects.

From-SVN: r219262

gcc/go/ChangeLog
gcc/go/go-gcc.cc

index 93a62e165d1a14820d654e8c331f1601b9c84b4e..dba995c1f0ea49627a970deb597c9edc15448a47 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-06  Chris Manghane  <cmang@google.com>
+
+       * go-gcc.cc (constructor_expression): Don't initialize zero-sized
+       fields, just evaluate the values for side effects.
+
 2015-01-05  Jakub Jelinek  <jakub@redhat.com>
 
        Update copyright years.
index d47529caa348337b65e57f4e74b13f9d8b719aac..18c7146baf6581fbaba1343de10c6e3a25e7474b 100644 (file)
@@ -1656,6 +1656,7 @@ Gcc_backend::constructor_expression(Btype* btype,
   vec<constructor_elt, va_gc> *init;
   vec_alloc(init, vals.size());
 
+  tree sink = NULL_TREE;
   bool is_constant = true;
   tree field = TYPE_FIELDS(type_tree);
   for (std::vector<Bexpression*>::const_iterator p = vals.begin();
@@ -1669,6 +1670,17 @@ Gcc_backend::constructor_expression(Btype* btype,
           || TREE_TYPE(val) == error_mark_node)
         return this->error_expression();
 
+      if (int_size_in_bytes(TREE_TYPE(field)) == 0)
+       {
+         // GIMPLE cannot represent indices of zero-sized types so
+         // trying to construct a map with zero-sized keys might lead
+         // to errors.  Instead, we evaluate each expression that
+         // would have been added as a map element for its
+         // side-effects and construct an empty map.
+         append_to_statement_list(val, &sink);
+         continue;
+       }
+
       constructor_elt empty = {NULL, NULL};
       constructor_elt* elt = init->quick_push(empty);
       elt->index = field;
@@ -1681,7 +1693,9 @@ Gcc_backend::constructor_expression(Btype* btype,
   tree ret = build_constructor(type_tree, init);
   if (is_constant)
     TREE_CONSTANT(ret) = 1;
-
+  if (sink != NULL_TREE)
+    ret = fold_build2_loc(location.gcc_location(), COMPOUND_EXPR,
+                         type_tree, sink, ret);
   return this->make_expression(ret);
 }