// 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 (...) { } } }