Hi,
We discovered an issue with the GNAT implementation of the hashed container types. The RM states (A.18-4-18/2, A.18.7-17/2, et al) that "the predefined "=" operator for type Cursor returns True if both cursors are No_Element, or designate the same element in the same container." In some cases, GNAT's implementation violates this requirement. This was due to the component "Position" of the Cursor type in Hashed_Sets, Hashed_Maps, and Indefinite_Hashed_Maps (though interestingly not in Indefinite_Hashed_Sets). The Position component is used to store the position of a node in a bucket, and is used internally as an optimization. Since it was viewed as an optimization, it was only updated opportunistically. However, this effects the predefined equality for the type. The result was that various Cursor objects could be returned which designated the same element in the same container, but yet evaluated as inequal. The attached patch ensures that the Position value is always updated when a Cursor object is returned or modified. It also synchronizes comments for the Cursor type definition across the various packages. Additionally, a new regression test case is added that checks for this issue among all four of the hashed container packages. This was successfully bootstrapped and tested on trunk, x86_64-unknown-freebsd12.2. Cheers, Richard Wai ANNEXI-STRAYLINE
container_cursor_equality_20210304.patch
Description: Binary data