1 // RUN: %check_clang_tidy %s openmp-exception-escape %t -- -extra-arg=-fopenmp=libomp -extra-arg=-fexceptions -config="{CheckOptions: [{key: openmp-exception-escape.IgnoredExceptions, value: 'ignored, ignored2'}]}" -- 2 thrower()3int thrower() { 4 throw 42; 5 } 6 7 class ignored {}; 8 class ignored2 {}; 9 namespace std { 10 class bad_alloc {}; 11 } // namespace std 12 parallel()13void parallel() { 14 #pragma omp parallel 15 thrower(); 16 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: an exception thrown inside of the OpenMP 'parallel' region is not caught in that same region 17 } 18 ignore()19void ignore() { 20 #pragma omp parallel 21 throw ignored(); 22 } 23 ignore2()24void ignore2() { 25 #pragma omp parallel 26 throw ignored2(); 27 } 28 standalone_directive()29void standalone_directive() { 30 #pragma omp taskwait 31 throw ignored(); // not structured block 32 } 33 ignore_alloc()34void ignore_alloc() { 35 #pragma omp parallel 36 throw std::bad_alloc(); 37 } 38 parallel_caught()39void parallel_caught() { 40 #pragma omp parallel 41 { 42 try { 43 thrower(); 44 } catch (...) { 45 } 46 } 47 } 48 for_header(const int a)49void for_header(const int a) { 50 // Only the body of the loop counts. 51 #pragma omp for 52 for (int i = 0; i < thrower(); i++) 53 ; 54 } 55 forloop(const int a)56void forloop(const int a) { 57 #pragma omp for 58 for (int i = 0; i < a; i++) 59 thrower(); 60 // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region 61 } 62 parallel_forloop(const int a)63void parallel_forloop(const int a) { 64 #pragma omp parallel 65 { 66 #pragma omp for 67 for (int i = 0; i < a; i++) 68 thrower(); 69 thrower(); 70 // CHECK-MESSAGES: :[[@LINE-5]]:3: warning: an exception thrown inside of the OpenMP 'parallel' region is not caught in that same region 71 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region 72 } 73 } 74 parallel_forloop_caught(const int a)75void parallel_forloop_caught(const int a) { 76 #pragma omp parallel 77 { 78 #pragma omp for 79 for (int i = 0; i < a; i++) { 80 try { 81 thrower(); 82 } catch (...) { 83 } 84 } 85 thrower(); 86 // CHECK-MESSAGES: :[[@LINE-9]]:3: warning: an exception thrown inside of the OpenMP 'parallel' region is not caught in that same region 87 } 88 } 89 parallel_caught_forloop(const int a)90void parallel_caught_forloop(const int a) { 91 #pragma omp parallel 92 { 93 #pragma omp for 94 for (int i = 0; i < a; i++) 95 thrower(); 96 try { 97 thrower(); 98 } catch (...) { 99 } 100 // CHECK-MESSAGES: :[[@LINE-5]]:7: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region 101 } 102 } 103 parallel_outercaught_forloop(const int a)104void parallel_outercaught_forloop(const int a) { 105 #pragma omp parallel 106 { 107 try { 108 #pragma omp for 109 for (int i = 0; i < a; i++) 110 thrower(); 111 thrower(); 112 } catch (...) { 113 } 114 // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region 115 } 116 } 117 parallel_outercaught_forloop_caught(const int a)118void parallel_outercaught_forloop_caught(const int a) { 119 #pragma omp parallel 120 { 121 try { 122 #pragma omp for 123 for (int i = 0; i < a; i++) { 124 try { 125 thrower(); 126 } catch (...) { 127 } 128 } 129 } catch (...) { 130 } 131 } 132 } 133