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