https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61502
--- Comment #10 from Keith Thompson <Keith.S.Thompson at gmail dot com> --- I strongly disagree with your interpretation. Do you believe that the authors of the standard meant it the way you do? I suggest that the footnote: > Two objects may be adjacent in memory because they are adjacent elements > of a larger array or adjacent members of a structure with no padding > between them, or because the implementation chose to place them so, > even though they are unrelated. implies that the phrase "adjacent in memory" (which appears to be synonymous with "immediately following in the address space") is intended to have a *consistent* meaning, even for unrelated objects. Two given objects may or may not be adjacent, and if they are adjacent they may appear in either order, entirely at the whim of the compiler. But I don't see a reasonable interpretation of the standard's wording that doesn't require "==" to behave consistently. Indeed, I believe that consistency (which gcc lacks) is the whole point of that wording. Any two pointer values are either equal or unequal. In the test program, the pointer values do not change, but they compare both equal and unequal at different points in the code. In my opinion, that's a clear violation of the required semantics. And I don't believe you've fullyl answered my question about what is meant by "follows", at least not fully. I agree with you about the meaning for objects that are subobjects of some larger object, but for other cases you've essentially said that it's meaningless. I actually would have no problem with that, and I wouldn't complain if the standard left it unspecified -- but it doesn't.