Index: osprey/wgen/wgen_decl.cxx
===================================================================
--- osprey/wgen/wgen_decl.cxx	(revision 3520)
+++ osprey/wgen/wgen_decl.cxx	(working copy)
@@ -4133,7 +4133,7 @@
 Is_Aggregate_Init_Zero_Array (gs_t init_list, gs_t type)
 {
 #ifdef FE_GNU_4_2_0
-  UINT esize = TY_size(TY_etype(Get_TY(type)));
+  UINT esize = gs_get_integer_value(gs_type_size(type)) / BITSPERBYTE;
   INT length = gs_constructor_length(init_list);
 
   gs_t curr_value_elem = length > 0 ? gs_operand (init_list, GS_CONSTRUCTOR_ELTS_VALUE) : NULL;
@@ -4177,65 +4177,23 @@
 Is_Aggregate_Init_Zero_Struct (gs_t init_list, gs_t type)
 {
 #ifdef FE_GNU_4_2_0
-  TY_IDX     ty    = Get_TY(type);
-  gs_t       field = get_first_real_or_virtual_field(type);
-  FLD_HANDLE fld   = TY_fld (ty);
-
-  gs_t       init;
-
-  gs_t type_binfo, basetypes;
-
-  if ((type_binfo = gs_type_binfo(type)) != NULL &&
-      (basetypes = gs_binfo_base_binfos(type_binfo)) != NULL) {
-
-    gs_t list;
-    for (list = basetypes; gs_code(list) != EMPTY; list = gs_operand(list, 1)) {
-      gs_t binfo = gs_operand(list, 0);
-      gs_t basetype = gs_binfo_type(binfo);
-      if (!is_empty_base_class(basetype) || !gs_binfo_virtual_p(binfo)) {
-        fld = FLD_next (fld);
-      }
-    }
-  }
-
-  while (field && gs_tree_code(field) != GS_FIELD_DECL)
-    field = next_real_field(type, field);
-
   INT length = gs_constructor_length(init_list);
   for (INT idx = 0; idx < length; idx++) {
 
     gs_t element_index = gs_constructor_elts_index(init_list, idx);
-
-    // if the initialization is not for the current field,
-    // advance the fields till we find it
-    if (field && element_index && gs_tree_code(element_index) == GS_FIELD_DECL) {
-      for (;;) {
-        if (field == element_index) {
-          break;
-        }
-        if (gs_decl_name(field) && gs_decl_name(field) == gs_decl_name(element_index)) {
-          break;
-        }
-        fld = FLD_next (fld);
-        field = next_real_field(type, field);
-        while (field && gs_tree_code(field) != GS_FIELD_DECL)
-          field = next_real_field(type, field);
-      }
-    }
-
     gs_t element_value = gs_constructor_elts_value(init_list, idx);
+    gs_t element_type = gs_tree_type(element_index);
+    INT  element_size = gs_get_integer_value(gs_type_size(element_type)) / BITSPERBYTE;
     if (gs_tree_code(element_value) == GS_CONSTRUCTOR) {
       // recursively process nested ARRAYs and STRUCTs
-      gs_t element_type;
-      element_type = gs_tree_type(field);
       if (!Is_Aggregate_Init_Zero (element_value, element_type))
         return FALSE;
     }
-    else if (gs_type_ptrmemfunc_p(gs_tree_type(field))) {
+    else if (gs_type_ptrmemfunc_p(element_type)) {
       return FALSE;
     }
     else if (gs_tree_code(element_value) == GS_REAL_CST) {
-      if (!Is_Real_Init_Zero (element_value, TY_size(FLD_type(fld))))
+      if (!Is_Real_Init_Zero (element_value, element_size))
         return FALSE;
     }
     else if (gs_tree_code(element_value) == GS_INTEGER_CST) {
@@ -4246,12 +4204,6 @@
     else {
       return FALSE;
     }
-
-    // advance to next field
-    fld = FLD_next(fld);
-    field = next_real_field(type, field);
-    while (field && gs_tree_code(field) != GS_FIELD_DECL)
-      field = next_real_field(type, field);
   }
 
   return TRUE;
