15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <pthread.h>
35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stddef.h>
45d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <stdio.h>
55d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <string.h>
65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <unistd.h>
75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint y[4], z[4];
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *MemMoveThread(void *a) {
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  memmove((int*)a, z, 16);
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  return NULL;
135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesvoid *MemSetThread(void *a) {
165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  sleep(1);
175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  memset((int*)a, 0, 16);
185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  return NULL;
195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint main() {
225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  pthread_t t[2];
235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // Race on y between memmove and memset
245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  pthread_create(&t[0], NULL, MemMoveThread, y);
255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  pthread_create(&t[1], NULL, MemSetThread, y);
265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  pthread_join(t[0], NULL);
275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  pthread_join(t[1], NULL);
285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  printf("PASS\n");
305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  return 0;
315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: WARNING: ThreadSanitizer: data race
345d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK:   #0 memset
355d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK:   #1 MemSetThread
365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK:  Previous write
375d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK:   #0 memmove
385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK:   #1 MemMoveThread
39