diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-07-22 06:45:04 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-07-22 06:45:04 +0000 |
commit | 9fb6e647e71678341e7a344051df439a1020aaf4 (patch) | |
tree | 917e4011ebedc52ff63737e7ee4f6e779e7861f6 /clang/test/OpenMP | |
parent | 8b5126027406918e5b1f6ff4be2e98d231bb7704 (diff) | |
download | bcm5719-llvm-9fb6e647e71678341e7a344051df439a1020aaf4.tar.gz bcm5719-llvm-9fb6e647e71678341e7a344051df439a1020aaf4.zip |
[OPENMP] Initial parsing and sema analysis for 'ordered' directive.
llvm-svn: 213616
Diffstat (limited to 'clang/test/OpenMP')
-rw-r--r-- | clang/test/OpenMP/nesting_of_regions.cpp | 239 | ||||
-rw-r--r-- | clang/test/OpenMP/ordered_ast_print.cpp | 59 | ||||
-rw-r--r-- | clang/test/OpenMP/ordered_messages.cpp | 54 |
3 files changed, 352 insertions, 0 deletions
diff --git a/clang/test/OpenMP/nesting_of_regions.cpp b/clang/test/OpenMP/nesting_of_regions.cpp index d8dcec5edf2..255f20435a0 100644 --- a/clang/test/OpenMP/nesting_of_regions.cpp +++ b/clang/test/OpenMP/nesting_of_regions.cpp @@ -71,6 +71,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp parallel + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // SIMD DIRECTIVE #pragma omp simd @@ -166,6 +171,11 @@ void foo() { #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } +#pragma omp simd + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } // FOR DIRECTIVE #pragma omp for @@ -279,6 +289,16 @@ void foo() { #pragma omp flush bar(); } +#pragma omp for + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp for ordered + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // OK + bar(); + } // SECTIONS DIRECTIVE #pragma omp sections @@ -404,6 +424,11 @@ void foo() { { #pragma omp flush } +#pragma omp sections + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // SECTION DIRECTIVE #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} @@ -550,6 +575,14 @@ void foo() { bar(); } } +#pragma omp sections + { +#pragma omp section + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } + } // SINGLE DIRECTIVE #pragma omp single @@ -655,6 +688,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp single + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // MASTER DIRECTIVE #pragma omp master @@ -760,6 +798,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp master + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // CRITICAL DIRECTIVE #pragma omp critical @@ -879,6 +922,11 @@ void foo() { } } } +#pragma omp critical + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // PARALLEL FOR DIRECTIVE #pragma omp parallel for @@ -994,6 +1042,16 @@ void foo() { #pragma omp flush bar(); } +#pragma omp parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp parallel for ordered + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // OK + bar(); + } // PARALLEL SECTIONS DIRECTIVE #pragma omp parallel sections @@ -1105,6 +1163,11 @@ void foo() { { #pragma omp flush } +#pragma omp parallel sections + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // TASK DIRECTIVE #pragma omp task @@ -1169,6 +1232,114 @@ void foo() { #pragma omp flush bar(); } +#pragma omp task + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } + +// ORDERED DIRECTIVE +#pragma omp ordered + { +#pragma omp for // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp ordered + { +#pragma omp simd + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp ordered + { +#pragma omp parallel + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp ordered + { +#pragma omp single // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} + { + bar(); + } + } +#pragma omp ordered + { +#pragma omp master // OK, though second 'ordered' is redundant + { + bar(); + } + } +#pragma omp ordered + { +#pragma omp critical + { + bar(); + } + } +#pragma omp ordered + { +#pragma omp sections // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} + { + bar(); + } + } +#pragma omp ordered + { +#pragma omp parallel for ordered + for (int j = 0; j < 10; ++j) { +#pragma omp ordered // OK + { + bar(); + } + } + } +#pragma omp ordered + { +#pragma omp parallel for + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp ordered + { +#pragma omp parallel sections + { + bar(); + } + } +#pragma omp ordered + { +#pragma omp task + { + bar(); + } + } +#pragma omp ordered + { +#pragma omp taskyield + bar(); + } +#pragma omp ordered + { +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'ordered' region}} + bar(); + } +#pragma omp ordered + { +#pragma omp taskwait + bar(); + } +#pragma omp ordered + { +#pragma omp flush + bar(); + } +#pragma omp ordered + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } } void foo() { @@ -1239,6 +1410,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp parallel + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // SIMD DIRECTIVE #pragma omp simd @@ -1327,6 +1503,11 @@ void foo() { #pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } +#pragma omp simd + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); + } // FOR DIRECTIVE #pragma omp for @@ -1427,6 +1608,16 @@ void foo() { #pragma omp flush bar(); } +#pragma omp for + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp for ordered + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // OK + bar(); + } // SECTIONS DIRECTIVE #pragma omp sections @@ -1524,6 +1715,11 @@ void foo() { { #pragma omp flush } +#pragma omp sections + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // SECTION DIRECTIVE #pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} @@ -1670,6 +1866,14 @@ void foo() { bar(); } } +#pragma omp sections + { +#pragma omp section + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } + } // SINGLE DIRECTIVE #pragma omp single @@ -1765,6 +1969,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp single + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // MASTER DIRECTIVE #pragma omp master @@ -1870,6 +2079,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp master + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // CRITICAL DIRECTIVE #pragma omp critical @@ -1989,6 +2203,11 @@ void foo() { } } } +#pragma omp critical + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // PARALLEL FOR DIRECTIVE #pragma omp parallel for @@ -2103,6 +2322,16 @@ void foo() { #pragma omp flush bar(); } +#pragma omp parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp parallel for ordered + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // OK + bar(); + } // PARALLEL SECTIONS DIRECTIVE #pragma omp parallel sections @@ -2210,6 +2439,11 @@ void foo() { { #pragma omp flush } +#pragma omp parallel sections + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } // TASK DIRECTIVE #pragma omp task @@ -2273,6 +2507,11 @@ void foo() { #pragma omp flush bar(); } +#pragma omp task + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } return foo<int>(); } diff --git a/clang/test/OpenMP/ordered_ast_print.cpp b/clang/test/OpenMP/ordered_ast_print.cpp new file mode 100644 index 00000000000..a4435007035 --- /dev/null +++ b/clang/test/OpenMP/ordered_ast_print.cpp @@ -0,0 +1,59 @@ +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp=libiomp5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER + +void foo() {} + +template <class T> +T tmain (T argc) { + T b = argc, c, d, e, f, g; + static T a; + #pragma omp for ordered + for (int i =0 ; i < argc; ++i) + #pragma omp ordered + { + a=2; + } + return (0); +} + +// CHECK: static int a; +// CHECK-NEXT: #pragma omp for ordered +// CHECK-NEXT: for (int i = 0; i < argc; ++i) +// CHECK-NEXT: #pragma omp ordered +// CHECK-NEXT: { +// CHECK-NEXT: a = 2; +// CHECK-NEXT: } + +// CHECK: static T a; +// CHECK-NEXT: #pragma omp for ordered +// CHECK-NEXT: for (int i = 0; i < argc; ++i) +// CHECK-NEXT: #pragma omp ordered +// CHECK-NEXT: { +// CHECK-NEXT: a = 2; +// CHECK-NEXT: } + +int main (int argc, char **argv) { + int b = argc, c, d, e, f, g; + static int a; +// CHECK: static int a; + #pragma omp for ordered + for (int i =0 ; i < argc; ++i) + #pragma omp ordered + { + a=2; + } +// CHECK-NEXT: #pragma omp for ordered +// CHECK-NEXT: for (int i = 0; i < argc; ++i) +// CHECK-NEXT: #pragma omp ordered +// CHECK-NEXT: { +// CHECK-NEXT: a = 2; +// CHECK-NEXT: } + return tmain(argc); +} + +#endif diff --git a/clang/test/OpenMP/ordered_messages.cpp b/clang/test/OpenMP/ordered_messages.cpp new file mode 100644 index 00000000000..3f79df64989 --- /dev/null +++ b/clang/test/OpenMP/ordered_messages.cpp @@ -0,0 +1,54 @@ +// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -ferror-limit 100 -o - %s + +int foo(); + +template <class T> +T foo() { + #pragma omp for ordered + for (int i = 0; i < 10; ++i) { + L1: + foo(); + #pragma omp ordered + { + foo(); + goto L1; // expected-error {{use of undeclared label 'L1'}} + } + } + #pragma omp for ordered + for (int i = 0; i < 10; ++i) { + foo(); + goto L2; // expected-error {{use of undeclared label 'L2'}} + #pragma omp ordered + { + L2: + foo(); + } + } + + return T(); +} + +int foo() { + #pragma omp for ordered + for (int i = 0; i < 10; ++i) { + L1: + foo(); + #pragma omp ordered + { + foo(); + goto L1; // expected-error {{use of undeclared label 'L1'}} + } + } + #pragma omp for ordered + for (int i = 0; i < 10; ++i) { + foo(); + goto L2; // expected-error {{use of undeclared label 'L2'}} + #pragma omp ordered + { + L2: + foo(); + } + } + + return foo<int>(); +} |