1 //===- DeclOpenMP.h - Classes for representing OpenMP directives -*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief This file defines OpenMP nodes for declarative directives.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_AST_DECLOPENMP_H
16 #define LLVM_CLANG_AST_DECLOPENMP_H
18 #include "clang/AST/DeclBase.h"
19 #include "llvm/ADT/ArrayRef.h"
24 /// \brief This represents '#pragma omp threadprivate ...' directive.
25 /// For example, in the following, both 'a' and 'A::b' are threadprivate:
29 /// #pragma omp threadprivate(a)
32 /// #pragma omp threadprivate(b)
36 class OMPThreadPrivateDecl final
38 private llvm::TrailingObjects<OMPThreadPrivateDecl, Expr *> {
39 friend class ASTDeclReader;
40 friend TrailingObjects;
44 virtual void anchor();
46 OMPThreadPrivateDecl(Kind DK, DeclContext *DC, SourceLocation L) :
47 Decl(DK, DC, L), NumVars(0) { }
49 ArrayRef<const Expr *> getVars() const {
50 return llvm::makeArrayRef(getTrailingObjects<Expr *>(), NumVars);
53 MutableArrayRef<Expr *> getVars() {
54 return MutableArrayRef<Expr *>(getTrailingObjects<Expr *>(), NumVars);
57 void setVars(ArrayRef<Expr *> VL);
60 static OMPThreadPrivateDecl *Create(ASTContext &C, DeclContext *DC,
63 static OMPThreadPrivateDecl *CreateDeserialized(ASTContext &C,
64 unsigned ID, unsigned N);
66 typedef MutableArrayRef<Expr *>::iterator varlist_iterator;
67 typedef ArrayRef<const Expr *>::iterator varlist_const_iterator;
68 typedef llvm::iterator_range<varlist_iterator> varlist_range;
69 typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
71 unsigned varlist_size() const { return NumVars; }
72 bool varlist_empty() const { return NumVars == 0; }
74 varlist_range varlists() {
75 return varlist_range(varlist_begin(), varlist_end());
77 varlist_const_range varlists() const {
78 return varlist_const_range(varlist_begin(), varlist_end());
80 varlist_iterator varlist_begin() { return getVars().begin(); }
81 varlist_iterator varlist_end() { return getVars().end(); }
82 varlist_const_iterator varlist_begin() const { return getVars().begin(); }
83 varlist_const_iterator varlist_end() const { return getVars().end(); }
85 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
86 static bool classofKind(Kind K) { return K == OMPThreadPrivate; }
89 } // end namespace clang