I see, thanks for the explanation. Just read your previous blog post that goes into more detail about this. [1] I don't know much about compilers, but I guess Defect Report #260 supports the interpretation that dereferencing q isn't the same as dereferencing (p+1), even inside an if block where p+1 == q: "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." [2]
[1] https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html
[2] http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_260.htm