12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %run %t | FileCheck %s
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Regtest for https://code.google.com/p/thread-sanitizer/issues/detail?id=40
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This is a correct program and tsan should not report a race.
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <pthread.h>
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h>
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h>
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint g;
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__attribute__((noinline))
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint foo(int cond) {
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (cond)
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    return g;
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *Thread1(void *p) {
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  long res = foo((long)p);
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  sleep(1);
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return (void*) res;
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main() {
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_t t;
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_create(&t, 0, Thread1, 0);
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  g = 1;
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  pthread_join(t, 0);
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  printf("PASS\n");
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK: PASS
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
28