1*9da05cf6SVitaly Buka // Sanitizer should not crash if pthread_create fails.
2*9da05cf6SVitaly Buka // RUN: %clangxx -pthread %s -o %t && %run %t
3*9da05cf6SVitaly Buka 
4*9da05cf6SVitaly Buka // pthread_create with lsan i386 does not fail here.
5*9da05cf6SVitaly Buka // UNSUPPORTED: i386-linux && lsan
6*9da05cf6SVitaly Buka 
7*9da05cf6SVitaly Buka #include <cassert>
8*9da05cf6SVitaly Buka #include <pthread.h>
9*9da05cf6SVitaly Buka #include <stdlib.h>
10*9da05cf6SVitaly Buka 
null_func(void * args)11*9da05cf6SVitaly Buka void *null_func(void *args) {
12*9da05cf6SVitaly Buka   return NULL;
13*9da05cf6SVitaly Buka }
14*9da05cf6SVitaly Buka 
main(void)15*9da05cf6SVitaly Buka int main(void) {
16*9da05cf6SVitaly Buka   pthread_t thread;
17*9da05cf6SVitaly Buka   pthread_attr_t attrs;
18*9da05cf6SVitaly Buka   pthread_attr_init(&attrs);
19*9da05cf6SVitaly Buka   // Set size huge enough to fail pthread_create.
20*9da05cf6SVitaly Buka   size_t sz = ~0;
21*9da05cf6SVitaly Buka   // Align the size just in case.
22*9da05cf6SVitaly Buka   sz >>= 16;
23*9da05cf6SVitaly Buka   sz <<= 16;
24*9da05cf6SVitaly Buka   int res = pthread_attr_setstacksize(&attrs, sz);
25*9da05cf6SVitaly Buka   assert(res == 0);
26*9da05cf6SVitaly Buka   for (size_t i = 0; i < 10; ++i) {
27*9da05cf6SVitaly Buka     res = pthread_create(&thread, &attrs, null_func, NULL);
28*9da05cf6SVitaly Buka     assert(res != 0);
29*9da05cf6SVitaly Buka   }
30*9da05cf6SVitaly Buka   return 0;
31*9da05cf6SVitaly Buka }
32