1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_mop.cc -------------------------------------------------------===//
2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//
3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//                     The LLVM Compiler Infrastructure
4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//
5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is distributed under the University of Illinois Open Source
6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// License. See LICENSE.TXT for details.
7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//
8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===//
9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//
10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector.
11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//
12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===//
13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_interface.h"
14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_test_util.h"
15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h"
16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stddef.h>
17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <stdint.h>
18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, SimpleWrite) {
20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t;
21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t.Write1(l);
23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, SimpleWriteWrite) {
26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l1, l2;
28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Write1(l1);
29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Write1(l2);
30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteWriteRace) {
33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Write1(l);
36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Write1(l, true);
37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReadWriteRace) {
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Read1(l);
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Write1(l, true);
44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteReadRace) {
47da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
48da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Write1(l);
50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Read1(l, true);
51da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
52da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
53da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReadReadNoRace) {
54da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
55da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
56da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Read1(l);
57da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Read1(l);
58da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
59da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteThenRead) {
61da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
62da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
63da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Write1(l);
64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Read1(l);
65da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Read1(l, true);
66da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
67da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
68da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, WriteThenLockedRead) {
69da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  Mutex m(Mutex::RW);
70da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MainThread t0;
71da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t0.Create(m);
72da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
73da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
74da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    ScopedThread t1, t2;
75da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
76da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Write8(l);
77da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
78da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Lock(m);
79da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Read8(l);
80da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Unlock(m);
81da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
82da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Read8(l, true);
83da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
84da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t0.Destroy(m);
85da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
86da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
87da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, LockedWriteThenRead) {
88da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  Mutex m(Mutex::RW);
89da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MainThread t0;
90da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t0.Create(m);
91da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
92da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
93da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    ScopedThread t1, t2;
94da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
95da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Lock(m);
96da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Write8(l);
97da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Unlock(m);
98da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
99da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Read8(l);
100da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
101da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Read8(l, true);
102da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
103da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t0.Destroy(m);
104da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
105da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
106da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
107da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, RaceWithOffset) {
108da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
109da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
110da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
111da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access(l.loc(), true, 8, false);
112da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 4, true, 4, true);
113da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
114da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
115da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
116da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access(l.loc(), true, 8, false);
117da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 7, true, 1, true);
118da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
119da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
120da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
121da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc() + 4, true, 4, false);
122da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 4, true, 2, true);
123da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
124da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
125da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
126da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc() + 4, true, 4, false);
127da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 6, true, 2, true);
128da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
129da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
130da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
131da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc() + 3, true, 2, false);
132da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 4, true, 1, true);
133da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
134da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
135da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
136da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc() + 1, true, 8, false);
137da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 3, true, 1, true);
138da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
139da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
140da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
141da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, RaceWithOffset2) {
142da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
143da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
144da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
145da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc(), true, 4, false);
146da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 2, true, 1, true);
147da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
148da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
149da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
150da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc() + 2, true, 1, false);
151da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc(), true, 4, true);
152da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
153da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
154da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
155da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, NoRaceWithOffset) {
156da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
157da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
158da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
159da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access(l.loc(), true, 4, false);
160da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 4, true, 4, false);
161da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
162da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
163da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    MemLoc l;
164da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t1.Access((char*)l.loc() + 3, true, 2, false);
165da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 1, true, 2, false);
166da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Access((char*)l.loc() + 5, true, 2, false);
167da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
168da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
169da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
170da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, RaceWithDeadThread) {
171da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
172da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t;
173da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread().Write1(l);
174da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t.Write1(l, true);
175da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
176da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
177da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, BenignRaceOnVptr) {
178da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  void *vptr_storage;
179da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc vptr(&vptr_storage), val;
180da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  vptr_storage = val.loc();
181da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
182da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.VptrUpdate(vptr, val);
183da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Read8(vptr);
184da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
185da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
186da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, HarmfulRaceOnVptr) {
187da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  void *vptr_storage;
188da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc vptr(&vptr_storage), val1, val2;
189da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  vptr_storage = val1.loc();
190da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
191da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.VptrUpdate(vptr, val2);
192da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Read8(vptr, true);
193da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
194da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
195da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void foo() {
196da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  volatile int x = 42;
197ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov  int x2 = x;
198ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov  (void)x2;
199da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
200da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
201da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void bar() {
202da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  volatile int x = 43;
203ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov  int x2 = x;
204ea5bde91d547af6f38005ebdb64d7b6e4c9f966cDmitry Vyukov  (void)x2;
205da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
206da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
207da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReportDeadThread) {
208da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
209da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1;
210da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  {
211da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    ScopedThread t2;
212da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Call(&foo);
213da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Call(&bar);
214da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany    t2.Write1(l);
215da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  }
216da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Write1(l, true);
217da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
218da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
219da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystruct ClassWithStatic {
220da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  static int Data[4];
221da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany};
222da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
223da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint ClassWithStatic::Data[4];
224da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
225da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void foobarbaz() {}
226da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
227da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, ReportRace) {
228da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1;
229da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MainThread().Access(&ClassWithStatic::Data, true, 4, false);
230da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Call(&foobarbaz);
231da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Access(&ClassWithStatic::Data, true, 2, true);
232da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Return();
233da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
234