// PR c++/33616 // { dg-do run } // { dg-options "-O2" } extern "C" void abort (); struct S { int c; S () : c (0) {} virtual void f1 () { c += 1; } virtual void f2 () { c += 16; } }; struct T { S s; }; typedef void (S::*Q) (); template void test1 (T *t) { (t->s.*P)(); } template void test2 (T *t) { S &s = t->s; (s.*P)(); } int main () { T t; test1 <&S::f1> (&t); if (t.s.c != 1) abort (); test1 <&S::f2> (&t); if (t.s.c != 17) abort (); test2 <&S::f1> (&t); if (t.s.c != 18) abort (); test2 <&S::f2> (&t); if (t.s.c != 34) abort (); }