/* Verify that we do not indirect-inline using member pointer parameters which have been modified. */ /* { dg-do run } */ /* { dg-options "-O3 -fno-early-inlining" } */ /* { dg-add-options bind_pic_locally } */ extern "C" void abort (void); class String { private: const char *data; public: String (const char *d) : data(d) {} int funcOne (int stuff) const; int funcTwo (int stuff) const; }; int String::funcOne (int stuff) const { return stuff + 1; } int String::funcTwo (int stuff) const { return stuff + 100; } int (String::* gmp)(int stuff) const = &String::funcTwo; int docalling_1 (int (String::* f)(int stuff) const) { String S ("muhehehe"); return (S.*f)(4); } int docalling (int a, int (String::* f)(int stuff) const) { if (a < 200) f = gmp; return docalling_1 (f); } int __attribute__ ((noinline,noclone)) get_input (void) { return 1; } int main (int argc, char *argv[]) { int i = 0; while (i < 10) i += docalling (get_input (), &String::funcOne); if (i != 104) abort(); return 0; }