Implement N4514, C++ Extensions for Transactional Memory.
[platform/upstream/gcc.git] / gcc / testsuite / g++.dg / tm / inherit2.C
1 // Testcase from TM TS
2 // { dg-options "-std=c++14 -fgnu-tm" }
3
4 #include <iostream>
5
6 struct B {
7   virtual void f() transaction_safe;
8   virtual ~B() transaction_safe_dynamic;
9 };
10 // pre-existing code
11 struct D1 : B
12 {
13   void f() override { } // ok
14   ~D1() override { } // ok
15 };
16 struct D2 : B
17 {
18   void f() override { std::cout << "D2::f" << std::endl; } // { dg-error "" "transaction-safe f has transaction-unsafe definition" }
19   ~D2() override { std::cout << "~D2" << std::endl; } // ok
20 };
21 int main()
22 {
23   D2 * d2 = new D2;
24   B * b2 = d2;
25   atomic_commit {
26     B b; // ok
27     D1 d1; // ok
28     B& b1 = d1;
29     D2 x; // { dg-error "" "destructor of D2 is not transaction-safe" }
30     b1.f(); // ok, calls D1::f()
31     delete b2; // undefined behavior: calls unsafe destructor of D2
32   }
33 }