1 //===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 /// This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl
12 //===----------------------------------------------------------------------===//
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Decl.h"
16 #include "clang/AST/DeclBase.h"
17 #include "clang/AST/DeclOpenMP.h"
18 #include "clang/AST/Expr.h"
20 using namespace clang
;
22 //===----------------------------------------------------------------------===//
23 // OMPThreadPrivateDecl Implementation.
24 //===----------------------------------------------------------------------===//
26 void OMPThreadPrivateDecl::anchor() {}
28 OMPThreadPrivateDecl
*OMPThreadPrivateDecl::Create(ASTContext
&C
,
31 ArrayRef
<Expr
*> VL
) {
32 auto *D
= OMPDeclarativeDirective::createDirective
<OMPThreadPrivateDecl
>(
33 C
, DC
, std::nullopt
, VL
.size(), L
);
38 OMPThreadPrivateDecl
*OMPThreadPrivateDecl::CreateDeserialized(ASTContext
&C
,
41 return OMPDeclarativeDirective::createEmptyDirective
<OMPThreadPrivateDecl
>(
45 void OMPThreadPrivateDecl::setVars(ArrayRef
<Expr
*> VL
) {
46 assert(VL
.size() == Data
->getNumChildren() &&
47 "Number of variables is not the same as the preallocated buffer");
48 llvm::copy(VL
, getVars().begin());
51 //===----------------------------------------------------------------------===//
52 // OMPAllocateDecl Implementation.
53 //===----------------------------------------------------------------------===//
55 void OMPAllocateDecl::anchor() { }
57 OMPAllocateDecl
*OMPAllocateDecl::Create(ASTContext
&C
, DeclContext
*DC
,
58 SourceLocation L
, ArrayRef
<Expr
*> VL
,
59 ArrayRef
<OMPClause
*> CL
) {
60 auto *D
= OMPDeclarativeDirective::createDirective
<OMPAllocateDecl
>(
61 C
, DC
, CL
, VL
.size(), L
);
66 OMPAllocateDecl
*OMPAllocateDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
,
69 return OMPDeclarativeDirective::createEmptyDirective
<OMPAllocateDecl
>(
70 C
, ID
, NClauses
, NVars
, SourceLocation());
73 void OMPAllocateDecl::setVars(ArrayRef
<Expr
*> VL
) {
74 assert(VL
.size() == Data
->getNumChildren() &&
75 "Number of variables is not the same as the preallocated buffer");
76 llvm::copy(VL
, getVars().begin());
79 //===----------------------------------------------------------------------===//
80 // OMPRequiresDecl Implementation.
81 //===----------------------------------------------------------------------===//
83 void OMPRequiresDecl::anchor() {}
85 OMPRequiresDecl
*OMPRequiresDecl::Create(ASTContext
&C
, DeclContext
*DC
,
87 ArrayRef
<OMPClause
*> CL
) {
88 return OMPDeclarativeDirective::createDirective
<OMPRequiresDecl
>(C
, DC
, CL
, 0,
92 OMPRequiresDecl
*OMPRequiresDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
,
94 return OMPDeclarativeDirective::createEmptyDirective
<OMPRequiresDecl
>(
95 C
, ID
, N
, 0, SourceLocation());
98 //===----------------------------------------------------------------------===//
99 // OMPDeclareReductionDecl Implementation.
100 //===----------------------------------------------------------------------===//
102 OMPDeclareReductionDecl::OMPDeclareReductionDecl(
103 Kind DK
, DeclContext
*DC
, SourceLocation L
, DeclarationName Name
,
104 QualType Ty
, OMPDeclareReductionDecl
*PrevDeclInScope
)
105 : ValueDecl(DK
, DC
, L
, Name
, Ty
), DeclContext(DK
), Combiner(nullptr),
106 PrevDeclInScope(PrevDeclInScope
) {
107 setInitializer(nullptr, CallInit
);
110 void OMPDeclareReductionDecl::anchor() {}
112 OMPDeclareReductionDecl
*OMPDeclareReductionDecl::Create(
113 ASTContext
&C
, DeclContext
*DC
, SourceLocation L
, DeclarationName Name
,
114 QualType T
, OMPDeclareReductionDecl
*PrevDeclInScope
) {
115 return new (C
, DC
) OMPDeclareReductionDecl(OMPDeclareReduction
, DC
, L
, Name
,
119 OMPDeclareReductionDecl
*
120 OMPDeclareReductionDecl::CreateDeserialized(ASTContext
&C
, unsigned ID
) {
121 return new (C
, ID
) OMPDeclareReductionDecl(
122 OMPDeclareReduction
, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
123 QualType(), /*PrevDeclInScope=*/nullptr);
126 OMPDeclareReductionDecl
*OMPDeclareReductionDecl::getPrevDeclInScope() {
127 return cast_or_null
<OMPDeclareReductionDecl
>(
128 PrevDeclInScope
.get(getASTContext().getExternalSource()));
130 const OMPDeclareReductionDecl
*
131 OMPDeclareReductionDecl::getPrevDeclInScope() const {
132 return cast_or_null
<OMPDeclareReductionDecl
>(
133 PrevDeclInScope
.get(getASTContext().getExternalSource()));
136 //===----------------------------------------------------------------------===//
137 // OMPDeclareMapperDecl Implementation.
138 //===----------------------------------------------------------------------===//
140 void OMPDeclareMapperDecl::anchor() {}
142 OMPDeclareMapperDecl
*OMPDeclareMapperDecl::Create(
143 ASTContext
&C
, DeclContext
*DC
, SourceLocation L
, DeclarationName Name
,
144 QualType T
, DeclarationName VarName
, ArrayRef
<OMPClause
*> Clauses
,
145 OMPDeclareMapperDecl
*PrevDeclInScope
) {
146 return OMPDeclarativeDirective::createDirective
<OMPDeclareMapperDecl
>(
147 C
, DC
, Clauses
, 1, L
, Name
, T
, VarName
, PrevDeclInScope
);
150 OMPDeclareMapperDecl
*OMPDeclareMapperDecl::CreateDeserialized(ASTContext
&C
,
153 return OMPDeclarativeDirective::createEmptyDirective
<OMPDeclareMapperDecl
>(
154 C
, ID
, N
, 1, SourceLocation(), DeclarationName(), QualType(),
155 DeclarationName(), /*PrevDeclInScope=*/nullptr);
158 OMPDeclareMapperDecl
*OMPDeclareMapperDecl::getPrevDeclInScope() {
159 return cast_or_null
<OMPDeclareMapperDecl
>(
160 PrevDeclInScope
.get(getASTContext().getExternalSource()));
163 const OMPDeclareMapperDecl
*OMPDeclareMapperDecl::getPrevDeclInScope() const {
164 return cast_or_null
<OMPDeclareMapperDecl
>(
165 PrevDeclInScope
.get(getASTContext().getExternalSource()));
168 //===----------------------------------------------------------------------===//
169 // OMPCapturedExprDecl Implementation.
170 //===----------------------------------------------------------------------===//
172 void OMPCapturedExprDecl::anchor() {}
174 OMPCapturedExprDecl
*OMPCapturedExprDecl::Create(ASTContext
&C
, DeclContext
*DC
,
175 IdentifierInfo
*Id
, QualType T
,
176 SourceLocation StartLoc
) {
177 return new (C
, DC
) OMPCapturedExprDecl(
178 C
, DC
, Id
, T
, C
.getTrivialTypeSourceInfo(T
), StartLoc
);
181 OMPCapturedExprDecl
*OMPCapturedExprDecl::CreateDeserialized(ASTContext
&C
,
183 return new (C
, ID
) OMPCapturedExprDecl(C
, nullptr, nullptr, QualType(),
184 /*TInfo=*/nullptr, SourceLocation());
187 SourceRange
OMPCapturedExprDecl::getSourceRange() const {
189 return SourceRange(getInit()->getBeginLoc(), getInit()->getEndLoc());