Author: lebedevri
Date: Fri Feb  1 07:41:54 2019
New Revision: 352882

URL: http://llvm.org/viewvc/llvm-project?rev=352882&view=rev
Log:
[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

Added:
    cfe/trunk/test/AST/ast-dump-openmp-sections.cpp
Modified:
    cfe/trunk/lib/Sema/SemaOpenMP.cpp

Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=352882&r1=352881&r2=352882&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Fri Feb  1 07:41:54 2019
@@ -5969,6 +5969,13 @@ StmtResult Sema::ActOnOpenMPSectionsDire
     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::ActOnOpenMPSectionDirec
 
   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());
 

Added: cfe/trunk/test/AST/ast-dump-openmp-sections.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/AST/ast-dump-openmp-sections.cpp?rev=352882&view=auto
==============================================================================
--- cfe/trunk/test/AST/ast-dump-openmp-sections.cpp (added)
+++ cfe/trunk/test/AST/ast-dump-openmp-sections.cpp Fri Feb  1 07:41:54 2019
@@ -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


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to