]> gcc.gnu.org Git - gcc.git/blob - gcc/testsuite/g++.dg/cpp0x/constexpr-tuple.C
PR c++/92590 - wrong handling of inherited default ctor.
[gcc.git] / gcc / testsuite / g++.dg / cpp0x / constexpr-tuple.C
1 // PR c++/53202
2 // { dg-do run { target c++11 } }
3
4 #include <tuple>
5
6 template<typename Callable>
7 struct Bind_simple
8 {
9 explicit
10 Bind_simple(const Callable& callable)
11 : _M_bound(callable)
12 { }
13
14 Bind_simple(const Bind_simple&) = default;
15 Bind_simple(Bind_simple&&) = default;
16
17 auto operator()() -> decltype((*(Callable*)0)())
18 {
19 return std::get<0>(_M_bound)();
20 }
21
22 private:
23
24 std::tuple<Callable> _M_bound;
25 };
26
27 template<typename Callable>
28 Bind_simple<Callable>
29 bind_simple(Callable& callable)
30 {
31 return Bind_simple<Callable>(callable);
32 }
33
34 struct thread
35 {
36 struct ImplBase { };
37
38 template<typename T>
39 struct Impl : ImplBase {
40 T t;
41 Impl(T&& t) : t(std::move(t)) { }
42 };
43
44 template<typename T>
45 thread(T& t)
46 {
47 auto p = make_routine(bind_simple(t));
48
49 p->t();
50
51 delete p;
52 }
53
54 template<typename Callable>
55 Impl<Callable>*
56 make_routine(Callable&& f)
57 {
58 return new Impl<Callable>(std::forward<Callable>(f));
59 }
60 };
61
62
63 int c;
64 class background_hello
65 {
66 public:
67 background_hello()
68 {
69 __builtin_printf("default ctor called, this=%p\n", this);
70 ++c;
71 }
72
73 background_hello(const background_hello &)
74 {
75 __builtin_printf("copy ctor called\n");
76 ++c;
77 }
78
79 background_hello(background_hello &&)
80 {
81 __builtin_printf("move ctor called\n");
82 ++c;
83 }
84
85 void operator ()() const
86 {
87 __builtin_printf("void background_hello::operator()() called, this=%p\n", this);
88 }
89
90 ~background_hello()
91 {
92 __builtin_printf("destructor called, this=%p\n", this);
93 --c;
94 }
95
96 };
97
98 int main()
99 {
100 {
101 background_hello bh;
102 thread t(bh);
103 }
104 if (c != 0)
105 __builtin_abort ();
106 }
This page took 0.04013 seconds and 5 git commands to generate.