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