1// { dg-do run  }
2// { dg-options "-O2" }
3//
4// Copyright (C) 2001 Free Software Foundation, Inc.
5// Contributed by Nathan Sidwell 26 May 2001 <nathan@codesourcery.com>
6
7// Bug 2823. Inlineing the body of a thunk broke things. But that's
8// rarely a sensible thing to do anyway.
9
10#include <cstdio>
11#include <cstdlib>
12
13int objCount = 0;
14
15struct Thing
16{
17  int count;
18
19  Thing ();
20  Thing (Thing const &src);
21
22  ~Thing ();
23
24};
25
26Thing::Thing ()
27  :count (0)
28{
29  objCount++;
30  std::printf ("%p %s\n", (void *)this,__PRETTY_FUNCTION__);
31}
32
33Thing::Thing (Thing const &src)
34  :count (0)
35{
36  objCount++;
37  std::printf ("%p %s\n", (void *)this, __PRETTY_FUNCTION__);
38}
39
40Thing::~Thing ()
41{
42  std::printf ("%p %s\n", (void *)this, __PRETTY_FUNCTION__);
43  if (count)
44    std::abort ();
45  count--;
46  objCount--;
47}
48
49void x(Thing name)
50{
51  // destruct name here
52}
53
54class Base
55{
56  public:
57  virtual void test(const Thing& s) = 0;
58};
59
60class Impl : virtual public Base
61{
62  public:
63  virtual void test(const Thing& s)
64  {
65    x(s); // copy construct temporary
66  }
67};
68
69int main()
70{
71  Impl *impl = new Impl();
72
73  impl->test( Thing ());	// This will use a thunk
74  return objCount != 0;
75}
76