diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-03-22 19:46:12 +0000 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-03-22 19:46:12 +0000 |
commit | cbbf92825f0d7a2b6925e93b58705443345ab57a (patch) | |
tree | 2fb58c693fd6f293330769076220a4073acb319a /clang-tools-extra/test/clang-tidy/openmp-use-default-none.cpp | |
parent | 819bedf3a1ba3f09037fe9a4a732dccbd9defb94 (diff) | |
download | bcm5719-llvm-cbbf92825f0d7a2b6925e93b58705443345ab57a.tar.gz bcm5719-llvm-cbbf92825f0d7a2b6925e93b58705443345ab57a.zip |
[clang-tidy] openmp-use-default-none - a new check
Summary:
Finds OpenMP directives that are allowed to contain `default` clause,
but either don't specify it, or the clause is specified but with the kind
other than `none`, and suggests to use `default(none)` clause.
Using `default(none)` clause changes the default variable visibility from
being implicitly determined, and thus forces developer to be explicit about the
desired data scoping for each variable.
Reviewers: JonasToth, aaron.ballman, xazax.hun, hokein, gribozavr
Reviewed By: JonasToth, aaron.ballman
Subscribers: jdoerfert, openmp-commits, klimek, sbenza, arphaman, Eugene.Zelenko, ABataev, mgorny, rnkovacs, guansong, cfe-commits
Tags: #clang-tools-extra, #openmp, #clang
Differential Revision: https://reviews.llvm.org/D57113
llvm-svn: 356801
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/openmp-use-default-none.cpp')
-rw-r--r-- | clang-tools-extra/test/clang-tidy/openmp-use-default-none.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/openmp-use-default-none.cpp b/clang-tools-extra/test/clang-tidy/openmp-use-default-none.cpp new file mode 100644 index 00000000000..1a374bde94a --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/openmp-use-default-none.cpp @@ -0,0 +1,160 @@ +// RUN: %check_clang_tidy %s openmp-use-default-none %t -- -- -x c++ -fopenmp=libomp -fopenmp-version=40 +// RUN: %check_clang_tidy %s openmp-use-default-none %t -- -- -x c -fopenmp=libomp -fopenmp-version=40 + +//----------------------------------------------------------------------------// +// Null cases. +//----------------------------------------------------------------------------// + +// 'for' directive can not have 'default' clause, no diagnostics. +void n0(const int a) { +#pragma omp for + for (int b = 0; b < a; b++) + ; +} + +//----------------------------------------------------------------------------// +// Single-directive positive cases. +//----------------------------------------------------------------------------// + +// 'parallel' directive. + +// 'parallel' directive can have 'default' clause, but said clause is not +// specified, diagnosed. +void p0_0() { +#pragma omp parallel + ; + // CHECK-NOTES: :[[@LINE-2]]:9: warning: OpenMP directive 'parallel' does not specify 'default' clause, consider specifying 'default(none)' clause +} + +// 'parallel' directive can have 'default' clause, and said clause specified, +// with 'none' kind, all good. +void p0_1() { +#pragma omp parallel default(none) + ; +} + +// 'parallel' directive can have 'default' clause, and said clause specified, +// but with 'shared' kind, which is not 'none', diagnose. +void p0_2() { +#pragma omp parallel default(shared) + ; + // CHECK-NOTES: :[[@LINE-2]]:9: warning: OpenMP directive 'parallel' specifies 'default(shared)' clause, consider using 'default(none)' clause instead + // CHECK-NOTES: :[[@LINE-3]]:22: note: existing 'default' clause specified here +} + +// 'task' directive. + +// 'task' directive can have 'default' clause, but said clause is not +// specified, diagnosed. +void p1_0() { +#pragma omp task + ; + // CHECK-NOTES: :[[@LINE-2]]:9: warning: OpenMP directive 'task' does not specify 'default' clause, consider specifying 'default(none)' clause +} + +// 'task' directive can have 'default' clause, and said clause specified, +// with 'none' kind, all good. +void p1_1() { +#pragma omp task default(none) + ; +} + +// 'task' directive can have 'default' clause, and said clause specified, +// but with 'shared' kind, which is not 'none', diagnose. +void p1_2() { +#pragma omp task default(shared) + ; + // CHECK-NOTES: :[[@LINE-2]]:9: warning: OpenMP directive 'task' specifies 'default(shared)' clause, consider using 'default(none)' clause instead + // CHECK-NOTES: :[[@LINE-3]]:18: note: existing 'default' clause specified here +} + +// 'teams' directive. (has to be inside of 'target' directive) + +// 'teams' directive can have 'default' clause, but said clause is not +// specified, diagnosed. +void p2_0() { +#pragma omp target +#pragma omp teams + ; + // CHECK-NOTES: :[[@LINE-2]]:9: warning: OpenMP directive 'teams' does not specify 'default' clause, consider specifying 'default(none)' clause +} + +// 'teams' directive can have 'default' clause, and said clause specified, +// with 'none' kind, all good. +void p2_1() { +#pragma omp target +#pragma omp teams default(none) + ; +} + +// 'teams' directive can have 'default' clause, and said clause specified, +// but with 'shared' kind, which is not 'none', diagnose. +void p2_2() { +#pragma omp target +#pragma omp teams default(shared) + ; + // CHECK-NOTES: :[[@LINE-2]]:9: warning: OpenMP directive 'teams' specifies 'default(shared)' clause, consider using 'default(none)' clause instead + // CHECK-NOTES: :[[@LINE-3]]:19: note: existing 'default' clause specified here +} + +// 'taskloop' directive. + +// 'taskloop' directive can have 'default' clause, but said clause is not +// specified, diagnosed. +void p3_0(const int a) { +#pragma omp taskloop + for (int b = 0; b < a; b++) + ; + // CHECK-NOTES: :[[@LINE-3]]:9: warning: OpenMP directive 'taskloop' does not specify 'default' clause, consider specifying 'default(none)' clause +} + +// 'taskloop' directive can have 'default' clause, and said clause specified, +// with 'none' kind, all good. +void p3_1(const int a) { +#pragma omp taskloop default(none) shared(a) + for (int b = 0; b < a; b++) + ; +} + +// 'taskloop' directive can have 'default' clause, and said clause specified, +// but with 'shared' kind, which is not 'none', diagnose. +void p3_2(const int a) { +#pragma omp taskloop default(shared) + for (int b = 0; b < a; b++) + ; + // CHECK-NOTES: :[[@LINE-3]]:9: warning: OpenMP directive 'taskloop' specifies 'default(shared)' clause, consider using 'default(none)' clause instead + // CHECK-NOTES: :[[@LINE-4]]:22: note: existing 'default' clause specified here +} + +//----------------------------------------------------------------------------// +// Combined directives. +// Let's not test every single possible permutation/combination of directives, +// but just *one* combined directive. The rest will be the same. +//----------------------------------------------------------------------------// + +// 'parallel' directive can have 'default' clause, but said clause is not +// specified, diagnosed. +void p4_0(const int a) { +#pragma omp parallel for + for (int b = 0; b < a; b++) + ; + // CHECK-NOTES: :[[@LINE-3]]:9: warning: OpenMP directive 'parallel for' does not specify 'default' clause, consider specifying 'default(none)' clause +} + +// 'parallel' directive can have 'default' clause, and said clause specified, +// with 'none' kind, all good. +void p4_1(const int a) { +#pragma omp parallel for default(none) shared(a) + for (int b = 0; b < a; b++) + ; +} + +// 'parallel' directive can have 'default' clause, and said clause specified, +// but with 'shared' kind, which is not 'none', diagnose. +void p4_2(const int a) { +#pragma omp parallel for default(shared) + for (int b = 0; b < a; b++) + ; + // CHECK-NOTES: :[[@LINE-3]]:9: warning: OpenMP directive 'parallel for' specifies 'default(shared)' clause, consider using 'default(none)' clause instead + // CHECK-NOTES: :[[@LINE-4]]:26: note: existing 'default' clause specified here +} |