Fixed local static multidimensional array indexing
authorRobert Pengelly <robertapengelly@hotmail.com>
Sat, 12 Sep 2026 05:11:26 +0000 (06:11 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Sat, 12 Sep 2026 05:11:26 +0000 (06:11 +0100)
amd64.c
i386.c

diff --git a/amd64.c b/amd64.c
index 9546fc886e6ef8eab3fd2ba0921e906a01e83ca5..de42ba5bce33c207898a30a5677c30c92173a22e 100644 (file)
--- a/amd64.c
+++ b/amd64.c
@@ -7913,6 +7913,24 @@ static int declarator_effective_pointed_size_now (int base_size, const int *fiel
         return entry->size;
     }
     
+    /*
+     * For an array object, pointed_size describes the scalar element reached
+     * after all array dimensions have been consumed.  The field list used for
+     * initializers may contain one entry for every flattened array element, so
+     * summing it here turns e.g. uint8_t a[16][3] into a pointed size of 48.
+     * That makes a[i][j] look like pointer traversal instead of row/element
+     * indexing.
+     */
+    if (declarator_has_array) {
+    
+        if (parsed_type_is_aggregate) {
+            return base_size;
+        }
+        
+        return base_size & 0x1f;
+    
+    }
+    
     return declarator_element_size_from_fields (base_size, field_sizes, field_count);
 
 }
diff --git a/i386.c b/i386.c
index 140f18d718d9ac024086d2ee51fdea7c61551c9a..32323e43a87cf9003106606408fc89ff86e0f5ce 100644 (file)
--- a/i386.c
+++ b/i386.c
@@ -7134,6 +7134,24 @@ static int declarator_effective_pointed_size_now (int base_size, const int *fiel
         return entry->size;
     }
     
+    /*
+     * For an array object, pointed_size describes the scalar element reached
+     * after all array dimensions have been consumed.  The field list used for
+     * initializers may contain one entry for every flattened array element, so
+     * summing it here turns e.g. uint8_t a[16][3] into a pointed size of 48.
+     * That makes a[i][j] look like pointer traversal instead of row/element
+     * indexing.
+     */
+    if (declarator_has_array) {
+    
+        if (parsed_type_is_aggregate) {
+            return base_size;
+        }
+        
+        return base_size & 0x1f;
+    
+    }
+    
     return declarator_element_size_from_fields (base_size, field_sizes, field_count);
 
 }