summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2019-02-01 15:41:54 +0000
committerRoman Lebedev <lebedev.ri@gmail.com>2019-02-01 15:41:54 +0000
commit9fb113e21819ea20565f8d6b958823531b2ab040 (patch)
tree21415c1b06f232ca29cba8a1c9e0606f356f1972
parentf8699965eca3dcc15cadd341e4201a9d44aeaa04 (diff)
downloadbcm5719-llvm-9fb113e21819ea20565f8d6b958823531b2ab040.tar.gz
bcm5719-llvm-9fb113e21819ea20565f8d6b958823531b2ab040.zip
[AST][OpenMP] OpenMP Sections / Section constructs contain Structured blocks
Summary: I'm working on a clang-tidy check, much like existing [[ http://clang.llvm.org/extra/clang-tidy/checks/bugprone-exception-escape.html | bugprone-exception-escape ]], to detect when an exception might escape out of an OpenMP construct it isn't supposed to escape from. For that i will be using the `nothrow` bit of `CapturedDecl`s. While that bit is already correctly set for some constructs, e.g. `#pragma omp parallel`: https://godbolt.org/z/2La7pv it isn't set for the `#pragma omp sections`, or `#pragma omp section`: https://godbolt.org/z/qZ-EbP If i'm reading [[ https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5.0.pdf | `OpenMP Application Programming Interface Version 5.0 November 2018` ]] correctly, they should be, as per `2.8.1 sections Construct`, starting with page 86: * The sections construct is a non-iterative worksharing construct that contains a set of **structured blocks** that are to be distributed among and executed by the threads in a team. Each **structured block** is executed once by one of the threads in the team in the context of its implicit task. * The syntax of the sections construct is as follows: #pragma omp sections [clause[ [,] clause] ... ] new-line { [#pragma omp section new-line] **structured-block** ... * Description Each **structured block** in the sections construct is preceded by a section directive except possibly **the first block**, for which a preceding section directive is optional. * Restrictions • The code enclosed in a sections construct must be a **structured block**. * A throw executed inside a sections region must cause execution to resume within the same section of the sections region, and the same thread that threw the exception must catch it. Reviewers: ABataev, #openmp Reviewed By: ABataev Subscribers: guansong, openmp-commits, cfe-commits Tags: #clang, #openmp Differential Revision: https://reviews.llvm.org/D57585 llvm-svn: 352882
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp14
-rw-r--r--clang/test/AST/ast-dump-openmp-sections.cpp57
2 files changed, 71 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index d28f15fe07a..59a40ec41c7 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -5969,6 +5969,13 @@ StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
return StmtError();
}
+ // 1.2.2 OpenMP Language Terminology
+ // Structured block - An executable statement with a single entry at the
+ // top and a single exit at the bottom.
+ // The point of exit cannot be a branch out of the structured block.
+ // longjmp() and throw() must not violate the entry/exit criteria.
+ cast<CapturedStmt>(AStmt)->getCapturedDecl()->setNothrow();
+
setFunctionHasBranchProtectedScope();
return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
@@ -5983,6 +5990,13 @@ StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
+ // 1.2.2 OpenMP Language Terminology
+ // Structured block - An executable statement with a single entry at the
+ // top and a single exit at the bottom.
+ // The point of exit cannot be a branch out of the structured block.
+ // longjmp() and throw() must not violate the entry/exit criteria.
+ cast<CapturedStmt>(AStmt)->getCapturedDecl()->setNothrow();
+
setFunctionHasBranchProtectedScope();
DSAStack->setParentCancelRegion(DSAStack->isCancelRegion());
diff --git a/clang/test/AST/ast-dump-openmp-sections.cpp b/clang/test/AST/ast-dump-openmp-sections.cpp
new file mode 100644
index 00000000000..79bb751a6e1
--- /dev/null
+++ b/clang/test/AST/ast-dump-openmp-sections.cpp
@@ -0,0 +1,57 @@
+// RUN: %clang_cc1 -verify -fopenmp -ast-dump %s | FileCheck %s
+// RUN: %clang_cc1 -verify -fopenmp-simd -ast-dump %s | FileCheck %s
+// expected-no-diagnostics
+
+void sections() {
+#pragma omp sections
+ {
+#pragma omp section
+ {
+ }
+#pragma omp section
+ {
+ }
+ }
+}
+
+// CHECK: `-FunctionDecl
+// CHECK-NEXT: `-CompoundStmt
+// CHECK-NEXT: `-OMPSectionsDirective
+// CHECK-NEXT: `-CapturedStmt
+// CHECK-NEXT: `-CapturedDecl {{.*}} nothrow
+// CHECK-NEXT: |-CompoundStmt
+// CHECK-NEXT: | |-OMPSectionDirective
+// CHECK-NEXT: | | `-CapturedStmt
+// CHECK-NEXT: | | `-CapturedDecl {{.*}} nothrow
+// CHECK-NEXT: | | |-CompoundStmt
+// CHECK-NEXT: | | `-ImplicitParamDecl
+// CHECK-NEXT: | `-OMPSectionDirective
+// CHECK-NEXT: | `-CapturedStmt
+// CHECK-NEXT: | `-CapturedDecl {{.*}} nothrow
+// CHECK-NEXT: | |-CompoundStmt
+// CHECK-NEXT: | `-ImplicitParamDecl
+// CHECK-NEXT: |-ImplicitParamDecl
+// CHECK-NEXT: |-CXXRecordDecl
+// CHECK-NEXT: | |-DefinitionData
+// CHECK-NEXT: | | |-DefaultConstructor
+// CHECK-NEXT: | | |-CopyConstructor
+// CHECK-NEXT: | | |-MoveConstructor
+// CHECK-NEXT: | | |-CopyAssignment
+// CHECK-NEXT: | | |-MoveAssignment
+// CHECK-NEXT: | | `-Destructor
+// CHECK-NEXT: | `-CapturedRecordAttr
+// CHECK-NEXT: |-CapturedDecl {{.*}} nothrow
+// CHECK-NEXT: | |-CompoundStmt
+// CHECK-NEXT: | `-ImplicitParamDecl
+// CHECK-NEXT: |-CXXRecordDecl
+// CHECK-NEXT: | |-DefinitionData
+// CHECK-NEXT: | | |-DefaultConstructor
+// CHECK-NEXT: | | |-CopyConstructor
+// CHECK-NEXT: | | |-MoveConstructor
+// CHECK-NEXT: | | |-CopyAssignment
+// CHECK-NEXT: | | |-MoveAssignment
+// CHECK-NEXT: | | `-Destructor
+// CHECK-NEXT: | `-CapturedRecordAttr
+// CHECK-NEXT: `-CapturedDecl {{.*}} nothrow
+// CHECK-NEXT: |-CompoundStmt
+// CHECK-NEXT: `-ImplicitParamDecl
OpenPOWER on IntegriCloud