> I'm having fun with arrays in Ada ;) and wondering if anyone can tell me > what's right here.
No surprise, arrays are probably the base types for which there is the largest gap between Ada and the C family of languages, for which GCC was written. You can see in the E_Array_Subtype case of gnat_to_gnu_entity the hoops we have to jump through to make them work. > In GCC this gets represented as an ARRAY_TYPE, whose TYPE_DOMAIN is a 32-bit > signed integer type; the TYPE_MAX_VALUE of this is 1 (as a size_int), the > TYPE_MIN_VALUE of this is -1 as a size_int, i.e. 4294967295. I believe > using (unsigned 32-bit) size_int for min/max is correct (?) despite the > domain being a signed type. Historically it was required that TYPE_DOMAIN be a subtype of 'sizetype', see build_index_type. The Ada compiler was originally using a signed 'sizetype' because of this (all the other compilers were using an unsigned one) but a couple of changes (POINTER_PLUS_EXPR and LTO) essentially forced a uniform 'sizetype' across languages and the Ada compiler wasn't the winner. ;-) > An array of this type is then initialized with a CONSTRUCTOR. The > CONSTRUCTOR has three elements, with INTEGER_CST indices, being in order > 2^32-1, 0, 1 (all of sizetype). > > I substitute the CONSTRUCTOR into an ARRAY_REF <blah>[4294967295]{lb: > 4294967295 sz: 2}, i.e. that picks the element with index (sizetype)2^32-1. > > fold() in fold-const.c then fails to fold, because it does binary search for > 2^32-1 through the constructor elements, and first checks against the > middle CONSTRUCTOR_ELT, which has index 0. IIRC I wrote this code (before the signedness change). > So, where's the bug here? Should all these indices have sizetype? Should > fold-const.c's binary search respect the TYPE_DOMAIN of the type of the > CONSTRUCTOR being searched? (Lots of build_int_cst to reinterpret the > CONSTRUCTOR_ELT indices, and/or the index being searched for, in said > TYPE_DOMAIN ?) According to Richard, we should now be able to set TYPE_DOMAIN to something else than a subtype of 'sizetype' but this is a mid-term goal and may require some substantial work. The short-term solution is probably to do nothing, arrays with negative indices are not very common in real life even in Ada. -- Eric Botcazou