1 // Tests -fsanitize-coverage=stack-depth
2 //
3 // XFAIL: tsan
4 //
5 // RUN: %clangxx -O0 -std=c++11 -fsanitize-coverage=stack-depth %s -o %t
6 // RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not Assertion{{.*}}failed
7 // RUN: %clangxx -O0 -std=c++11 -fsanitize-coverage=trace-pc-guard,stack-depth \
8 // RUN:     %s -o %t
9 // RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not Assertion{{.*}}failed
10 
11 #include <cstdint>
12 #include <cstdio>
13 #include <cassert>
14 
15 thread_local uintptr_t __sancov_lowest_stack;
16 uintptr_t last_stack;
17 
18 void foo(int recurse) {
19   assert(__sancov_lowest_stack < last_stack);
20   last_stack = __sancov_lowest_stack;
21   if (recurse <= 0) return;
22   foo(recurse - 1);
23 }
24 
25 int main() {
26   last_stack = __sancov_lowest_stack;
27   foo(100);
28   printf("Success!\n");
29   return 0;
30 }
31 
32 // CHECK: Success!
33