diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2019-05-09 18:14:57 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2019-05-09 18:14:57 +0000 |
commit | 41ebe0ce64bfc5ea208fc391b6dabd39bf670cec (patch) | |
tree | 68165d28219aeb3f7e72cd0c432551535546982e /clang/test/OpenMP/parallel_messages.cpp | |
parent | e406f0eec64f5b6ceb38a2afdd119c41f9905f42 (diff) | |
download | bcm5719-llvm-41ebe0ce64bfc5ea208fc391b6dabd39bf670cec.tar.gz bcm5719-llvm-41ebe0ce64bfc5ea208fc391b6dabd39bf670cec.zip |
[OPENMP]Fix PR41768: check DSA for globals with default(none) clauses.
If the default(none) was specified for the construct, we might miss
diagnostic for the globals without explicitly specified data-sharing
attributes. Patch fixes this problem.
llvm-svn: 360362
Diffstat (limited to 'clang/test/OpenMP/parallel_messages.cpp')
-rw-r--r-- | clang/test/OpenMP/parallel_messages.cpp | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/clang/test/OpenMP/parallel_messages.cpp b/clang/test/OpenMP/parallel_messages.cpp index 8b0c0353c20..aa932e69e37 100644 --- a/clang/test/OpenMP/parallel_messages.cpp +++ b/clang/test/OpenMP/parallel_messages.cpp @@ -7,6 +7,7 @@ void foo() { #pragma omp parallel // expected-error {{unexpected OpenMP directive '#pragma omp parallel'}} +int a; struct S; S& bar(); int main(int argc, char **argv) { @@ -54,8 +55,11 @@ int main(int argc, char **argv) { break; } } - #pragma omp parallel default(none) - ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} +#pragma omp parallel default(none) // expected-note 2 {{explicit data sharing attribute requested here}} + { + ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} + ++a; // expected-error {{variable 'a' must have explicitly specified data sharing attributes}} + } goto L2; // expected-error {{use of undeclared label 'L2'}} #pragma omp parallel @@ -73,3 +77,25 @@ int main(int argc, char **argv) { return 0; } +struct a { + static constexpr int b = 0; +}; +template <bool> struct c; +template <typename d, typename e> bool operator<(d, e); +struct f { + int cbegin; +}; +class g { + f blocks; + void j(); +}; +template <typename> struct is_error_code_enum : a {}; +struct h { + template <typename i, typename = c<is_error_code_enum<i>::b>> h(i); +}; +h operator<(h, h); +void g::j() { +#pragma omp parallel for default(none) + for (auto a = blocks.cbegin; a < blocks; ++a) // expected-error {{invalid operands to binary expression ('f' and 'int')}} + ; +} |