forked from OSchip/llvm-project
133 lines
2.9 KiB
C++
133 lines
2.9 KiB
C++
// 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 (...) {
|
|
}
|
|
}
|
|
}
|