15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" void AnnotateRWLockAcquired(const char *f, int l, void *m, long rw);
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main() {
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  int m = 0;
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  AnnotateRWLockAcquired(__FILE__, __LINE__, &m, 1);
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  AnnotateRWLockAcquired(__FILE__, __LINE__, &m, 0);
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: WARNING: ThreadSanitizer: read lock of a write locked mutex
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK:     #0 AnnotateRWLockAcquired
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK:     #1 main
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: Location is stack of main thread.
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK:   Mutex {{.*}}) created at:
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK:     #0 AnnotateRWLockAcquired
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK:     #1 main
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: SUMMARY: ThreadSanitizer: read lock of a write locked mutex
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
20