| // 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'}]}" -- |
| |
| int thrower() { |
| throw 42; |
| } |
| |
| class ignored {}; |
| class ignored2 {}; |
| namespace std { |
| class bad_alloc {}; |
| } // namespace std |
| |
| void parallel() { |
| #pragma omp parallel |
| thrower(); |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: an exception thrown inside of the OpenMP 'parallel' region is not caught in that same region |
| } |
| |
| void ignore() { |
| #pragma omp parallel |
| throw ignored(); |
| } |
| |
| void ignore2() { |
| #pragma omp parallel |
| throw ignored2(); |
| } |
| |
| void standalone_directive() { |
| #pragma omp taskwait |
| throw ignored(); // not structured block |
| } |
| |
| void ignore_alloc() { |
| #pragma omp parallel |
| throw std::bad_alloc(); |
| } |
| |
| void parallel_caught() { |
| #pragma omp parallel |
| { |
| try { |
| thrower(); |
| } catch (...) { |
| } |
| } |
| } |
| |
| void for_header(const int a) { |
| // Only the body of the loop counts. |
| #pragma omp for |
| for (int i = 0; i < thrower(); i++) |
| ; |
| } |
| |
| void forloop(const int a) { |
| #pragma omp for |
| for (int i = 0; i < a; i++) |
| thrower(); |
| // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region |
| } |
| |
| void parallel_forloop(const int a) { |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < a; i++) |
| thrower(); |
| thrower(); |
| // CHECK-MESSAGES: :[[@LINE-5]]:3: warning: an exception thrown inside of the OpenMP 'parallel' region is not caught in that same region |
| // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region |
| } |
| } |
| |
| void parallel_forloop_caught(const int a) { |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < a; i++) { |
| try { |
| thrower(); |
| } catch (...) { |
| } |
| } |
| thrower(); |
| // CHECK-MESSAGES: :[[@LINE-9]]:3: warning: an exception thrown inside of the OpenMP 'parallel' region is not caught in that same region |
| } |
| } |
| |
| void parallel_caught_forloop(const int a) { |
| #pragma omp parallel |
| { |
| #pragma omp for |
| for (int i = 0; i < a; i++) |
| thrower(); |
| try { |
| thrower(); |
| } catch (...) { |
| } |
| // CHECK-MESSAGES: :[[@LINE-5]]:7: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region |
| } |
| } |
| |
| void parallel_outercaught_forloop(const int a) { |
| #pragma omp parallel |
| { |
| try { |
| #pragma omp for |
| for (int i = 0; i < a; i++) |
| thrower(); |
| thrower(); |
| } catch (...) { |
| } |
| // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: an exception thrown inside of the OpenMP 'for' region is not caught in that same region |
| } |
| } |
| |
| void parallel_outercaught_forloop_caught(const int a) { |
| #pragma omp parallel |
| { |
| try { |
| #pragma omp for |
| for (int i = 0; i < a; i++) { |
| try { |
| thrower(); |
| } catch (...) { |
| } |
| } |
| } catch (...) { |
| } |
| } |
| } |