blob: b34eae05ebd4417ebbfdd29da00ac17e3fa79641 [file] [log] [blame]
// { 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;
}