1c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev// Test that thread local data is handled correctly after forking without exec().
2c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev// RUN: %clangxx_lsan %s -o %t
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t 2>&1
4c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev
5c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <assert.h>
6c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <stdio.h>
7c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <stdlib.h>
8c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <sys/wait.h>
9c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <unistd.h>
10c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev
11c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev__thread void *thread_local_var;
12c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev
13c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveevint main() {
14c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  int status = 0;
15c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  thread_local_var = malloc(1337);
16c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  pid_t pid = fork();
17c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  assert(pid >= 0);
18c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  if (pid > 0) {
19c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev    waitpid(pid, &status, 0);
20c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev    assert(WIFEXITED(status));
21c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev    return WEXITSTATUS(status);
22c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  }
23c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev  return 0;
24c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev}
25