From ceabd41cf742262aaceef7bb8d35557350b474a5 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Thu, 30 Nov 2017 18:01:54 +0000 Subject: [PATCH] [OPENMP] Fix possible assert for target regions with incorrect inner teams region. If the inner teams region is not correct, it may cause an assertion when processing outer target region. Patch fixes this problem. llvm-svn: 319450 --- clang/lib/Sema/SemaOpenMP.cpp | 15 ++++++++++++++- .../OpenMP/teams_distribute_loop_messages.cpp | 3 +++ .../teams_distribute_parallel_for_messages.cpp | 3 +++ ...eams_distribute_parallel_for_simd_messages.cpp | 3 +++ .../OpenMP/teams_distribute_simd_messages.cpp | 3 +++ clang/test/OpenMP/teams_messages.cpp | 3 +++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 68497cb2df5d..19dffac5f383 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -2674,7 +2674,6 @@ static bool checkNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, NestingProhibited = ParentRegion != OMPD_target; OrphanSeen = ParentRegion == OMPD_unknown; Recommend = ShouldBeInTargetRegion; - Stack->setParentTeamsRegionLoc(Stack->getConstructLoc()); } if (!NestingProhibited && !isOpenMPTargetExecutionDirective(CurrentRegion) && @@ -6569,6 +6568,8 @@ StmtResult Sema::ActOnOpenMPTeamsDirective(ArrayRef Clauses, getCurFunction()->setHasBranchProtectedScope(); + DSAStack->setParentTeamsRegionLoc(StartLoc); + return OMPTeamsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); } @@ -7071,6 +7072,9 @@ StmtResult Sema::ActOnOpenMPTeamsDistributeDirective( "omp teams distribute loop exprs were not built"); getCurFunction()->setHasBranchProtectedScope(); + + DSAStack->setParentTeamsRegionLoc(StartLoc); + return OMPTeamsDistributeDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7119,6 +7123,9 @@ StmtResult Sema::ActOnOpenMPTeamsDistributeSimdDirective( return StmtError(); getCurFunction()->setHasBranchProtectedScope(); + + DSAStack->setParentTeamsRegionLoc(StartLoc); + return OMPTeamsDistributeSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7167,6 +7174,9 @@ StmtResult Sema::ActOnOpenMPTeamsDistributeParallelForSimdDirective( return StmtError(); getCurFunction()->setHasBranchProtectedScope(); + + DSAStack->setParentTeamsRegionLoc(StartLoc); + return OMPTeamsDistributeParallelForSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7213,6 +7223,9 @@ StmtResult Sema::ActOnOpenMPTeamsDistributeParallelForDirective( "omp for loop exprs were not built"); getCurFunction()->setHasBranchProtectedScope(); + + DSAStack->setParentTeamsRegionLoc(StartLoc); + return OMPTeamsDistributeParallelForDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); diff --git a/clang/test/OpenMP/teams_distribute_loop_messages.cpp b/clang/test/OpenMP/teams_distribute_loop_messages.cpp index ea2604eebf0f..fcec84e9d3af 100644 --- a/clang/test/OpenMP/teams_distribute_loop_messages.cpp +++ b/clang/test/OpenMP/teams_distribute_loop_messages.cpp @@ -689,6 +689,9 @@ void test_loop_eh() { void g() { throw 0; } }; } + #pragma omp target + #pragma omp teams distribute + f; // expected-error {{use of undeclared identifier 'f'}} } void test_loop_firstprivate_lastprivate() { diff --git a/clang/test/OpenMP/teams_distribute_parallel_for_messages.cpp b/clang/test/OpenMP/teams_distribute_parallel_for_messages.cpp index 9b8d756ba3bd..9843b442e5b4 100644 --- a/clang/test/OpenMP/teams_distribute_parallel_for_messages.cpp +++ b/clang/test/OpenMP/teams_distribute_parallel_for_messages.cpp @@ -9,6 +9,9 @@ static int pvt; #pragma omp teams distribute parallel for // expected-error {{unexpected OpenMP directive '#pragma omp teams distribute parallel for'}} int main(int argc, char **argv) { + #pragma omp target + #pragma omp teams distribute parallel for + f; // expected-error {{use of undeclared identifier 'f'}} #pragma omp target #pragma omp teams distribute parallel for { // expected-warning {{extra tokens at the end of '#pragma omp teams distribute parallel for' are ignored}} for (int i = 0; i < argc; ++i) diff --git a/clang/test/OpenMP/teams_distribute_parallel_for_simd_messages.cpp b/clang/test/OpenMP/teams_distribute_parallel_for_simd_messages.cpp index 7876c38980ee..12ac8f9a9479 100644 --- a/clang/test/OpenMP/teams_distribute_parallel_for_simd_messages.cpp +++ b/clang/test/OpenMP/teams_distribute_parallel_for_simd_messages.cpp @@ -9,6 +9,9 @@ static int pvt; #pragma omp teams distribute parallel for simd // expected-error {{unexpected OpenMP directive '#pragma omp teams distribute parallel for simd'}} int main(int argc, char **argv) { + #pragma omp target + #pragma omp teams distribute parallel for simd + f; // expected-error {{use of undeclared identifier 'f'}} #pragma omp target #pragma omp teams distribute parallel for simd { // expected-warning {{extra tokens at the end of '#pragma omp teams distribute parallel for simd' are ignored}} for (int i = 0; i < argc; ++i) diff --git a/clang/test/OpenMP/teams_distribute_simd_messages.cpp b/clang/test/OpenMP/teams_distribute_simd_messages.cpp index 9095caf38787..b00de796b0ed 100644 --- a/clang/test/OpenMP/teams_distribute_simd_messages.cpp +++ b/clang/test/OpenMP/teams_distribute_simd_messages.cpp @@ -9,6 +9,9 @@ static int pvt; #pragma omp teams distribute simd // expected-error {{unexpected OpenMP directive '#pragma omp teams distribute simd'}} int main(int argc, char **argv) { + #pragma omp target + #pragma omp teams distribute simd + f; // expected-error {{use of undeclared identifier 'f'}} #pragma omp target #pragma omp teams distribute simd { // expected-warning {{extra tokens at the end of '#pragma omp teams distribute simd' are ignored}} for (int i = 0; i < argc; ++i) diff --git a/clang/test/OpenMP/teams_messages.cpp b/clang/test/OpenMP/teams_messages.cpp index 3a42a0e8dd6a..642fe73cac75 100644 --- a/clang/test/OpenMP/teams_messages.cpp +++ b/clang/test/OpenMP/teams_messages.cpp @@ -6,6 +6,9 @@ void foo() { #pragma omp teams // expected-error {{unexpected OpenMP directive '#pragma omp teams'}} int main(int argc, char **argv) { + #pragma omp target + #pragma omp teams + f; // expected-error {{use of undeclared identifier 'f'}} #pragma omp target #pragma omp teams { // expected-warning {{extra tokens at the end of '#pragma omp teams' are ignored}} foo(); -- GitLab