// 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 }