xref: /openbsd-src/gnu/llvm/clang/lib/AST/DeclOpenMP.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
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