1e5dd7070Spatrick //===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick /// \file
9e5dd7070Spatrick /// This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl
10e5dd7070Spatrick /// classes.
11e5dd7070Spatrick ///
12e5dd7070Spatrick //===----------------------------------------------------------------------===//
13e5dd7070Spatrick
14e5dd7070Spatrick #include "clang/AST/ASTContext.h"
15e5dd7070Spatrick #include "clang/AST/Decl.h"
16e5dd7070Spatrick #include "clang/AST/DeclBase.h"
17e5dd7070Spatrick #include "clang/AST/DeclOpenMP.h"
18e5dd7070Spatrick #include "clang/AST/Expr.h"
19e5dd7070Spatrick
20e5dd7070Spatrick using namespace clang;
21e5dd7070Spatrick
22e5dd7070Spatrick //===----------------------------------------------------------------------===//
23e5dd7070Spatrick // OMPThreadPrivateDecl Implementation.
24e5dd7070Spatrick //===----------------------------------------------------------------------===//
25e5dd7070Spatrick
anchor()26e5dd7070Spatrick void OMPThreadPrivateDecl::anchor() {}
27e5dd7070Spatrick
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<Expr * > VL)28e5dd7070Spatrick OMPThreadPrivateDecl *OMPThreadPrivateDecl::Create(ASTContext &C,
29e5dd7070Spatrick DeclContext *DC,
30e5dd7070Spatrick SourceLocation L,
31e5dd7070Spatrick ArrayRef<Expr *> VL) {
32a9ac8606Spatrick auto *D = OMPDeclarativeDirective::createDirective<OMPThreadPrivateDecl>(
33*12c85518Srobert C, DC, std::nullopt, VL.size(), L);
34e5dd7070Spatrick D->setVars(VL);
35e5dd7070Spatrick return D;
36e5dd7070Spatrick }
37e5dd7070Spatrick
CreateDeserialized(ASTContext & C,unsigned ID,unsigned N)38e5dd7070Spatrick OMPThreadPrivateDecl *OMPThreadPrivateDecl::CreateDeserialized(ASTContext &C,
39e5dd7070Spatrick unsigned ID,
40e5dd7070Spatrick unsigned N) {
41a9ac8606Spatrick return OMPDeclarativeDirective::createEmptyDirective<OMPThreadPrivateDecl>(
42a9ac8606Spatrick C, ID, 0, N);
43e5dd7070Spatrick }
44e5dd7070Spatrick
setVars(ArrayRef<Expr * > VL)45e5dd7070Spatrick void OMPThreadPrivateDecl::setVars(ArrayRef<Expr *> VL) {
46a9ac8606Spatrick assert(VL.size() == Data->getNumChildren() &&
47e5dd7070Spatrick "Number of variables is not the same as the preallocated buffer");
48a9ac8606Spatrick llvm::copy(VL, getVars().begin());
49e5dd7070Spatrick }
50e5dd7070Spatrick
51e5dd7070Spatrick //===----------------------------------------------------------------------===//
52e5dd7070Spatrick // OMPAllocateDecl Implementation.
53e5dd7070Spatrick //===----------------------------------------------------------------------===//
54e5dd7070Spatrick
anchor()55e5dd7070Spatrick void OMPAllocateDecl::anchor() { }
56e5dd7070Spatrick
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<Expr * > VL,ArrayRef<OMPClause * > CL)57e5dd7070Spatrick OMPAllocateDecl *OMPAllocateDecl::Create(ASTContext &C, DeclContext *DC,
58e5dd7070Spatrick SourceLocation L, ArrayRef<Expr *> VL,
59e5dd7070Spatrick ArrayRef<OMPClause *> CL) {
60a9ac8606Spatrick auto *D = OMPDeclarativeDirective::createDirective<OMPAllocateDecl>(
61a9ac8606Spatrick C, DC, CL, VL.size(), L);
62e5dd7070Spatrick D->setVars(VL);
63e5dd7070Spatrick return D;
64e5dd7070Spatrick }
65e5dd7070Spatrick
CreateDeserialized(ASTContext & C,unsigned ID,unsigned NVars,unsigned NClauses)66e5dd7070Spatrick OMPAllocateDecl *OMPAllocateDecl::CreateDeserialized(ASTContext &C, unsigned ID,
67e5dd7070Spatrick unsigned NVars,
68e5dd7070Spatrick unsigned NClauses) {
69a9ac8606Spatrick return OMPDeclarativeDirective::createEmptyDirective<OMPAllocateDecl>(
70a9ac8606Spatrick C, ID, NClauses, NVars, SourceLocation());
71e5dd7070Spatrick }
72e5dd7070Spatrick
setVars(ArrayRef<Expr * > VL)73e5dd7070Spatrick void OMPAllocateDecl::setVars(ArrayRef<Expr *> VL) {
74a9ac8606Spatrick assert(VL.size() == Data->getNumChildren() &&
75e5dd7070Spatrick "Number of variables is not the same as the preallocated buffer");
76a9ac8606Spatrick llvm::copy(VL, getVars().begin());
77e5dd7070Spatrick }
78e5dd7070Spatrick
79e5dd7070Spatrick //===----------------------------------------------------------------------===//
80e5dd7070Spatrick // OMPRequiresDecl Implementation.
81e5dd7070Spatrick //===----------------------------------------------------------------------===//
82e5dd7070Spatrick
anchor()83e5dd7070Spatrick void OMPRequiresDecl::anchor() {}
84e5dd7070Spatrick
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<OMPClause * > CL)85e5dd7070Spatrick OMPRequiresDecl *OMPRequiresDecl::Create(ASTContext &C, DeclContext *DC,
86e5dd7070Spatrick SourceLocation L,
87e5dd7070Spatrick ArrayRef<OMPClause *> CL) {
88a9ac8606Spatrick return OMPDeclarativeDirective::createDirective<OMPRequiresDecl>(C, DC, CL, 0,
89a9ac8606Spatrick L);
90e5dd7070Spatrick }
91e5dd7070Spatrick
CreateDeserialized(ASTContext & C,unsigned ID,unsigned N)92e5dd7070Spatrick OMPRequiresDecl *OMPRequiresDecl::CreateDeserialized(ASTContext &C, unsigned ID,
93e5dd7070Spatrick unsigned N) {
94a9ac8606Spatrick return OMPDeclarativeDirective::createEmptyDirective<OMPRequiresDecl>(
95a9ac8606Spatrick C, ID, N, 0, SourceLocation());
96e5dd7070Spatrick }
97e5dd7070Spatrick
98e5dd7070Spatrick //===----------------------------------------------------------------------===//
99e5dd7070Spatrick // OMPDeclareReductionDecl Implementation.
100e5dd7070Spatrick //===----------------------------------------------------------------------===//
101e5dd7070Spatrick
OMPDeclareReductionDecl(Kind DK,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType Ty,OMPDeclareReductionDecl * PrevDeclInScope)102e5dd7070Spatrick OMPDeclareReductionDecl::OMPDeclareReductionDecl(
103e5dd7070Spatrick Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name,
104e5dd7070Spatrick QualType Ty, OMPDeclareReductionDecl *PrevDeclInScope)
105e5dd7070Spatrick : ValueDecl(DK, DC, L, Name, Ty), DeclContext(DK), Combiner(nullptr),
106e5dd7070Spatrick PrevDeclInScope(PrevDeclInScope) {
107e5dd7070Spatrick setInitializer(nullptr, CallInit);
108e5dd7070Spatrick }
109e5dd7070Spatrick
anchor()110e5dd7070Spatrick void OMPDeclareReductionDecl::anchor() {}
111e5dd7070Spatrick
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType T,OMPDeclareReductionDecl * PrevDeclInScope)112e5dd7070Spatrick OMPDeclareReductionDecl *OMPDeclareReductionDecl::Create(
113e5dd7070Spatrick ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
114e5dd7070Spatrick QualType T, OMPDeclareReductionDecl *PrevDeclInScope) {
115e5dd7070Spatrick return new (C, DC) OMPDeclareReductionDecl(OMPDeclareReduction, DC, L, Name,
116e5dd7070Spatrick T, PrevDeclInScope);
117e5dd7070Spatrick }
118e5dd7070Spatrick
119e5dd7070Spatrick OMPDeclareReductionDecl *
CreateDeserialized(ASTContext & C,unsigned ID)120e5dd7070Spatrick OMPDeclareReductionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
121e5dd7070Spatrick return new (C, ID) OMPDeclareReductionDecl(
122e5dd7070Spatrick OMPDeclareReduction, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
123e5dd7070Spatrick QualType(), /*PrevDeclInScope=*/nullptr);
124e5dd7070Spatrick }
125e5dd7070Spatrick
getPrevDeclInScope()126e5dd7070Spatrick OMPDeclareReductionDecl *OMPDeclareReductionDecl::getPrevDeclInScope() {
127e5dd7070Spatrick return cast_or_null<OMPDeclareReductionDecl>(
128e5dd7070Spatrick PrevDeclInScope.get(getASTContext().getExternalSource()));
129e5dd7070Spatrick }
130e5dd7070Spatrick const OMPDeclareReductionDecl *
getPrevDeclInScope() const131e5dd7070Spatrick OMPDeclareReductionDecl::getPrevDeclInScope() const {
132e5dd7070Spatrick return cast_or_null<OMPDeclareReductionDecl>(
133e5dd7070Spatrick PrevDeclInScope.get(getASTContext().getExternalSource()));
134e5dd7070Spatrick }
135e5dd7070Spatrick
136e5dd7070Spatrick //===----------------------------------------------------------------------===//
137e5dd7070Spatrick // OMPDeclareMapperDecl Implementation.
138e5dd7070Spatrick //===----------------------------------------------------------------------===//
139e5dd7070Spatrick
anchor()140e5dd7070Spatrick void OMPDeclareMapperDecl::anchor() {}
141e5dd7070Spatrick
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType T,DeclarationName VarName,ArrayRef<OMPClause * > Clauses,OMPDeclareMapperDecl * PrevDeclInScope)142a9ac8606Spatrick OMPDeclareMapperDecl *OMPDeclareMapperDecl::Create(
143a9ac8606Spatrick ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
144a9ac8606Spatrick QualType T, DeclarationName VarName, ArrayRef<OMPClause *> Clauses,
145e5dd7070Spatrick OMPDeclareMapperDecl *PrevDeclInScope) {
146a9ac8606Spatrick return OMPDeclarativeDirective::createDirective<OMPDeclareMapperDecl>(
147a9ac8606Spatrick C, DC, Clauses, 1, L, Name, T, VarName, PrevDeclInScope);
148e5dd7070Spatrick }
149e5dd7070Spatrick
CreateDeserialized(ASTContext & C,unsigned ID,unsigned N)150e5dd7070Spatrick OMPDeclareMapperDecl *OMPDeclareMapperDecl::CreateDeserialized(ASTContext &C,
151e5dd7070Spatrick unsigned ID,
152e5dd7070Spatrick unsigned N) {
153a9ac8606Spatrick return OMPDeclarativeDirective::createEmptyDirective<OMPDeclareMapperDecl>(
154a9ac8606Spatrick C, ID, N, 1, SourceLocation(), DeclarationName(), QualType(),
155a9ac8606Spatrick DeclarationName(), /*PrevDeclInScope=*/nullptr);
156e5dd7070Spatrick }
157e5dd7070Spatrick
getPrevDeclInScope()158e5dd7070Spatrick OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() {
159e5dd7070Spatrick return cast_or_null<OMPDeclareMapperDecl>(
160e5dd7070Spatrick PrevDeclInScope.get(getASTContext().getExternalSource()));
161e5dd7070Spatrick }
162e5dd7070Spatrick
getPrevDeclInScope() const163e5dd7070Spatrick const OMPDeclareMapperDecl *OMPDeclareMapperDecl::getPrevDeclInScope() const {
164e5dd7070Spatrick return cast_or_null<OMPDeclareMapperDecl>(
165e5dd7070Spatrick PrevDeclInScope.get(getASTContext().getExternalSource()));
166e5dd7070Spatrick }
167e5dd7070Spatrick
168e5dd7070Spatrick //===----------------------------------------------------------------------===//
169e5dd7070Spatrick // OMPCapturedExprDecl Implementation.
170e5dd7070Spatrick //===----------------------------------------------------------------------===//
171e5dd7070Spatrick
anchor()172e5dd7070Spatrick void OMPCapturedExprDecl::anchor() {}
173e5dd7070Spatrick
Create(ASTContext & C,DeclContext * DC,IdentifierInfo * Id,QualType T,SourceLocation StartLoc)174e5dd7070Spatrick OMPCapturedExprDecl *OMPCapturedExprDecl::Create(ASTContext &C, DeclContext *DC,
175e5dd7070Spatrick IdentifierInfo *Id, QualType T,
176e5dd7070Spatrick SourceLocation StartLoc) {
177e5dd7070Spatrick return new (C, DC) OMPCapturedExprDecl(
178e5dd7070Spatrick C, DC, Id, T, C.getTrivialTypeSourceInfo(T), StartLoc);
179e5dd7070Spatrick }
180e5dd7070Spatrick
CreateDeserialized(ASTContext & C,unsigned ID)181e5dd7070Spatrick OMPCapturedExprDecl *OMPCapturedExprDecl::CreateDeserialized(ASTContext &C,
182e5dd7070Spatrick unsigned ID) {
183e5dd7070Spatrick return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType(),
184e5dd7070Spatrick /*TInfo=*/nullptr, SourceLocation());
185e5dd7070Spatrick }
186e5dd7070Spatrick
getSourceRange() const187e5dd7070Spatrick SourceRange OMPCapturedExprDecl::getSourceRange() const {
188e5dd7070Spatrick assert(hasInit());
189e5dd7070Spatrick return SourceRange(getInit()->getBeginLoc(), getInit()->getEndLoc());
190e5dd7070Spatrick }
191