Update ChangeLog and version files for release
[official-gcc.git] / gcc / testsuite / c-c++-common / tsan / pr65400-3.c
blob9483bb6c74610c46cc273276ad28dd46188c0e4a
1 /* PR sanitizer/65400 */
2 /* { dg-shouldfail "tsan" } */
3 /* { dg-additional-options "-fno-omit-frame-pointer -ldl" } */
5 #include <pthread.h>
6 #include "tsan_barrier.h"
8 static pthread_barrier_t barrier;
9 int v;
11 int
12 fn1 (int a, int b, int c)
14 int r = (a ^ b) % c;
15 r = r * a * b + c;
16 r = (r ^ b) % c;
17 return r;
20 int
21 fn2 (int a, int b, int c)
23 int r = (a ^ b) % c;
24 r = r * a * b + c;
25 r = (r ^ b) % c;
26 return r;
29 __attribute__((noinline, noclone)) void
30 foo (void)
32 barrier_wait (&barrier);
33 barrier_wait (&barrier);
34 v++;
37 __attribute__((noinline, noclone)) void
38 bar (void)
40 int (*fna) (int, int, int);
41 int (*fnb) (int, int, int);
42 int i;
43 asm ("" : "=g" (fna) : "0" (fn1));
44 asm ("" : "=g" (fnb) : "0" (fn2));
45 for (i = 0; i < 128; i++)
47 fna (0, 0, i + 1);
48 fnb (0, 0, i + 1);
50 foo ();
53 __attribute__((noinline, noclone)) void *
54 tf (void *arg)
56 (void) arg;
57 bar ();
58 return NULL;
61 int
62 main ()
64 pthread_t th;
65 barrier_init (&barrier, 2);
66 if (pthread_create (&th, NULL, tf, NULL))
67 return 0;
68 barrier_wait (&barrier);
69 v++;
70 barrier_wait (&barrier);
71 pthread_join (th, NULL);
72 return 0;
75 /* { dg-output "WARNING: ThreadSanitizer: data race.*#2 _?tf" } */