1// RUN: %check_clang_tidy %s openmp-exception-escape %t -- -extra-arg=-fopenmp=libomp -extra-arg=-fexceptions -config="{CheckOptions: {openmp-exception-escape.IgnoredExceptions: 'ignored, ignored2'}}" --
2
3int thrower() {
4 throw 42;
5}
6
7class ignored {};
8class ignored2 {};
9namespace std {
10class bad_alloc {};
11} // namespace std
12
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
19void ignore() {
20#pragma omp parallel
21 throw ignored();
22}
23
24void ignore2() {
25#pragma omp parallel
26 throw ignored2();
27}
28
29void standalone_directive() {
30#pragma omp taskwait
31 throw ignored(); // not structured block
32}
33
34void ignore_alloc() {
35#pragma omp parallel
36 throw std::bad_alloc();
37}
38
39void parallel_caught() {
40#pragma omp parallel
41 {
42 try {
43 thrower();
44 } catch (...) {
45 }
46 }
47}
48
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
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
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
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
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
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
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

source code of clang-tools-extra/test/clang-tidy/checkers/openmp/exception-escape.cpp