Index: lib/Sema/SemaOpenMP.cpp =================================================================== --- lib/Sema/SemaOpenMP.cpp +++ lib/Sema/SemaOpenMP.cpp @@ -5969,6 +5969,13 @@ 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(AStmt)->getCapturedDecl()->setNothrow(); + setFunctionHasBranchProtectedScope(); return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt, @@ -5983,6 +5990,13 @@ assert(isa(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(AStmt)->getCapturedDecl()->setNothrow(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentCancelRegion(DSAStack->isCancelRegion()); Index: test/AST/ast-dump-openmp-sections.cpp =================================================================== --- test/AST/ast-dump-openmp-sections.cpp +++ 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