diff options
| author | Alexander Musman <alexander.musman@gmail.com> | 2014-07-21 09:42:05 +0000 |
|---|---|---|
| committer | Alexander Musman <alexander.musman@gmail.com> | 2014-07-21 09:42:05 +0000 |
| commit | d9ed09f7a5f149ea3ed7904f83ed70bf12963842 (patch) | |
| tree | b4efe1d3d62612141434996c2c6d7db1fe730d27 /clang/test | |
| parent | ddf36dea135db24d073acd8dbc1251dc798624bb (diff) | |
| download | bcm5719-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.cpp | 29 | ||||
| -rw-r--r-- | clang/test/OpenMP/critical_messages.cpp | 72 | ||||
| -rw-r--r-- | clang/test/OpenMP/nesting_of_regions.cpp | 355 |
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) ; |

