blob: b50b69677d4b71b9d0d52f5c4ce5ec0f474e6aec [file] [log] [blame]
Stephen Hines2d1fdb22014-05-28 23:58:16 -07001// RUN: %clangxx_tsan -O1 %s -o %t && %run %t | FileCheck %s
2// Regtest for https://code.google.com/p/thread-sanitizer/issues/detail?id=40
3// This is a correct program and tsan should not report a race.
Stephen Hines86277eb2015-03-23 12:06:32 -07004#include "test.h"
5
Stephen Hines2d1fdb22014-05-28 23:58:16 -07006int g;
7__attribute__((noinline))
8int foo(int cond) {
9 if (cond)
10 return g;
11 return 0;
12}
Stephen Hines86277eb2015-03-23 12:06:32 -070013
Stephen Hines2d1fdb22014-05-28 23:58:16 -070014void *Thread1(void *p) {
Stephen Hines86277eb2015-03-23 12:06:32 -070015 barrier_wait(&barrier);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070016 long res = foo((long)p);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070017 return (void*) res;
18}
19
20int main() {
Stephen Hines86277eb2015-03-23 12:06:32 -070021 barrier_init(&barrier, 2);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070022 pthread_t t;
23 pthread_create(&t, 0, Thread1, 0);
24 g = 1;
Stephen Hines86277eb2015-03-23 12:06:32 -070025 barrier_wait(&barrier);
Stephen Hines2d1fdb22014-05-28 23:58:16 -070026 pthread_join(t, 0);
27 printf("PASS\n");
Stephen Hines86277eb2015-03-23 12:06:32 -070028 // CHECK-NOT: ThreadSanitizer: data race
Stephen Hines2d1fdb22014-05-28 23:58:16 -070029 // CHECK: PASS
30}