11b576585SDmitry Vyukov // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
21b576585SDmitry Vyukov
3*4a5086dcSDmitry Vyukov // Fails on Darwin bots:
4*4a5086dcSDmitry Vyukov // https://green.lab.llvm.org/green//job/clang-stage1-RA/25954/consoleFull
5*4a5086dcSDmitry Vyukov // and on clang-s390x-linux-lnt:
6*4a5086dcSDmitry Vyukov // https://lab.llvm.org/buildbot#builders/45/builds/5224
7*4a5086dcSDmitry Vyukov // Presumably the test is not 100% legal and kernel is allowed
8*4a5086dcSDmitry Vyukov // to unmap part of the range (e.g. .text) and then fail.
9*4a5086dcSDmitry Vyukov // So let's be conservative:
10*4a5086dcSDmitry Vyukov // REQUIRES: linux, x86_64-target-arch
11*4a5086dcSDmitry Vyukov
121b576585SDmitry Vyukov #include "test.h"
131b576585SDmitry Vyukov #include <sys/mman.h>
141b576585SDmitry Vyukov
main()151b576585SDmitry Vyukov int main() {
161b576585SDmitry Vyukov // These bogus munmap's must not crash tsan runtime.
171b576585SDmitry Vyukov munmap(0, 1);
181b576585SDmitry Vyukov munmap(0, -1);
191b576585SDmitry Vyukov munmap((void *)main, -1);
201b576585SDmitry Vyukov void *p =
211b576585SDmitry Vyukov mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
221b576585SDmitry Vyukov munmap(p, (1ull << 60));
231b576585SDmitry Vyukov munmap(p, -10000);
241b576585SDmitry Vyukov munmap(p, 0);
251b576585SDmitry Vyukov fprintf(stderr, "DONE\n");
261b576585SDmitry Vyukov return 0;
271b576585SDmitry Vyukov }
281b576585SDmitry Vyukov
291b576585SDmitry Vyukov // CHECK: DONE
30