diff options
| author | Roman Lebedev <lebedev.ri@gmail.com> | 2019-02-01 15:41:54 +0000 |
|---|---|---|
| committer | Roman Lebedev <lebedev.ri@gmail.com> | 2019-02-01 15:41:54 +0000 |
| commit | 9fb113e21819ea20565f8d6b958823531b2ab040 (patch) | |
| tree | 21415c1b06f232ca29cba8a1c9e0606f356f1972 | |
| parent | f8699965eca3dcc15cadd341e4201a9d44aeaa04 (diff) | |
| download | bcm5719-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.cpp | 14 | ||||
| -rw-r--r-- | clang/test/AST/ast-dump-openmp-sections.cpp | 57 |
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 |

