diff -r c41975a290ce -r 4efb11e44065 stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Thu Jun 14 17:50:37 2012 +0100 +++ b/stage4/generate_c/generate_c_vardecl.cc Fri Jun 15 19:54:33 2012 +0100 @@ -265,28 +265,37 @@ /* integer '(' [array_initial_element] ')' */ /* array_initial_element may be NULL ! */ void *visit(array_initial_elements_c *symbol) { - unsigned long long int initial_element_number; + unsigned long long int initial_element_count; + + /* This code assumes that unsigned long long int is >= uint64_t */ + if (std::numeric_limits< uint64_t >::max() > std::numeric_limits< unsigned long long int >::max()) + ERROR_MSG("Assertion (sizeof(uint64_t) > sizeof(unsigned long long int)) failed! Compiler cannot execute correctly on the current platform!"); switch (current_mode) { case initializationvalue_am: - initial_element_number = extract_int64_value(symbol->integer); + if (VALID_CVALUE( int64, symbol->integer) && (GET_CVALUE( int64, symbol->integer) >= 0)) + initial_element_count = GET_CVALUE( int64, symbol->integer); + else if (VALID_CVALUE(uint64, symbol->integer)) + initial_element_count = GET_CVALUE(uint64, symbol->integer); + else ERROR; + if (current_initialization_count < defined_values_count) { unsigned long long int temp_element_number = 0; unsigned long long int diff = defined_values_count - current_initialization_count; - if (diff <= initial_element_number) - temp_element_number = initial_element_number - diff; - current_initialization_count += initial_element_number - 1; - initial_element_number = temp_element_number; - if (initial_element_number > 0) { + if (diff <= initial_element_count) + temp_element_number = initial_element_count - diff; + current_initialization_count += initial_element_count - 1; + initial_element_count = temp_element_number; + if (initial_element_count > 0) { defined_values_count++; s4o.print(","); } } else - current_initialization_count += initial_element_number - 1; - if (defined_values_count + initial_element_number > array_size) + current_initialization_count += initial_element_count - 1; + if (defined_values_count + initial_element_count > array_size) ERROR; - for (unsigned long long int i = 0; i < initial_element_number; i++) { + for (unsigned long long int i = 0; i < initial_element_count; i++) { if (i > 0) s4o.print(","); if (symbol->array_initial_element != NULL) { @@ -296,8 +305,8 @@ array_default_value->accept(*this); } } - if (initial_element_number > 1) - defined_values_count += initial_element_number - 1; + if (initial_element_count > 1) + defined_values_count += initial_element_count - 1; break; default: break;