18b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
28b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov#include <stdio.h>
38b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov#include <stdlib.h>
48b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov#include <setjmp.h>
58b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
68b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukovint foo(sigjmp_buf env) {
78b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  printf("env=%p\n", env);
88b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  siglongjmp(env, 42);
98b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov}
108b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
118b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukovint main() {
128b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  sigjmp_buf env;
138b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  printf("env=%p\n", env);
148b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  if (sigsetjmp(env, 1) == 42) {
158b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov    printf("JUMPED\n");
168b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov    return 0;
178b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  }
188b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  foo(env);
198b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  printf("FAILED\n");
208b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov  return 0;
218b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov}
228b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov
238b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov// CHECK-NOT: FAILED
248b30c254a63a7421dd81d13dee086a54c4ca134bDmitry Vyukov// CHECK: JUMPED
25