summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/OpenMP/master_ast_print.cpp32
-rw-r--r--clang/test/OpenMP/master_messages.cpp64
-rw-r--r--clang/test/OpenMP/nesting_of_regions.cpp257
3 files changed, 353 insertions, 0 deletions
diff --git a/clang/test/OpenMP/master_ast_print.cpp b/clang/test/OpenMP/master_ast_print.cpp
new file mode 100644
index 00000000000..7ce4c10020c
--- /dev/null
+++ b/clang/test/OpenMP/master_ast_print.cpp
@@ -0,0 +1,32 @@
+// 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() {}
+
+int main (int argc, char **argv) {
+ int b = argc, c, d, e, f, g;
+ static int a;
+// CHECK: static int a;
+#pragma omp parallel
+{
+#pragma omp master
+{
+ a=2;
+}
+}
+// CHECK-NEXT: #pragma omp parallel
+// CHECK-NEXT: {
+// CHECK-NEXT: #pragma omp master
+// CHECK-NEXT: {
+// CHECK-NEXT: a = 2;
+// CHECK-NEXT: }
+// CHECK-NEXT: }
+ return (0);
+}
+
+#endif
diff --git a/clang/test/OpenMP/master_messages.cpp b/clang/test/OpenMP/master_messages.cpp
new file mode 100644
index 00000000000..fbe35ac68e4
--- /dev/null
+++ b/clang/test/OpenMP/master_messages.cpp
@@ -0,0 +1,64 @@
+// RUN: %clang_cc1 -verify -fopenmp=libiomp5 %s
+
+int foo();
+
+int main() {
+ #pragma omp master
+ ;
+ #pragma omp master nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp master'}}
+ #pragma omp master unknown // expected-warning {{extra tokens at the end of '#pragma omp master' are ignored}}
+ foo();
+ {
+ #pragma omp master
+ } // expected-error {{expected statement}}
+ #pragma omp for
+ for (int i = 0; i < 10; ++i) {
+ foo();
+ #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
+ foo();
+ }
+ #pragma omp sections
+ {
+ foo();
+ #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
+ foo();
+ }
+ #pragma omp single
+ for (int i = 0; i < 10; ++i) {
+ foo();
+ #pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
+ foo();
+ }
+ #pragma omp master
+ for (int i = 0; i < 10; ++i) {
+ foo();
+ #pragma omp master
+ foo();
+ }
+ #pragma omp for ordered
+ for (int i = 0; i < 10; ++i)
+ #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
+ {
+ foo();
+ }
+
+ return 0;
+}
+
+int foo() {
+ L1:
+ foo();
+ #pragma omp master
+ {
+ foo();
+ goto L1; // expected-error {{use of undeclared label 'L1'}}
+ }
+ goto L2; // expected-error {{use of undeclared label 'L2'}}
+ #pragma omp master
+ {
+ L2:
+ foo();
+ }
+
+ return 0;
+}
diff --git a/clang/test/OpenMP/nesting_of_regions.cpp b/clang/test/OpenMP/nesting_of_regions.cpp
index c2e252673f1..d61ac3f11b3 100644
--- a/clang/test/OpenMP/nesting_of_regions.cpp
+++ b/clang/test/OpenMP/nesting_of_regions.cpp
@@ -26,6 +26,12 @@ void foo() {
#pragma omp parallel
#pragma omp single
bar();
+
+#pragma omp parallel
+#pragma omp master
+ {
+ bar();
+ }
#pragma omp parallel
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
@@ -83,6 +89,13 @@ void foo() {
}
#pragma omp simd
for (int i = 0; i < 10; ++i) {
+#pragma omp master // 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 parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}
for (int i = 0; i < 10; ++i)
;
@@ -142,6 +155,15 @@ void foo() {
bar();
}
}
+
+#pragma omp for
+ for (int i = 0; i < 10; ++i) {
+#pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
+ {
+ bar();
+ }
+ }
+
#pragma omp for
for (int i = 0; i < 10; ++i) {
#pragma omp parallel
@@ -232,6 +254,25 @@ void foo() {
}
#pragma omp sections
{
+#pragma omp parallel
+ {
+#pragma omp master // OK
+ {
+ bar();
+ }
+#pragma omp for // OK
+ for (int i = 0; i < 10; ++i)
+ ;
+#pragma omp master // OK
+ {
+ bar();
+ }
+ }
+#pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
+ bar();
+ }
+#pragma omp sections
+ {
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -309,6 +350,8 @@ void foo() {
{
#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
+#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
+ bar();
}
}
#pragma omp sections
@@ -389,6 +432,13 @@ void foo() {
}
#pragma omp single
{
+#pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
+ {
+ bar();
+ }
+ }
+#pragma omp single
+ {
#pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
{
bar();
@@ -432,6 +482,84 @@ void foo() {
}
}
+// MASTER DIRECTIVE
+#pragma omp master
+ {
+#pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp simd
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp parallel
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp master // OK, though second 'master' is redundant
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp parallel
+ {
+#pragma omp master // OK
+ {
+ bar();
+ }
+#pragma omp for // OK
+ for (int i = 0; i < 10; ++i)
+ ;
+#pragma omp sections // OK
+ {
+ bar();
+ }
+ }
+ }
+#pragma omp master
+ {
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp parallel sections
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp task
+ {
+ bar();
+ }
+ }
+
// PARALLEL FOR DIRECTIVE
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
@@ -472,6 +600,15 @@ void foo() {
bar();
}
}
+
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i) {
+#pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}}
+ {
+ bar();
+ }
+ }
+
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
#pragma omp parallel
@@ -553,6 +690,14 @@ void foo() {
}
#pragma omp parallel sections
{
+#pragma omp section
+ {
+#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
+ bar();
+ }
+ }
+#pragma omp parallel sections
+ {
#pragma omp parallel
{
#pragma omp single // OK
@@ -612,6 +757,9 @@ void foo() {
#pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
#pragma omp task
+#pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
+ bar();
+#pragma omp task
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -625,6 +773,7 @@ void foo() {
{
bar();
}
+
}
void foo() {
@@ -656,6 +805,9 @@ void foo() {
#pragma omp single
bar();
#pragma omp parallel
+#pragma omp master
+ bar();
+#pragma omp parallel
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -707,6 +859,8 @@ void foo() {
for (int i = 0; i < 10; ++i) {
#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}
bar();
+#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}
+ bar();
}
#pragma omp simd
for (int i = 0; i < 10; ++i) {
@@ -766,6 +920,8 @@ void foo() {
for (int i = 0; i < 10; ++i) {
#pragma omp single // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
+#pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
+ bar();
}
#pragma omp for
for (int i = 0; i < 10; ++i) {
@@ -842,6 +998,8 @@ void foo() {
{
#pragma omp single // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
+#pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}}
+ bar();
}
#pragma omp sections
{
@@ -939,6 +1097,8 @@ void foo() {
{
#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
+#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
+ bar();
}
}
#pragma omp sections
@@ -1016,6 +1176,8 @@ void foo() {
{
bar();
}
+#pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
+ bar();
}
#pragma omp single
{
@@ -1062,6 +1224,84 @@ void foo() {
}
}
+// MASTER DIRECTIVE
+#pragma omp master
+ {
+#pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp simd
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp parallel
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp master // OK, though second 'master' is redundant
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp parallel
+ {
+#pragma omp master // OK
+ {
+ bar();
+ }
+#pragma omp for // OK
+ for (int i = 0; i < 10; ++i)
+ ;
+#pragma omp sections // OK
+ {
+ bar();
+ }
+ }
+ }
+#pragma omp master
+ {
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp master
+ {
+#pragma omp parallel sections
+ {
+ bar();
+ }
+ }
+#pragma omp master
+ {
+#pragma omp task
+ {
+ bar();
+ }
+ }
+
// PARALLEL FOR DIRECTIVE
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
@@ -1101,6 +1341,10 @@ void foo() {
{
bar();
}
+#pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}}
+ {
+ bar();
+ }
}
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
@@ -1110,6 +1354,10 @@ void foo() {
{
bar();
}
+#pragma omp master // OK
+ {
+ bar();
+ }
#pragma omp for // OK
for (int i = 0; i < 10; ++i)
;
@@ -1179,6 +1427,8 @@ void foo() {
{
#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
+#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
+ bar();
}
}
#pragma omp parallel sections
@@ -1189,6 +1439,10 @@ void foo() {
{
bar();
}
+#pragma omp master // OK
+ {
+ bar();
+ }
#pragma omp for // OK
for (int i = 0; i < 10; ++i)
;
@@ -1242,6 +1496,9 @@ void foo() {
#pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
bar();
#pragma omp task
+#pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
+ bar();
+#pragma omp task
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
OpenPOWER on IntegriCloud