// { dg-do run } // { dg-options "-O2" } // // Copyright (C) 2001 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 26 May 2001 // Bug 2823. Inlineing the body of a thunk broke things. But that's // rarely a sensible thing to do anyway. #include #include int objCount = 0; struct Thing { int count; Thing (); Thing (Thing const &src); ~Thing (); }; Thing::Thing () :count (0) { objCount++; std::printf ("%p %s\n", (void *)this,__PRETTY_FUNCTION__); } Thing::Thing (Thing const &src) :count (0) { objCount++; std::printf ("%p %s\n", (void *)this, __PRETTY_FUNCTION__); } Thing::~Thing () { std::printf ("%p %s\n", (void *)this, __PRETTY_FUNCTION__); if (count) std::abort (); count--; objCount--; } void x(Thing name) { // destruct name here } class Base { public: virtual void test(const Thing& s) = 0; }; class Impl : virtual public Base { public: virtual void test(const Thing& s) { x(s); // copy construct temporary } }; int main() { Impl *impl = new Impl(); impl->test( Thing ()); // This will use a thunk return objCount != 0; }