1*67e74705SXin Li //===--- DeclOpenMP.cpp - Declaration OpenMP AST Node Implementation ------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li /// \file
10*67e74705SXin Li /// \brief This file implements OMPThreadPrivateDecl, OMPCapturedExprDecl
11*67e74705SXin Li /// classes.
12*67e74705SXin Li ///
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li
15*67e74705SXin Li #include "clang/AST/ASTContext.h"
16*67e74705SXin Li #include "clang/AST/Decl.h"
17*67e74705SXin Li #include "clang/AST/DeclBase.h"
18*67e74705SXin Li #include "clang/AST/DeclOpenMP.h"
19*67e74705SXin Li #include "clang/AST/Expr.h"
20*67e74705SXin Li
21*67e74705SXin Li using namespace clang;
22*67e74705SXin Li
23*67e74705SXin Li //===----------------------------------------------------------------------===//
24*67e74705SXin Li // OMPThreadPrivateDecl Implementation.
25*67e74705SXin Li //===----------------------------------------------------------------------===//
26*67e74705SXin Li
anchor()27*67e74705SXin Li void OMPThreadPrivateDecl::anchor() { }
28*67e74705SXin Li
Create(ASTContext & C,DeclContext * DC,SourceLocation L,ArrayRef<Expr * > VL)29*67e74705SXin Li OMPThreadPrivateDecl *OMPThreadPrivateDecl::Create(ASTContext &C,
30*67e74705SXin Li DeclContext *DC,
31*67e74705SXin Li SourceLocation L,
32*67e74705SXin Li ArrayRef<Expr *> VL) {
33*67e74705SXin Li OMPThreadPrivateDecl *D =
34*67e74705SXin Li new (C, DC, additionalSizeToAlloc<Expr *>(VL.size()))
35*67e74705SXin Li OMPThreadPrivateDecl(OMPThreadPrivate, DC, L);
36*67e74705SXin Li D->NumVars = VL.size();
37*67e74705SXin Li D->setVars(VL);
38*67e74705SXin Li return D;
39*67e74705SXin Li }
40*67e74705SXin Li
CreateDeserialized(ASTContext & C,unsigned ID,unsigned N)41*67e74705SXin Li OMPThreadPrivateDecl *OMPThreadPrivateDecl::CreateDeserialized(ASTContext &C,
42*67e74705SXin Li unsigned ID,
43*67e74705SXin Li unsigned N) {
44*67e74705SXin Li OMPThreadPrivateDecl *D = new (C, ID, additionalSizeToAlloc<Expr *>(N))
45*67e74705SXin Li OMPThreadPrivateDecl(OMPThreadPrivate, nullptr, SourceLocation());
46*67e74705SXin Li D->NumVars = N;
47*67e74705SXin Li return D;
48*67e74705SXin Li }
49*67e74705SXin Li
setVars(ArrayRef<Expr * > VL)50*67e74705SXin Li void OMPThreadPrivateDecl::setVars(ArrayRef<Expr *> VL) {
51*67e74705SXin Li assert(VL.size() == NumVars &&
52*67e74705SXin Li "Number of variables is not the same as the preallocated buffer");
53*67e74705SXin Li std::uninitialized_copy(VL.begin(), VL.end(), getTrailingObjects<Expr *>());
54*67e74705SXin Li }
55*67e74705SXin Li
56*67e74705SXin Li //===----------------------------------------------------------------------===//
57*67e74705SXin Li // OMPDeclareReductionDecl Implementation.
58*67e74705SXin Li //===----------------------------------------------------------------------===//
59*67e74705SXin Li
anchor()60*67e74705SXin Li void OMPDeclareReductionDecl::anchor() {}
61*67e74705SXin Li
Create(ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName Name,QualType T,OMPDeclareReductionDecl * PrevDeclInScope)62*67e74705SXin Li OMPDeclareReductionDecl *OMPDeclareReductionDecl::Create(
63*67e74705SXin Li ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
64*67e74705SXin Li QualType T, OMPDeclareReductionDecl *PrevDeclInScope) {
65*67e74705SXin Li return new (C, DC) OMPDeclareReductionDecl(OMPDeclareReduction, DC, L, Name,
66*67e74705SXin Li T, PrevDeclInScope);
67*67e74705SXin Li }
68*67e74705SXin Li
69*67e74705SXin Li OMPDeclareReductionDecl *
CreateDeserialized(ASTContext & C,unsigned ID)70*67e74705SXin Li OMPDeclareReductionDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
71*67e74705SXin Li return new (C, ID) OMPDeclareReductionDecl(
72*67e74705SXin Li OMPDeclareReduction, /*DC=*/nullptr, SourceLocation(), DeclarationName(),
73*67e74705SXin Li QualType(), /*PrevDeclInScope=*/nullptr);
74*67e74705SXin Li }
75*67e74705SXin Li
getPrevDeclInScope()76*67e74705SXin Li OMPDeclareReductionDecl *OMPDeclareReductionDecl::getPrevDeclInScope() {
77*67e74705SXin Li return cast_or_null<OMPDeclareReductionDecl>(
78*67e74705SXin Li PrevDeclInScope.get(getASTContext().getExternalSource()));
79*67e74705SXin Li }
80*67e74705SXin Li const OMPDeclareReductionDecl *
getPrevDeclInScope() const81*67e74705SXin Li OMPDeclareReductionDecl::getPrevDeclInScope() const {
82*67e74705SXin Li return cast_or_null<OMPDeclareReductionDecl>(
83*67e74705SXin Li PrevDeclInScope.get(getASTContext().getExternalSource()));
84*67e74705SXin Li }
85*67e74705SXin Li
86*67e74705SXin Li //===----------------------------------------------------------------------===//
87*67e74705SXin Li // OMPCapturedExprDecl Implementation.
88*67e74705SXin Li //===----------------------------------------------------------------------===//
89*67e74705SXin Li
anchor()90*67e74705SXin Li void OMPCapturedExprDecl::anchor() {}
91*67e74705SXin Li
Create(ASTContext & C,DeclContext * DC,IdentifierInfo * Id,QualType T)92*67e74705SXin Li OMPCapturedExprDecl *OMPCapturedExprDecl::Create(ASTContext &C, DeclContext *DC,
93*67e74705SXin Li IdentifierInfo *Id,
94*67e74705SXin Li QualType T) {
95*67e74705SXin Li return new (C, DC) OMPCapturedExprDecl(C, DC, Id, T);
96*67e74705SXin Li }
97*67e74705SXin Li
CreateDeserialized(ASTContext & C,unsigned ID)98*67e74705SXin Li OMPCapturedExprDecl *OMPCapturedExprDecl::CreateDeserialized(ASTContext &C,
99*67e74705SXin Li unsigned ID) {
100*67e74705SXin Li return new (C, ID) OMPCapturedExprDecl(C, nullptr, nullptr, QualType());
101*67e74705SXin Li }
102*67e74705SXin Li
103