| // { dg-do run } |
| // { dg-options "-O2" } |
| // |
| // Copyright (C) 2001 Free Software Foundation, Inc. |
| // Contributed by Nathan Sidwell 26 May 2001 <nathan@codesourcery.com> |
| |
| // Bug 2823. Inlineing the body of a thunk broke things. But that's |
| // rarely a sensible thing to do anyway. |
| |
| #include <cstdio> |
| #include <cstdlib> |
| |
| 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; |
| } |