From: Alexey Bataev Date: Thu, 2 Apr 2015 13:07:08 +0000 (+0000) Subject: [OPENMP] Fix crash on private variables not used in OpenMP region in templates. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae50cf734287c9b34c6c06487930341ca51579ae;p=clang [OPENMP] Fix crash on private variables not used in OpenMP region in templates. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233913 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 7b449537c7..9255220781 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -1199,7 +1199,7 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, if (isOpenMPPrivate(Clause->getClauseKind())) { for (auto *VarRef : Clause->children()) { if (auto *E = cast_or_null(VarRef)) { - MarkDeclarationsReferencedInExpr(cast(E)); + MarkDeclarationsReferencedInExpr(E); } } } diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 6116a78dc7..df0e4b316d 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -6670,7 +6670,16 @@ StmtResult TreeTransform::TransformOMPExecutableDirective( if (!D->getAssociatedStmt()) { return StmtError(); } - AssociatedStmt = getDerived().TransformStmt(D->getAssociatedStmt()); + getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), + /*CurScope=*/nullptr); + StmtResult Body; + { + Sema::CompoundScopeRAII CompoundScope(getSema()); + Body = getDerived().TransformStmt( + cast(D->getAssociatedStmt())->getCapturedStmt()); + } + AssociatedStmt = + getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); if (AssociatedStmt.isInvalid()) { return StmtError(); } diff --git a/test/OpenMP/parallel_firstprivate_codegen.cpp b/test/OpenMP/parallel_firstprivate_codegen.cpp index d68aba3f70..2be3bedfce 100644 --- a/test/OpenMP/parallel_firstprivate_codegen.cpp +++ b/test/OpenMP/parallel_firstprivate_codegen.cpp @@ -45,6 +45,8 @@ T tmain() { vec[0] = t_var; s_arr[0] = var; } +#pragma omp parallel firstprivate(t_var) + {} return T(); }