xref: /llvm-project/compiler-rt/test/rtsan/blocking_call.cpp (revision 6ace680a5cc2aa8a45731605cbbab9f933e667a9)
11b601938SChris Apple // RUN: %clangxx -fsanitize=realtime %s -o %t
21b601938SChris Apple // RUN: not %run %t 2>&1 | FileCheck %s
31b601938SChris Apple // UNSUPPORTED: ios
41b601938SChris Apple 
51b601938SChris Apple // Intent: Check that a function marked with [[clang::nonblocking]] cannot call a function that is blocking.
61b601938SChris Apple 
71b601938SChris Apple #include <stdio.h>
81b601938SChris Apple #include <stdlib.h>
91b601938SChris Apple 
10*6ace680aSChris Apple void custom_blocking_function() [[clang::blocking]] {
11*6ace680aSChris Apple   printf("In blocking function\n");
121b601938SChris Apple }
131b601938SChris Apple 
14*6ace680aSChris Apple void realtime_function() [[clang::nonblocking]] { custom_blocking_function(); }
15*6ace680aSChris Apple void nonrealtime_function() { custom_blocking_function(); }
161b601938SChris Apple 
171b601938SChris Apple int main() {
18*6ace680aSChris Apple   nonrealtime_function();
19*6ace680aSChris Apple   realtime_function();
201b601938SChris Apple   return 0;
211b601938SChris Apple }
22*6ace680aSChris Apple 
23*6ace680aSChris Apple // CHECK: ==ERROR: RealtimeSanitizer: blocking-call
24*6ace680aSChris Apple // CHECK-NEXT: Call to blocking function `custom_blocking_function()` in real-time context!
25*6ace680aSChris Apple // CHECK-NEXT: {{.*custom_blocking_function*}}
26*6ace680aSChris Apple // CHECK-NEXT: {{.*realtime_function*}}
27*6ace680aSChris Apple 
28*6ace680aSChris Apple // should only occur once
29*6ace680aSChris Apple // CHECK-NOT: ==ERROR: RealtimeSanitizer: blocking-call
30