1 /* Test atomic_is_lock_free. */
2 /* { dg-do run } */
3 /* { dg-options "-std=c11 -pedantic-errors" } */
4
5 #include <stdatomic.h>
6 #include <stdint.h>
7
8 extern void abort (void);
9
10 _Atomic _Bool aba;
11 atomic_bool abt;
12 _Atomic char aca;
13 atomic_char act;
14 _Atomic __CHAR16_TYPE__ ac16a;
15 atomic_char16_t ac16t;
16 _Atomic __CHAR32_TYPE__ ac32a;
17 atomic_char32_t ac32t;
18 _Atomic __WCHAR_TYPE__ awca;
19 atomic_wchar_t awct;
20 _Atomic short asa;
21 atomic_short ast;
22 _Atomic int aia;
23 atomic_int ait;
24 _Atomic long ala;
25 atomic_long alt;
26 _Atomic long long alla;
27 atomic_llong allt;
28 void *_Atomic apa;
29
30 #define CHECK_TYPE(MACRO, V1, V2) \
31 do \
32 { \
33 int r1 = MACRO; \
34 int r2 = atomic_is_lock_free (&V1); \
35 int r3 = atomic_is_lock_free (&V2); \
36 if (r1 != 0 && r1 != 1 && r1 != 2) \
37 abort (); \
38 if (r2 != 0 && r2 != 1) \
39 abort (); \
40 if (r3 != 0 && r3 != 1) \
41 abort (); \
42 if (r1 == 2 && r2 != 1) \
43 abort (); \
44 if (r1 == 2 && r3 != 1) \
45 abort (); \
46 if (r1 == 0 && r2 != 0) \
47 abort (); \
48 if (r1 == 0 && r3 != 0) \
49 abort (); \
50 } \
51 while (0)
52
53 int
main()54 main ()
55 {
56 CHECK_TYPE (ATOMIC_BOOL_LOCK_FREE, aba, abt);
57 CHECK_TYPE (ATOMIC_CHAR_LOCK_FREE, aca, act);
58 CHECK_TYPE (ATOMIC_CHAR16_T_LOCK_FREE, ac16a, ac16t);
59 CHECK_TYPE (ATOMIC_CHAR32_T_LOCK_FREE, ac32a, ac32t);
60 CHECK_TYPE (ATOMIC_WCHAR_T_LOCK_FREE, awca, awct);
61 CHECK_TYPE (ATOMIC_SHORT_LOCK_FREE, asa, ast);
62 CHECK_TYPE (ATOMIC_INT_LOCK_FREE, aia, ait);
63 CHECK_TYPE (ATOMIC_LONG_LOCK_FREE, ala, alt);
64 CHECK_TYPE (ATOMIC_LLONG_LOCK_FREE, alla, allt);
65 CHECK_TYPE (ATOMIC_POINTER_LOCK_FREE, apa, apa);
66
67 return 0;
68 }
69