diff --git a/clang/include/clang/AST/DeclOpenMP.h b/clang/include/clang/AST/DeclOpenMP.h index ed7cb35e60a6..c22a92c3b9ea 100644 --- a/clang/include/clang/AST/DeclOpenMP.h +++ b/clang/include/clang/AST/DeclOpenMP.h @@ -87,33 +87,33 @@ public: static bool classofKind(Kind K) { return K == OMPThreadPrivate; } }; -/// Pseudo declaration for capturing of non-static data members in non-static -/// member functions. +/// Pseudo declaration for capturing expressions. Also is used for capturing of +/// non-static data members in non-static member functions. /// /// Clang supports capturing of variables only, but OpenMP 4.5 allows to /// privatize non-static members of current class in non-static member /// functions. This pseudo-declaration allows properly handle this kind of /// capture by wrapping captured expression into a variable-like declaration. -class OMPCapturedFieldDecl final : public VarDecl { +class OMPCapturedExprDecl final : public VarDecl { friend class ASTDeclReader; void anchor() override; - OMPCapturedFieldDecl(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, - QualType Type) - : VarDecl(OMPCapturedField, C, DC, SourceLocation(), SourceLocation(), Id, + OMPCapturedExprDecl(ASTContext &C, DeclContext *DC, IdentifierInfo *Id, + QualType Type) + : VarDecl(OMPCapturedExpr, C, DC, SourceLocation(), SourceLocation(), Id, Type, nullptr, SC_None) { setImplicit(); } public: - static OMPCapturedFieldDecl *Create(ASTContext &C, DeclContext *DC, - IdentifierInfo *Id, QualType T); + static OMPCapturedExprDecl *Create(ASTContext &C, DeclContext *DC, + IdentifierInfo *Id, QualType T); - static OMPCapturedFieldDecl *CreateDeserialized(ASTContext &C, unsigned ID); + static OMPCapturedExprDecl *CreateDeserialized(ASTContext &C, unsigned ID); // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return classofKind(D->getKind()); } - static bool classofKind(Kind K) { return K == OMPCapturedField; } + static bool classofKind(Kind K) { return K == OMPCapturedExpr; } }; } // end namespace clang diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index ea10df13a226..1e397ae58ebd 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -1434,7 +1434,7 @@ DEF_TRAVERSE_DECL(OMPThreadPrivateDecl, { } }) -DEF_TRAVERSE_DECL(OMPCapturedFieldDecl, { TRY_TO(TraverseVarHelper(D)); }) +DEF_TRAVERSE_DECL(OMPCapturedExprDecl, { TRY_TO(TraverseVarHelper(D)); }) // A helper method for TemplateDecl's children. template diff --git a/clang/include/clang/Basic/DeclNodes.td b/clang/include/clang/Basic/DeclNodes.td index 490c5f25521b..a8d4520e0620 100644 --- a/clang/include/clang/Basic/DeclNodes.td +++ b/clang/include/clang/Basic/DeclNodes.td @@ -51,7 +51,7 @@ def Named : Decl<1>; : DDecl; def ImplicitParam : DDecl; def ParmVar : DDecl; - def OMPCapturedField : DDecl; + def OMPCapturedExpr : DDecl; def NonTypeTemplateParm : DDecl; def Template : DDecl; def RedeclarableTemplate : DDecl; diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index cc663d00cf0f..09df53799735 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -1163,8 +1163,8 @@ namespace clang { DECL_EMPTY, /// \brief An ObjCTypeParamDecl record. DECL_OBJC_TYPE_PARAM, - /// \brief An OMPCapturedFieldDecl record. - DECL_OMP_CAPTUREDFIELD, + /// \brief An OMPCapturedExprDecl record. + DECL_OMP_CAPTUREDEXPR }; /// \brief Record codes for each kind of statement or expression. diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index b699bec083cd..58c3cc3369f5 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -655,7 +655,7 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { case ObjCCategoryImpl: case Import: case OMPThreadPrivate: - case OMPCapturedField: + case OMPCapturedExpr: case Empty: // Never looked up by name. return 0; diff --git a/clang/lib/AST/DeclOpenMP.cpp b/clang/lib/AST/DeclOpenMP.cpp index 33677bacea71..2c474106e89b 100644 --- a/clang/lib/AST/DeclOpenMP.cpp +++ b/clang/lib/AST/DeclOpenMP.cpp @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// /// \file -/// \brief This file implements OMPThreadPrivateDecl, OMPCapturedFieldDecl +/// \brief This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl /// classes. /// //===----------------------------------------------------------------------===// @@ -54,20 +54,19 @@ void OMPThreadPrivateDecl::setVars(ArrayRef VL) { } //===----------------------------------------------------------------------===// -// OMPCapturedFieldDecl Implementation. +// OMPCapturedExprDecl Implementation. //===----------------------------------------------------------------------===// -void OMPCapturedFieldDecl::anchor() {} +void OMPCapturedExprDecl::anchor() {} -OMPCapturedFieldDecl *OMPCapturedFieldDecl::Create(ASTContext &C, - DeclContext *DC, - IdentifierInfo *Id, - QualType T) { - return new (C, DC) OMPCapturedFieldDecl(C, DC, Id, T); +OMPCapturedExprDecl *OMPCapturedExprDecl::Create(ASTContext &C, DeclContext *DC, + IdentifierInfo *Id, + QualType T) { + return new (C, DC) OMPCapturedExprDecl(C, DC, Id, T); } -OMPCapturedFieldDecl *OMPCapturedFieldDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) OMPCapturedFieldDecl(C, nullptr, nullptr, QualType()); +OMPCapturedExprDecl *OMPCapturedExprDecl::CreateDeserialized(ASTContext &C, + unsigned ID) { + return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType()); } diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 1a0e1488bb19..76940840f420 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -92,7 +92,7 @@ namespace { void VisitUsingDecl(UsingDecl *D); void VisitUsingShadowDecl(UsingShadowDecl *D); void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D); - void VisitOMPCapturedFieldDecl(OMPCapturedFieldDecl *D); + void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D); void PrintTemplateParameters(const TemplateParameterList *Params, const TemplateArgumentList *Args = nullptr); @@ -1367,7 +1367,7 @@ void DeclPrinter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) { } } -void DeclPrinter::VisitOMPCapturedFieldDecl(OMPCapturedFieldDecl *D) { +void DeclPrinter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) { D->getInit()->printPretty(Out, nullptr, Policy, Indentation); } diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 830eeb9eface..a45b9a27270d 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -768,8 +768,8 @@ void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { assert(*I && "Expected non-null Stmt"); OS << (I == Node->varlist_begin() ? StartSym : ','); if (DeclRefExpr *DRE = dyn_cast(*I)) { - if (auto *CFD = dyn_cast(DRE->getDecl())) - CFD->getInit()->IgnoreImpCasts()->printPretty(OS, nullptr, Policy, 0); + if (auto *CED = dyn_cast(DRE->getDecl())) + CED->getInit()->printPretty(OS, nullptr, Policy, 0); else DRE->getDecl()->printQualifiedName(OS); } else diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 3d84b262a8fe..5b88ef1830f1 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -92,7 +92,7 @@ void CodeGenFunction::EmitDecl(const Decl &D) { case Decl::Label: // __label__ x; case Decl::Import: case Decl::OMPThreadPrivate: - case Decl::OMPCapturedField: + case Decl::OMPCapturedExpr: case Decl::Empty: // None of these decls require codegen support. return; diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 46b7923e2c6e..b378cc6dea54 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -1535,16 +1535,10 @@ emitScheduleClause(CodeGenFunction &CGF, const OMPLoopDirective &S, M2 = C->getSecondScheduleModifier(); if (const auto *Ch = C->getChunkSize()) { if (auto *ImpRef = cast_or_null(C->getHelperChunkSize())) { - if (OuterRegion) { - const VarDecl *ImpVar = cast(ImpRef->getDecl()); - CGF.EmitVarDecl(*ImpVar); - CGF.EmitStoreThroughLValue( - CGF.EmitAnyExpr(Ch), - CGF.MakeAddrLValue(CGF.GetAddrOfLocalVar(ImpVar), - ImpVar->getType())); - } else { + if (OuterRegion) + CGF.EmitVarDecl(*cast(ImpRef->getDecl())); + else Ch = ImpRef; - } } if (!C->getHelperChunkSize() || !OuterRegion) { Chunk = CGF.EmitScalarExpr(Ch); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0c17aa1911c8..cbbe79accf8a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2874,7 +2874,7 @@ ExprResult Sema::BuildDeclarationNameExpr( case Decl::Var: case Decl::VarTemplateSpecialization: case Decl::VarTemplatePartialSpecialization: - case Decl::OMPCapturedField: + case Decl::OMPCapturedExpr: // In C, "extern void blah;" is valid and is an r-value. if (!getLangOpts().CPlusPlus && !type.hasQualifiers() && diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 17d4d3cec8c4..41013c415b88 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1714,6 +1714,30 @@ void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) { } } +static DeclRefExpr *buildCapture(Sema &S, IdentifierInfo *Id, + Expr *CaptureExpr) { + ASTContext &C = S.getASTContext(); + Expr *Init = CaptureExpr->IgnoreImpCasts(); + QualType Ty = Init->getType(); + if (CaptureExpr->getObjectKind() == OK_Ordinary && CaptureExpr->isGLValue()) { + if (S.getLangOpts().CPlusPlus) + Ty = C.getLValueReferenceType(Ty); + else { + Ty = C.getPointerType(Ty); + ExprResult Res = + S.CreateBuiltinUnaryOp(CaptureExpr->getExprLoc(), UO_AddrOf, Init); + if (!Res.isUsable()) + return nullptr; + Init = Res.get(); + } + } + auto *CED = OMPCapturedExprDecl::Create(C, S.CurContext, Id, Ty); + S.CurContext->addHiddenDecl(CED); + S.AddInitializerToDecl(CED, Init, /*DirectInit=*/false, + /*TypeMayContainAuto=*/true); + return buildDeclRefExpr(S, CED, Ty.getNonReferenceType(), SourceLocation()); +} + StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, ArrayRef Clauses) { if (!S.isUsable()) { @@ -1740,13 +1764,18 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, } DSAStack->setForceVarCapturing(/*V=*/false); } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective()) && - Clause->getClauseKind() == OMPC_schedule) { + (Clause->getClauseKind() == OMPC_schedule || + Clause->getClauseKind() == OMPC_dist_schedule)) { // Mark all variables in private list clauses as used in inner region. // Required for proper codegen of combined directives. // TODO: add processing for other clauses. - if (auto *E = cast_or_null( - cast(Clause)->getHelperChunkSize())) - MarkDeclarationsReferencedInExpr(E); + if (auto *SC = dyn_cast(Clause)) { + if (SC->getHelperChunkSize()) + MarkDeclarationsReferencedInExpr(SC->getHelperChunkSize()); + } else if (auto *DSC = dyn_cast(Clause)) { + if (DSC->getHelperChunkSize()) + MarkDeclarationsReferencedInExpr(DSC->getHelperChunkSize()); + } } if (Clause->getClauseKind() == OMPC_schedule) SC = cast(Clause); @@ -6735,12 +6764,8 @@ OMPClause *Sema::ActOnOpenMPScheduleClause( return nullptr; } } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) { - auto *ImpVar = buildVarDecl(*this, ChunkSize->getExprLoc(), - ChunkSize->getType(), ".chunk."); - auto *ImpVarRef = buildDeclRefExpr(*this, ImpVar, ChunkSize->getType(), - ChunkSize->getExprLoc(), - /*RefersToCapture=*/true); - HelperValExpr = ImpVarRef; + HelperValExpr = + buildCapture(*this, &Context.Idents.get(".chunk."), ValExpr); } } } @@ -6973,30 +6998,6 @@ OMPClause *Sema::ActOnOpenMPVarListClause( return Res; } -static DeclRefExpr *buildCapture(Sema &S, IdentifierInfo *Id, - Expr *CaptureExpr) { - ASTContext &C = S.getASTContext(); - Expr *Init = CaptureExpr->IgnoreImpCasts(); - QualType Ty = Init->getType(); - if (CaptureExpr->getObjectKind() == OK_Ordinary) { - if (S.getLangOpts().CPlusPlus) - Ty = C.getLValueReferenceType(Ty); - else { - Ty = C.getPointerType(Ty); - ExprResult Res = - S.CreateBuiltinUnaryOp(CaptureExpr->getExprLoc(), UO_AddrOf, Init); - if (!Res.isUsable()) - return nullptr; - Init = Res.get(); - } - } - auto *CFD = OMPCapturedFieldDecl::Create(C, S.CurContext, Id, Ty); - S.CurContext->addHiddenDecl(CFD); - S.AddInitializerToDecl(CFD, Init, /*DirectInit=*/false, - /*TypeMayContainAuto=*/true); - return buildDeclRefExpr(S, CFD, Ty.getNonReferenceType(), SourceLocation()); -} - ExprResult Sema::getOpenMPCapturedExpr(VarDecl *Capture, ExprValueKind VK, ExprObjectKind OK) { SourceLocation Loc = Capture->getInit()->getExprLoc(); @@ -9549,12 +9550,8 @@ OMPClause *Sema::ActOnOpenMPDistScheduleClause( return nullptr; } } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) { - auto *ImpVar = buildVarDecl(*this, ChunkSize->getExprLoc(), - ChunkSize->getType(), ".chunk."); - auto *ImpVarRef = buildDeclRefExpr(*this, ImpVar, ChunkSize->getType(), - ChunkSize->getExprLoc(), - /*RefersToCapture=*/true); - HelperValExpr = ImpVarRef; + HelperValExpr = + buildCapture(*this, &Context.Idents.get(".chunk."), ValExpr); } } } diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 0f011ab159a6..a76550024ba7 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2483,8 +2483,8 @@ Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl( return TD; } -Decl *TemplateDeclInstantiator::VisitOMPCapturedFieldDecl( - OMPCapturedFieldDecl * /*D*/) { +Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl( + OMPCapturedExprDecl * /*D*/) { llvm_unreachable("Should not be met in templates"); } diff --git a/clang/lib/Serialization/ASTCommon.cpp b/clang/lib/Serialization/ASTCommon.cpp index 68621f3709fc..0b4772a53539 100644 --- a/clang/lib/Serialization/ASTCommon.cpp +++ b/clang/lib/Serialization/ASTCommon.cpp @@ -329,7 +329,7 @@ bool serialization::isRedeclarableDeclKind(unsigned Kind) { case Decl::ClassScopeFunctionSpecialization: case Decl::Import: case Decl::OMPThreadPrivate: - case Decl::OMPCapturedField: + case Decl::OMPCapturedExpr: case Decl::BuiltinTemplate: return false; diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 074de1a71acd..7aa6d5236c66 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -350,7 +350,7 @@ namespace clang { void VisitObjCPropertyDecl(ObjCPropertyDecl *D); void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D); - void VisitOMPCapturedFieldDecl(OMPCapturedFieldDecl *D); + void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D); /// We've merged the definition \p MergedDef into the existing definition /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made @@ -2361,7 +2361,7 @@ void ASTDeclReader::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) { D->setVars(Vars); } -void ASTDeclReader::VisitOMPCapturedFieldDecl(OMPCapturedFieldDecl *D) { +void ASTDeclReader::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) { VisitVarDecl(D); } @@ -3328,8 +3328,8 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { case DECL_OMP_THREADPRIVATE: D = OMPThreadPrivateDecl::CreateDeserialized(Context, ID, Record[Idx++]); break; - case DECL_OMP_CAPTUREDFIELD: - D = OMPCapturedFieldDecl::CreateDeserialized(Context, ID); + case DECL_OMP_CAPTUREDEXPR: + D = OMPCapturedExprDecl::CreateDeserialized(Context, ID); break; case DECL_EMPTY: D = EmptyDecl::CreateDeserialized(Context, ID); diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 4620f56055b3..f2f4a02c876b 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -131,7 +131,7 @@ namespace clang { void VisitObjCPropertyDecl(ObjCPropertyDecl *D); void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D); - void VisitOMPCapturedFieldDecl(OMPCapturedFieldDecl *D); + void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D); /// Add an Objective-C type parameter list to the given record. void AddObjCTypeParamList(ObjCTypeParamList *typeParams) { @@ -1629,9 +1629,9 @@ void ASTDeclWriter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) { Code = serialization::DECL_OMP_THREADPRIVATE; } -void ASTDeclWriter::VisitOMPCapturedFieldDecl(OMPCapturedFieldDecl *D) { +void ASTDeclWriter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) { VisitVarDecl(D); - Code = serialization::DECL_OMP_CAPTUREDFIELD; + Code = serialization::DECL_OMP_CAPTUREDEXPR; } //===----------------------------------------------------------------------===// diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 9c1efd1aa1ed..6f2800514a7a 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -5670,7 +5670,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) { case Decl::StaticAssert: case Decl::Block: case Decl::Captured: - case Decl::OMPCapturedField: + case Decl::OMPCapturedExpr: case Decl::Label: // FIXME: Is this right?? case Decl::ClassScopeFunctionSpecialization: case Decl::Import: