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,
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());
--- /dev/null
+// 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