From fd8ac666ca5c3e4ce37ceb6bdeb2df713c7f38ff Mon Sep 17 00:00:00 2001 From: Robert Pengelly Date: Sat, 12 Sep 2026 06:11:26 +0100 Subject: [PATCH] Fixed local static multidimensional array indexing --- amd64.c | 18 ++++++++++++++++++ i386.c | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/amd64.c b/amd64.c index 9546fc8..de42ba5 100644 --- 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 140f18d..32323e4 100644 --- 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); } -- 2.34.1