aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/ext/atomic-5.C
blob: fa9cda8c0097c73d946346f4ba36d6e100223520 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// { dg-do compile { target c++14 } }

template <int N>
void
foo (long double *ptr, long double *val, long double *ret)
{
  __atomic_exchange (ptr, val, ret, __ATOMIC_RELAXED);
}

template <int N>
bool
bar (long double *ptr, long double *exp, long double *des)
{
  return __atomic_compare_exchange (ptr, exp, des, false,
				    __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}

bool
baz (long double *p, long double *q, long double *r)
{
  foo<0> (p, q, r);
  foo<1> (p + 1, q + 1, r + 1);
  return bar<0> (p + 2, q + 2, r + 2) || bar<1> (p + 3, q + 3, r + 3);
}

constexpr int
qux (long double *ptr, long double *val, long double *ret)
{
  __atomic_exchange (ptr, val, ret, __ATOMIC_RELAXED);
  return 0;
}

constexpr bool
corge (long double *ptr, long double *exp, long double *des)
{
  return __atomic_compare_exchange (ptr, exp, des, false,
				    __ATOMIC_RELAXED, __ATOMIC_RELAXED);
}

long double a[6];
const int b = qux (a, a + 1, a + 2);
const bool c = corge (a + 3, a + 4, a + 5);