stage4/generate_c/generate_c_vardecl.cc
changeset 596 4efb11e44065
parent 594 c8092e909886
child 635 a20a70021d37
child 661 f537c3315f83
--- 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;