https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61502
--- Comment #6 from Keith Thompson <Keith.S.Thompson at gmail dot com> --- In the test case for Bug 63611 (marked as a duplicate of this one) we have: element x[1]; element y[1]; element *const x0 = x; element *const x1 = x0 + 1; element *const y0 = y; When the test case is executed, the condition (x1 == y0) is true when it's evaluated, but the condition (x + 1 == y) (which I argue is equivalent) is false when it's evaluated 2 lines later. I don't believe that DR#260 applies, since there are no indeterminate values being used here. Which means, I think, that N1570 6.2.4p2: An object exists, has a constant address, and retains its last-stored value throughout its lifetime. does apply. Whether x follows y or y follows x in memory, or neither, is unimportant. The problem is that the "==" comparison is behaving inconsistently for the same two pointer values. I'm unconvinced by the argument (if I understand it correctly) that the objects x and y might be adjacent when the first comparison is evaluated, but not when the second is evaluated. I believe that would violate the requirement that objects have constant addresses and retain their last-stored values. Furthermore, even if relocating objects so they're no long adjacent is permitted by the language, I don't believe gcc (or the code that it generates) is actually doing so in this case.