http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52337
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-02-22 09:35:44 UTC --- (do you have something against whitespace?!) could you explain exactly what you think GCC does wrong, and what you expect to happen? I'm afraid I don't understand your report. Here's the same code, once more with formatting: typedef char**(*(*v[4])(int*p[],float (*f)(int a[])))[][6]; class e{ v i,a,b; public: int get(); friend int g(); } ai; int e::get() { long h1,h2,h3; h1=(long)&i; h2=(long)&a; h3=(long)&b; __builtin_printf("%p\n%p %lx\n%p %lx\noriginal pointer is: %p\n",i,a,h2-h1,b,h3-h2, &i); return 0; } int g(){ return ai.get(); } class pgabstract{ v i,a,b; public: int get() {return vget();} int(*p)(); virtual void t()=0; int vget(); } *m[4]; int pgabstract::vget() { long h1,h2,h3; h1=(long)&i; h2=(long)&a; h3=(long)&b; __builtin_printf("%p\n%p %lx\n%p %lx\noriginal pointer is: %p\n",i,a,h2-h1,b,h3-h2, &i); return 0; } int main(){ m[3]=(pgabstract*)&ai; m[3]->get(); } When I run this I get: 0x600b48 0x600b68 20 0x600b88 20 original pointer is: 0x600b48