summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorAlexander Musman <alexander.musman@gmail.com>2014-07-21 09:42:05 +0000
committerAlexander Musman <alexander.musman@gmail.com>2014-07-21 09:42:05 +0000
commitd9ed09f7a5f149ea3ed7904f83ed70bf12963842 (patch)
treeb4efe1d3d62612141434996c2c6d7db1fe730d27 /clang/test
parentddf36dea135db24d073acd8dbc1251dc798624bb (diff)
downloadbcm5719-llvm-d9ed09f7a5f149ea3ed7904f83ed70bf12963842.tar.gz
bcm5719-llvm-d9ed09f7a5f149ea3ed7904f83ed70bf12963842.zip
[OPENMP] Parsing/Sema of the OpenMP directive 'critical'.
llvm-svn: 213510
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/OpenMP/critical_ast_print.cpp29
-rw-r--r--clang/test/OpenMP/critical_messages.cpp72
-rw-r--r--clang/test/OpenMP/nesting_of_regions.cpp355
3 files changed, 455 insertions, 1 deletions
diff --git a/clang/test/OpenMP/critical_ast_print.cpp b/clang/test/OpenMP/critical_ast_print.cpp
new file mode 100644
index 00000000000..98ece88e0f7
--- /dev/null
+++ b/clang/test/OpenMP/critical_ast_print.cpp
@@ -0,0 +1,29 @@
+// 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 critical
+ a=2;
+// CHECK-NEXT: #pragma omp critical
+// CHECK-NEXT: a = 2;
+// CHECK-NEXT: ++a;
+ ++a;
+#pragma omp critical (the_name)
+ foo();
+// CHECK-NEXT: #pragma omp critical (the_name)
+// CHECK-NEXT: foo();
+// CHECK-NEXT: return 0;
+ return 0;
+}
+
+#endif
diff --git a/clang/test/OpenMP/critical_messages.cpp b/clang/test/OpenMP/critical_messages.cpp
new file mode 100644
index 00000000000..08df9e0666e
--- /dev/null
+++ b/clang/test/OpenMP/critical_messages.cpp
@@ -0,0 +1,72 @@
+// RUN: %clang_cc1 -verify -fopenmp=libiomp5 %s
+
+int foo();
+
+int main() {
+ #pragma omp critical
+ ;
+ #pragma omp critical untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp critical'}}
+ #pragma omp critical unknown // expected-warning {{extra tokens at the end of '#pragma omp critical' are ignored}}
+ #pragma omp critical ( // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+ #pragma omp critical ( + // expected-error {{expected identifier}} expected-error {{expected ')'}} expected-note {{to match this '('}}
+ #pragma omp critical (name // expected-error {{expected ')'}} expected-note {{to match this '('}}
+ #pragma omp critical (name1)
+ foo();
+ {
+ #pragma omp critical
+ } // expected-error {{expected statement}}
+ #pragma omp critical (name) // expected-note {{previous 'critical' region starts here}}
+ #pragma omp critical
+ for (int i = 0; i < 10; ++i) {
+ foo();
+ #pragma omp parallel
+ #pragma omp for
+ for (int j = 0; j < 10; j++) {
+ foo();
+ #pragma omp critical(name) // expected-error {{cannot nest 'critical' regions having the same name 'name'}}
+ foo();
+ }
+ }
+ #pragma omp critical (name)
+ #pragma omp critical
+ for (int i = 0; i < 10; ++i) {
+ foo();
+ #pragma omp parallel
+ #pragma omp for
+ for (int j = 0; j < 10; j++) {
+ #pragma omp critical
+ foo();
+ }
+ }
+ #pragma omp critical (name)
+ #pragma omp critical
+ for (int i = 0; i < 10; ++i) {
+ foo();
+ #pragma omp parallel
+ #pragma omp for
+ for (int j = 0; j < 10; j++) {
+ #pragma omp critical (nam)
+ foo();
+ }
+ }
+
+ return 0;
+}
+
+int foo() {
+ L1:
+ foo();
+ #pragma omp critical
+ {
+ foo();
+ goto L1; // expected-error {{use of undeclared label 'L1'}}
+ }
+ goto L2; // expected-error {{use of undeclared label 'L2'}}
+ #pragma omp critical
+ {
+ L2:
+ foo();
+ }
+
+ return 0;
+}
diff --git a/clang/test/OpenMP/nesting_of_regions.cpp b/clang/test/OpenMP/nesting_of_regions.cpp
index 534c8a502c6..7224ceb00c4 100644
--- a/clang/test/OpenMP/nesting_of_regions.cpp
+++ b/clang/test/OpenMP/nesting_of_regions.cpp
@@ -33,6 +33,11 @@ void foo() {
bar();
}
#pragma omp parallel
+#pragma omp critical
+ {
+ bar();
+ }
+#pragma omp parallel
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -111,6 +116,13 @@ void foo() {
}
#pragma omp simd
for (int i = 0; i < 10; ++i) {
+#pragma omp critical // 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)
;
@@ -193,7 +205,13 @@ void foo() {
bar();
}
}
-
+#pragma omp for
+ for (int i = 0; i < 10; ++i) {
+#pragma omp critical
+ {
+ bar();
+ }
+ }
#pragma omp for
for (int i = 0; i < 10; ++i) {
#pragma omp parallel
@@ -318,6 +336,25 @@ void foo() {
}
#pragma omp sections
{
+#pragma omp parallel
+ {
+#pragma omp critical(A) // OK
+ {
+ bar();
+ }
+#pragma omp for // OK
+ for (int i = 0; i < 10; ++i)
+ ;
+#pragma omp critical // OK
+ {
+ bar();
+ }
+ }
+#pragma omp critical(A) // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}}
+ bar();
+ }
+#pragma omp sections
+ {
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -409,6 +446,8 @@ void foo() {
bar();
#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
bar();
+#pragma omp critical
+ bar();
}
}
#pragma omp sections
@@ -520,6 +559,13 @@ void foo() {
}
#pragma omp single
{
+#pragma omp critical
+ {
+ 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();
@@ -613,6 +659,13 @@ void foo() {
}
#pragma omp master
{
+#pragma omp critical
+ {
+ 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();
@@ -671,6 +724,125 @@ void foo() {
bar();
}
+// CRITICAL DIRECTIVE
+#pragma omp critical
+ {
+#pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp simd
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp parallel
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp master // OK, though second 'master' is redundant
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp critical
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#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 critical
+ {
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp parallel sections
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp task
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp taskyield
+ bar();
+ }
+#pragma omp critical
+ {
+#pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}}
+ bar();
+ }
+#pragma omp critical
+ {
+#pragma omp taskwait
+ bar();
+ }
+#pragma omp critical(Tuzik)
+ {
+#pragma omp critical(grelka)
+ bar();
+ }
+#pragma omp critical(Belka)// expected-note {{previous 'critical' region starts here}}
+ {
+#pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}}
+ {
+#pragma omp critical(Tuzik)
+ {
+#pragma omp parallel
+#pragma omp critical(grelka)
+ {
+ bar();
+ }
+ }
+ }
+ }
+
// PARALLEL FOR DIRECTIVE
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
@@ -722,6 +894,14 @@ void foo() {
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
+#pragma omp critical
+ {
+ bar();
+ }
+ }
+
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i) {
#pragma omp parallel
{
#pragma omp single // OK
@@ -824,6 +1004,14 @@ void foo() {
}
#pragma omp parallel sections
{
+#pragma omp section
+ {
+#pragma omp critical
+ bar();
+ }
+ }
+#pragma omp parallel sections
+ {
#pragma omp parallel
{
#pragma omp single // OK
@@ -898,6 +1086,10 @@ void foo() {
#pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
bar();
#pragma omp task
+#pragma omp critical
+ bar();
+
+#pragma omp task
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -960,6 +1152,9 @@ void foo() {
#pragma omp master
bar();
#pragma omp parallel
+#pragma omp critical
+ bar();
+#pragma omp parallel
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
@@ -1031,6 +1226,13 @@ void foo() {
}
#pragma omp simd
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 critical // 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)
;
@@ -1104,6 +1306,8 @@ void foo() {
bar();
#pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}}
bar();
+#pragma omp critical
+ bar();
}
#pragma omp for
for (int i = 0; i < 10; ++i) {
@@ -1193,6 +1397,8 @@ void foo() {
}
#pragma omp sections
{
+#pragma omp critical
+ bar();
#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}}
@@ -1309,6 +1515,8 @@ void foo() {
bar();
#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
bar();
+#pragma omp critical
+ bar();
}
}
#pragma omp sections
@@ -1412,6 +1620,8 @@ void foo() {
}
#pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}}
bar();
+#pragma omp critical
+ bar();
}
#pragma omp single
{
@@ -1508,6 +1718,13 @@ void foo() {
}
#pragma omp master
{
+#pragma omp critical
+ {
+ 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();
@@ -1566,6 +1783,125 @@ void foo() {
bar();
}
+// CRITICAL DIRECTIVE
+#pragma omp critical
+ {
+#pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp simd
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp parallel
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp master // OK, though second 'master' is redundant
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp critical
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}}
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#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 critical
+ {
+#pragma omp parallel for
+ for (int i = 0; i < 10; ++i)
+ ;
+ }
+#pragma omp critical
+ {
+#pragma omp parallel sections
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp task
+ {
+ bar();
+ }
+ }
+#pragma omp critical
+ {
+#pragma omp taskyield
+ bar();
+ }
+#pragma omp critical
+ {
+#pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}}
+ bar();
+ }
+#pragma omp critical
+ {
+#pragma omp taskwait
+ bar();
+ }
+#pragma omp critical(Belka)
+ {
+#pragma omp critical(Strelka)
+ bar();
+ }
+#pragma omp critical(Tuzik)// expected-note {{previous 'critical' region starts here}}
+ {
+#pragma omp critical(grelka) // expected-note {{previous 'critical' region starts here}}
+ {
+#pragma omp critical(Tuzik) // expected-error {{cannot nest 'critical' regions having the same name 'Tuzik'}}
+ {
+#pragma omp parallel
+#pragma omp critical(grelka) // expected-error {{cannot nest 'critical' regions having the same name 'grelka'}}
+ {
+ bar();
+ }
+ }
+ }
+ }
+
// PARALLEL FOR DIRECTIVE
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
@@ -1609,6 +1945,10 @@ void foo() {
{
bar();
}
+#pragma omp critical
+ {
+ bar();
+ }
}
#pragma omp parallel for
for (int i = 0; i < 10; ++i) {
@@ -1622,6 +1962,10 @@ void foo() {
{
bar();
}
+#pragma omp critical // OK
+ {
+ bar();
+ }
#pragma omp for // OK
for (int i = 0; i < 10; ++i)
;
@@ -1708,6 +2052,8 @@ void foo() {
bar();
#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}}
bar();
+#pragma omp critical
+ bar();
}
}
#pragma omp parallel sections
@@ -1722,6 +2068,10 @@ void foo() {
{
bar();
}
+#pragma omp critical // OK
+ {
+ bar();
+ }
#pragma omp for // OK
for (int i = 0; i < 10; ++i)
;
@@ -1790,6 +2140,9 @@ void foo() {
#pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}}
bar();
#pragma omp task
+#pragma omp critical
+ bar();
+#pragma omp task
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
;
OpenPOWER on IntegriCloud