diff -r 7dcbd8418771 -r 60b012b7793f stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Fri Sep 09 12:03:15 2011 +0200 +++ b/stage4/generate_c/generate_c_vardecl.cc Wed Sep 14 22:58:39 2011 +0200 @@ -105,7 +105,6 @@ current_mode = typedecl_am; array_specification->accept(*this); - s4o.print(" temp = "); init_array_values(array_initialization); @@ -188,14 +187,21 @@ /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ void *visit(array_specification_c *symbol) { - symbol->array_subrange_list->accept(*this); + identifier_c* type_name; switch (current_mode) { case arraysize_am: + symbol->array_subrange_list->accept(*this); array_base_type = symbol->non_generic_type_name; array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());; if (array_default_value == NULL) ERROR; break; + case typedecl_am: + s4o.print("__"); + symbol->non_generic_type_name->accept(*this); + symbol->array_subrange_list->accept(*this); + break; default: + symbol->array_subrange_list->accept(*this); break; } return NULL; @@ -204,9 +210,14 @@ /* signed_integer DOTDOT signed_integer */ //SYM_REF2(subrange_c, lower_limit, upper_limit) void *visit(subrange_c *symbol) { + int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; switch (current_mode) { case arraysize_am: - array_size *= extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; + array_size *= dimension; + break; + case typedecl_am: + s4o.print("_"); + s4o.print_integer(dimension); break; default: break; @@ -1379,6 +1390,23 @@ return NULL; } +/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ +void *visit(array_specification_c *symbol) { + s4o.print("__"); + symbol->non_generic_type_name->accept(*this); + symbol->array_subrange_list->accept(*this); + return NULL; +} + +/* signed_integer DOTDOT signed_integer */ +//SYM_REF2(subrange_c, lower_limit, upper_limit) +void *visit(subrange_c *symbol) { + int dimension = extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; + s4o.print("_"); + print_integer(dimension); + return NULL; +} + /* var1_list ':' initialized_structure */ // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure) void *visit(structured_var_init_decl_c *symbol) { @@ -1521,7 +1549,7 @@ } void *visit(array_initial_elements_list_c *symbol) { - if (wanted_varformat == localinit_vf) { + if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) { generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); array_initialization->init_array_size(this->current_var_type_symbol); array_initialization->init_array_values(this->current_var_init_symbol); @@ -1952,12 +1980,15 @@ s4o.print(nv->get()); s4o.print(INIT_GLOBAL); s4o.print("("); + this->current_var_type_symbol->accept(*this); + s4o.print(","); if (symbol->global_var_name != NULL) symbol->global_var_name->accept(*this); else symbol->location->accept(*this); - s4o.print(","); + s4o.print(",__INITIAL_VALUE("); this->current_var_init_symbol->accept(*this); + s4o.print(")"); print_retain(); s4o.print(")"); } @@ -2013,9 +2044,12 @@ s4o.print(INIT_GLOBAL); s4o.print("("); + this->current_var_type_symbol->accept(*this); + s4o.print(","); list->elements[i]->accept(*this); - s4o.print(","); + s4o.print(",__INITIAL_VALUE("); this->current_var_init_symbol->accept(*this); + s4o.print(")"); print_retain(); s4o.print(")"); #if 0