FWIW, I'm still looking at this on and off. I beleive the pure function was a red herring, as this example also does the wrong thing: extern int z; int foo(int *y) { z = 1; *y = 0; return z; // returns 1, even though y could point to z :( } Not much joy tracking it down as yet. I've attached the alias information tree dump in case anyone fancies a look. It looks ok to me, but I don't really understand it fully. As a reminder: this bug is fixed from r119502 on trunk. I'd like to fix it on 4.2.x. Ned. --