]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/clang/include/clang/AST/DeclOpenMP.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / clang / include / clang / AST / DeclOpenMP.h
1 //===--- OpenMP.h - Classes for representing OpenMP directives ---*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file defines OpenMP nodes.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_AST_OPENMP_H
16 #define LLVM_CLANG_AST_OPENMP_H
17
18 #include "clang/AST/DeclBase.h"
19 #include "llvm/ADT/ArrayRef.h"
20
21 namespace clang {
22
23 class DeclRefExpr;
24
25 /// \brief This represents '#pragma omp threadprivate ...' directive.
26 /// For example, in the following, both 'a' and 'A::b' are threadprivate:
27 ///
28 /// \code
29 /// int a;
30 /// #pragma omp threadprivate(a)
31 /// struct A {
32 ///   static int b;
33 /// #pragma omp threadprivate(b)
34 /// };
35 /// \endcode
36 ///
37 class OMPThreadPrivateDecl : public Decl {
38   friend class ASTDeclReader;
39   unsigned NumVars;
40
41   virtual void anchor();
42
43   OMPThreadPrivateDecl(Kind DK, DeclContext *DC, SourceLocation L) :
44     Decl(DK, DC, L), NumVars(0) { }
45
46   ArrayRef<const DeclRefExpr *> getVars() const {
47     return ArrayRef<const DeclRefExpr *>(
48                    reinterpret_cast<const DeclRefExpr * const *>(this + 1),
49                    NumVars);
50   }
51
52   llvm::MutableArrayRef<DeclRefExpr *> getVars() {
53     return llvm::MutableArrayRef<DeclRefExpr *>(
54                                  reinterpret_cast<DeclRefExpr **>(this + 1),
55                                  NumVars);
56   }
57
58   void setVars(ArrayRef<DeclRefExpr *> VL);
59
60 public:
61   static OMPThreadPrivateDecl *Create(ASTContext &C, DeclContext *DC,
62                                       SourceLocation L,
63                                       ArrayRef<DeclRefExpr *> VL);
64   static OMPThreadPrivateDecl *CreateDeserialized(ASTContext &C,
65                                                   unsigned ID, unsigned N);
66
67   typedef llvm::MutableArrayRef<DeclRefExpr *>::iterator varlist_iterator;
68   typedef ArrayRef<const DeclRefExpr *>::iterator varlist_const_iterator;
69
70   unsigned varlist_size() const { return NumVars; }
71   bool varlist_empty() const { return NumVars == 0; }
72   varlist_iterator varlist_begin() { return getVars().begin(); }
73   varlist_iterator varlist_end() { return getVars().end(); }
74   varlist_const_iterator varlist_begin() const { return getVars().begin(); }
75   varlist_const_iterator varlist_end() const { return getVars().end(); }
76
77   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
78   static bool classofKind(Kind K) { return K == OMPThreadPrivate; }
79 };
80
81 }  // end namespace clang
82
83 #endif