]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/29_atomics/atomic/operators/pointer_partial_void.cc
Update copyright in libstdc++-v3.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 29_atomics / atomic / operators / pointer_partial_void.cc
1 // { dg-require-atomic-builtins "" }
2 // { dg-options "-std=gnu++0x" }
3
4 // Copyright (C) 2012-2013 Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
20
21 #include <atomic>
22 #include <cstdlib> //std::abs
23 #include <testsuite_hooks.h>
24
25 // pointer arithimetic vs. atomic<void*>.
26 // atomic<void*> vs. explicitly specialized w/o operators, like atomic_bool?
27 int main(void)
28 {
29 using namespace std;
30
31 typedef int value_type;
32 const size_t n = 2;
33 value_type value = 42;
34 value_type* p = &value;
35 void* vp = p;
36 ptrdiff_t __attribute__((unused)) dist(0);
37
38 atomic<void*> a(vp);
39
40 // operator++
41 void* vp2(a);
42 a++;
43 void* vp3(a);
44 dist = reinterpret_cast<char*>(vp2) - reinterpret_cast<char*>(vp3);
45 // VERIFY ( std::abs(dist) == sizeof(void*));
46
47 // operator--
48 void* vp4(a);
49 a--;
50 void* vp5(a);
51 dist = reinterpret_cast<char*>(vp4) - reinterpret_cast<char*>(vp5);
52 // VERIFY ( std::abs(dist) == sizeof(void*));
53
54 // operator+=
55 void* vp6(a);
56 a+=n;
57 void* vp7(a);
58 dist = reinterpret_cast<char*>(vp6) - reinterpret_cast<char*>(vp7);
59 // VERIFY ( std::abs(dist) == sizeof(void*) * n);
60
61 // operator-=
62 void* vp8(a);
63 a-=n;
64 void* vp9(a);
65 dist = reinterpret_cast<char*>(vp8) - reinterpret_cast<char*>(vp9);
66 //VERIFY ( std::abs(dist) == sizeof(void*) * n);
67
68 return 0;
69 }