Home | History | Annotate | Download | only in AST
      1 //===--- OpenMPClause.cpp - Classes for OpenMP clauses --------------------===//
      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 // This file implements the subclesses of Stmt class declared in OpenMPClause.h
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/AST/OpenMPClause.h"
     15 
     16 #include "clang/AST/ASTContext.h"
     17 
     18 using namespace clang;
     19 
     20 OMPClause::child_range OMPClause::children() {
     21   switch (getClauseKind()) {
     22   default:
     23     break;
     24 #define OPENMP_CLAUSE(Name, Class)                                             \
     25   case OMPC_##Name:                                                            \
     26     return static_cast<Class *>(this)->children();
     27 #include "clang/Basic/OpenMPKinds.def"
     28   }
     29   llvm_unreachable("unknown OMPClause");
     30 }
     31 
     32 void OMPPrivateClause::setPrivateCopies(ArrayRef<Expr *> VL) {
     33   assert(VL.size() == varlist_size() &&
     34          "Number of private copies is not the same as the preallocated buffer");
     35   std::copy(VL.begin(), VL.end(), varlist_end());
     36 }
     37 
     38 OMPPrivateClause *
     39 OMPPrivateClause::Create(const ASTContext &C, SourceLocation StartLoc,
     40                          SourceLocation LParenLoc, SourceLocation EndLoc,
     41                          ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL) {
     42   // Allocate space for private variables and initializer expressions.
     43   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPPrivateClause),
     44                                                   llvm::alignOf<Expr *>()) +
     45                          2 * sizeof(Expr *) * VL.size());
     46   OMPPrivateClause *Clause =
     47       new (Mem) OMPPrivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
     48   Clause->setVarRefs(VL);
     49   Clause->setPrivateCopies(PrivateVL);
     50   return Clause;
     51 }
     52 
     53 OMPPrivateClause *OMPPrivateClause::CreateEmpty(const ASTContext &C,
     54                                                 unsigned N) {
     55   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPPrivateClause),
     56                                                   llvm::alignOf<Expr *>()) +
     57                          2 * sizeof(Expr *) * N);
     58   return new (Mem) OMPPrivateClause(N);
     59 }
     60 
     61 void OMPFirstprivateClause::setPrivateCopies(ArrayRef<Expr *> VL) {
     62   assert(VL.size() == varlist_size() &&
     63          "Number of private copies is not the same as the preallocated buffer");
     64   std::copy(VL.begin(), VL.end(), varlist_end());
     65 }
     66 
     67 void OMPFirstprivateClause::setInits(ArrayRef<Expr *> VL) {
     68   assert(VL.size() == varlist_size() &&
     69          "Number of inits is not the same as the preallocated buffer");
     70   std::copy(VL.begin(), VL.end(), getPrivateCopies().end());
     71 }
     72 
     73 OMPFirstprivateClause *
     74 OMPFirstprivateClause::Create(const ASTContext &C, SourceLocation StartLoc,
     75                               SourceLocation LParenLoc, SourceLocation EndLoc,
     76                               ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
     77                               ArrayRef<Expr *> InitVL) {
     78   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPFirstprivateClause),
     79                                                   llvm::alignOf<Expr *>()) +
     80                          3 * sizeof(Expr *) * VL.size());
     81   OMPFirstprivateClause *Clause =
     82       new (Mem) OMPFirstprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
     83   Clause->setVarRefs(VL);
     84   Clause->setPrivateCopies(PrivateVL);
     85   Clause->setInits(InitVL);
     86   return Clause;
     87 }
     88 
     89 OMPFirstprivateClause *OMPFirstprivateClause::CreateEmpty(const ASTContext &C,
     90                                                           unsigned N) {
     91   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPFirstprivateClause),
     92                                                   llvm::alignOf<Expr *>()) +
     93                          3 * sizeof(Expr *) * N);
     94   return new (Mem) OMPFirstprivateClause(N);
     95 }
     96 
     97 void OMPLastprivateClause::setPrivateCopies(ArrayRef<Expr *> PrivateCopies) {
     98   assert(PrivateCopies.size() == varlist_size() &&
     99          "Number of private copies is not the same as the preallocated buffer");
    100   std::copy(PrivateCopies.begin(), PrivateCopies.end(), varlist_end());
    101 }
    102 
    103 void OMPLastprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
    104   assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
    105                                               "not the same as the "
    106                                               "preallocated buffer");
    107   std::copy(SrcExprs.begin(), SrcExprs.end(), getPrivateCopies().end());
    108 }
    109 
    110 void OMPLastprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
    111   assert(DstExprs.size() == varlist_size() && "Number of destination "
    112                                               "expressions is not the same as "
    113                                               "the preallocated buffer");
    114   std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
    115 }
    116 
    117 void OMPLastprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
    118   assert(AssignmentOps.size() == varlist_size() &&
    119          "Number of assignment expressions is not the same as the preallocated "
    120          "buffer");
    121   std::copy(AssignmentOps.begin(), AssignmentOps.end(),
    122             getDestinationExprs().end());
    123 }
    124 
    125 OMPLastprivateClause *OMPLastprivateClause::Create(
    126     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    127     SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    128     ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
    129   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPLastprivateClause),
    130                                                   llvm::alignOf<Expr *>()) +
    131                          5 * sizeof(Expr *) * VL.size());
    132   OMPLastprivateClause *Clause =
    133       new (Mem) OMPLastprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
    134   Clause->setVarRefs(VL);
    135   Clause->setSourceExprs(SrcExprs);
    136   Clause->setDestinationExprs(DstExprs);
    137   Clause->setAssignmentOps(AssignmentOps);
    138   return Clause;
    139 }
    140 
    141 OMPLastprivateClause *OMPLastprivateClause::CreateEmpty(const ASTContext &C,
    142                                                         unsigned N) {
    143   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPLastprivateClause),
    144                                                   llvm::alignOf<Expr *>()) +
    145                          5 * sizeof(Expr *) * N);
    146   return new (Mem) OMPLastprivateClause(N);
    147 }
    148 
    149 OMPSharedClause *OMPSharedClause::Create(const ASTContext &C,
    150                                          SourceLocation StartLoc,
    151                                          SourceLocation LParenLoc,
    152                                          SourceLocation EndLoc,
    153                                          ArrayRef<Expr *> VL) {
    154   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPSharedClause),
    155                                                   llvm::alignOf<Expr *>()) +
    156                          sizeof(Expr *) * VL.size());
    157   OMPSharedClause *Clause =
    158       new (Mem) OMPSharedClause(StartLoc, LParenLoc, EndLoc, VL.size());
    159   Clause->setVarRefs(VL);
    160   return Clause;
    161 }
    162 
    163 OMPSharedClause *OMPSharedClause::CreateEmpty(const ASTContext &C, unsigned N) {
    164   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPSharedClause),
    165                                                   llvm::alignOf<Expr *>()) +
    166                          sizeof(Expr *) * N);
    167   return new (Mem) OMPSharedClause(N);
    168 }
    169 
    170 void OMPLinearClause::setPrivates(ArrayRef<Expr *> PL) {
    171   assert(PL.size() == varlist_size() &&
    172          "Number of privates is not the same as the preallocated buffer");
    173   std::copy(PL.begin(), PL.end(), varlist_end());
    174 }
    175 
    176 void OMPLinearClause::setInits(ArrayRef<Expr *> IL) {
    177   assert(IL.size() == varlist_size() &&
    178          "Number of inits is not the same as the preallocated buffer");
    179   std::copy(IL.begin(), IL.end(), getPrivates().end());
    180 }
    181 
    182 void OMPLinearClause::setUpdates(ArrayRef<Expr *> UL) {
    183   assert(UL.size() == varlist_size() &&
    184          "Number of updates is not the same as the preallocated buffer");
    185   std::copy(UL.begin(), UL.end(), getInits().end());
    186 }
    187 
    188 void OMPLinearClause::setFinals(ArrayRef<Expr *> FL) {
    189   assert(FL.size() == varlist_size() &&
    190          "Number of final updates is not the same as the preallocated buffer");
    191   std::copy(FL.begin(), FL.end(), getUpdates().end());
    192 }
    193 
    194 OMPLinearClause *OMPLinearClause::Create(
    195     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    196     OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
    197     SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
    198     ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep) {
    199   // Allocate space for 4 lists (Vars, Inits, Updates, Finals) and 2 expressions
    200   // (Step and CalcStep).
    201   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPLinearClause),
    202                                                   llvm::alignOf<Expr *>()) +
    203                          (5 * VL.size() + 2) * sizeof(Expr *));
    204   OMPLinearClause *Clause = new (Mem) OMPLinearClause(
    205       StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc, EndLoc, VL.size());
    206   Clause->setVarRefs(VL);
    207   Clause->setPrivates(PL);
    208   Clause->setInits(IL);
    209   // Fill update and final expressions with zeroes, they are provided later,
    210   // after the directive construction.
    211   std::fill(Clause->getInits().end(), Clause->getInits().end() + VL.size(),
    212             nullptr);
    213   std::fill(Clause->getUpdates().end(), Clause->getUpdates().end() + VL.size(),
    214             nullptr);
    215   Clause->setStep(Step);
    216   Clause->setCalcStep(CalcStep);
    217   return Clause;
    218 }
    219 
    220 OMPLinearClause *OMPLinearClause::CreateEmpty(const ASTContext &C,
    221                                               unsigned NumVars) {
    222   // Allocate space for 4 lists (Vars, Inits, Updates, Finals) and 2 expressions
    223   // (Step and CalcStep).
    224   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPLinearClause),
    225                                                   llvm::alignOf<Expr *>()) +
    226                          (5 * NumVars + 2) * sizeof(Expr *));
    227   return new (Mem) OMPLinearClause(NumVars);
    228 }
    229 
    230 OMPAlignedClause *
    231 OMPAlignedClause::Create(const ASTContext &C, SourceLocation StartLoc,
    232                          SourceLocation LParenLoc, SourceLocation ColonLoc,
    233                          SourceLocation EndLoc, ArrayRef<Expr *> VL, Expr *A) {
    234   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPAlignedClause),
    235                                                   llvm::alignOf<Expr *>()) +
    236                          sizeof(Expr *) * (VL.size() + 1));
    237   OMPAlignedClause *Clause = new (Mem)
    238       OMPAlignedClause(StartLoc, LParenLoc, ColonLoc, EndLoc, VL.size());
    239   Clause->setVarRefs(VL);
    240   Clause->setAlignment(A);
    241   return Clause;
    242 }
    243 
    244 OMPAlignedClause *OMPAlignedClause::CreateEmpty(const ASTContext &C,
    245                                                 unsigned NumVars) {
    246   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPAlignedClause),
    247                                                   llvm::alignOf<Expr *>()) +
    248                          sizeof(Expr *) * (NumVars + 1));
    249   return new (Mem) OMPAlignedClause(NumVars);
    250 }
    251 
    252 void OMPCopyinClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
    253   assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
    254                                               "not the same as the "
    255                                               "preallocated buffer");
    256   std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end());
    257 }
    258 
    259 void OMPCopyinClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
    260   assert(DstExprs.size() == varlist_size() && "Number of destination "
    261                                               "expressions is not the same as "
    262                                               "the preallocated buffer");
    263   std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
    264 }
    265 
    266 void OMPCopyinClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
    267   assert(AssignmentOps.size() == varlist_size() &&
    268          "Number of assignment expressions is not the same as the preallocated "
    269          "buffer");
    270   std::copy(AssignmentOps.begin(), AssignmentOps.end(),
    271             getDestinationExprs().end());
    272 }
    273 
    274 OMPCopyinClause *OMPCopyinClause::Create(
    275     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    276     SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    277     ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
    278   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPCopyinClause),
    279                                                   llvm::alignOf<Expr *>()) +
    280                          4 * sizeof(Expr *) * VL.size());
    281   OMPCopyinClause *Clause =
    282       new (Mem) OMPCopyinClause(StartLoc, LParenLoc, EndLoc, VL.size());
    283   Clause->setVarRefs(VL);
    284   Clause->setSourceExprs(SrcExprs);
    285   Clause->setDestinationExprs(DstExprs);
    286   Clause->setAssignmentOps(AssignmentOps);
    287   return Clause;
    288 }
    289 
    290 OMPCopyinClause *OMPCopyinClause::CreateEmpty(const ASTContext &C, unsigned N) {
    291   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPCopyinClause),
    292                                                   llvm::alignOf<Expr *>()) +
    293                          4 * sizeof(Expr *) * N);
    294   return new (Mem) OMPCopyinClause(N);
    295 }
    296 
    297 void OMPCopyprivateClause::setSourceExprs(ArrayRef<Expr *> SrcExprs) {
    298   assert(SrcExprs.size() == varlist_size() && "Number of source expressions is "
    299                                               "not the same as the "
    300                                               "preallocated buffer");
    301   std::copy(SrcExprs.begin(), SrcExprs.end(), varlist_end());
    302 }
    303 
    304 void OMPCopyprivateClause::setDestinationExprs(ArrayRef<Expr *> DstExprs) {
    305   assert(DstExprs.size() == varlist_size() && "Number of destination "
    306                                               "expressions is not the same as "
    307                                               "the preallocated buffer");
    308   std::copy(DstExprs.begin(), DstExprs.end(), getSourceExprs().end());
    309 }
    310 
    311 void OMPCopyprivateClause::setAssignmentOps(ArrayRef<Expr *> AssignmentOps) {
    312   assert(AssignmentOps.size() == varlist_size() &&
    313          "Number of assignment expressions is not the same as the preallocated "
    314          "buffer");
    315   std::copy(AssignmentOps.begin(), AssignmentOps.end(),
    316             getDestinationExprs().end());
    317 }
    318 
    319 OMPCopyprivateClause *OMPCopyprivateClause::Create(
    320     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    321     SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    322     ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps) {
    323   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPCopyprivateClause),
    324                                                   llvm::alignOf<Expr *>()) +
    325                          4 * sizeof(Expr *) * VL.size());
    326   OMPCopyprivateClause *Clause =
    327       new (Mem) OMPCopyprivateClause(StartLoc, LParenLoc, EndLoc, VL.size());
    328   Clause->setVarRefs(VL);
    329   Clause->setSourceExprs(SrcExprs);
    330   Clause->setDestinationExprs(DstExprs);
    331   Clause->setAssignmentOps(AssignmentOps);
    332   return Clause;
    333 }
    334 
    335 OMPCopyprivateClause *OMPCopyprivateClause::CreateEmpty(const ASTContext &C,
    336                                                         unsigned N) {
    337   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPCopyprivateClause),
    338                                                   llvm::alignOf<Expr *>()) +
    339                          4 * sizeof(Expr *) * N);
    340   return new (Mem) OMPCopyprivateClause(N);
    341 }
    342 
    343 void OMPReductionClause::setPrivates(ArrayRef<Expr *> Privates) {
    344   assert(Privates.size() == varlist_size() &&
    345          "Number of private copies is not the same as the preallocated buffer");
    346   std::copy(Privates.begin(), Privates.end(), varlist_end());
    347 }
    348 
    349 void OMPReductionClause::setLHSExprs(ArrayRef<Expr *> LHSExprs) {
    350   assert(
    351       LHSExprs.size() == varlist_size() &&
    352       "Number of LHS expressions is not the same as the preallocated buffer");
    353   std::copy(LHSExprs.begin(), LHSExprs.end(), getPrivates().end());
    354 }
    355 
    356 void OMPReductionClause::setRHSExprs(ArrayRef<Expr *> RHSExprs) {
    357   assert(
    358       RHSExprs.size() == varlist_size() &&
    359       "Number of RHS expressions is not the same as the preallocated buffer");
    360   std::copy(RHSExprs.begin(), RHSExprs.end(), getLHSExprs().end());
    361 }
    362 
    363 void OMPReductionClause::setReductionOps(ArrayRef<Expr *> ReductionOps) {
    364   assert(ReductionOps.size() == varlist_size() && "Number of reduction "
    365                                                   "expressions is not the same "
    366                                                   "as the preallocated buffer");
    367   std::copy(ReductionOps.begin(), ReductionOps.end(), getRHSExprs().end());
    368 }
    369 
    370 OMPReductionClause *OMPReductionClause::Create(
    371     const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    372     SourceLocation EndLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL,
    373     NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo,
    374     ArrayRef<Expr *> Privates, ArrayRef<Expr *> LHSExprs,
    375     ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps) {
    376   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPReductionClause),
    377                                                   llvm::alignOf<Expr *>()) +
    378                          5 * sizeof(Expr *) * VL.size());
    379   OMPReductionClause *Clause = new (Mem) OMPReductionClause(
    380       StartLoc, LParenLoc, EndLoc, ColonLoc, VL.size(), QualifierLoc, NameInfo);
    381   Clause->setVarRefs(VL);
    382   Clause->setPrivates(Privates);
    383   Clause->setLHSExprs(LHSExprs);
    384   Clause->setRHSExprs(RHSExprs);
    385   Clause->setReductionOps(ReductionOps);
    386   return Clause;
    387 }
    388 
    389 OMPReductionClause *OMPReductionClause::CreateEmpty(const ASTContext &C,
    390                                                     unsigned N) {
    391   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPReductionClause),
    392                                                   llvm::alignOf<Expr *>()) +
    393                          5 * sizeof(Expr *) * N);
    394   return new (Mem) OMPReductionClause(N);
    395 }
    396 
    397 OMPFlushClause *OMPFlushClause::Create(const ASTContext &C,
    398                                        SourceLocation StartLoc,
    399                                        SourceLocation LParenLoc,
    400                                        SourceLocation EndLoc,
    401                                        ArrayRef<Expr *> VL) {
    402   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPFlushClause),
    403                                                   llvm::alignOf<Expr *>()) +
    404                          sizeof(Expr *) * VL.size());
    405   OMPFlushClause *Clause =
    406       new (Mem) OMPFlushClause(StartLoc, LParenLoc, EndLoc, VL.size());
    407   Clause->setVarRefs(VL);
    408   return Clause;
    409 }
    410 
    411 OMPFlushClause *OMPFlushClause::CreateEmpty(const ASTContext &C, unsigned N) {
    412   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPFlushClause),
    413                                                   llvm::alignOf<Expr *>()) +
    414                          sizeof(Expr *) * N);
    415   return new (Mem) OMPFlushClause(N);
    416 }
    417 
    418 OMPDependClause *
    419 OMPDependClause::Create(const ASTContext &C, SourceLocation StartLoc,
    420                         SourceLocation LParenLoc, SourceLocation EndLoc,
    421                         OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
    422                         SourceLocation ColonLoc, ArrayRef<Expr *> VL) {
    423   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPDependClause),
    424                                                   llvm::alignOf<Expr *>()) +
    425                          sizeof(Expr *) * VL.size());
    426   OMPDependClause *Clause =
    427       new (Mem) OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size());
    428   Clause->setVarRefs(VL);
    429   Clause->setDependencyKind(DepKind);
    430   Clause->setDependencyLoc(DepLoc);
    431   Clause->setColonLoc(ColonLoc);
    432   return Clause;
    433 }
    434 
    435 OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N) {
    436   void *Mem = C.Allocate(llvm::RoundUpToAlignment(sizeof(OMPDependClause),
    437                                                   llvm::alignOf<Expr *>()) +
    438                          sizeof(Expr *) * N);
    439   return new (Mem) OMPDependClause(N);
    440 }
    441 
    442 OMPMapClause *OMPMapClause::Create(const ASTContext &C, SourceLocation StartLoc,
    443                                    SourceLocation LParenLoc,
    444                                    SourceLocation EndLoc, ArrayRef<Expr *> VL,
    445                                    OpenMPMapClauseKind TypeModifier,
    446                                    OpenMPMapClauseKind Type,
    447                                    SourceLocation TypeLoc) {
    448   void *Mem = C.Allocate(
    449       llvm::RoundUpToAlignment(sizeof(OMPMapClause), llvm::alignOf<Expr *>()) +
    450       sizeof(Expr *) * VL.size());
    451   OMPMapClause *Clause = new (Mem) OMPMapClause(
    452       TypeModifier, Type, TypeLoc, StartLoc, LParenLoc, EndLoc, VL.size());
    453   Clause->setVarRefs(VL);
    454   Clause->setMapTypeModifier(TypeModifier);
    455   Clause->setMapType(Type);
    456   Clause->setMapLoc(TypeLoc);
    457   return Clause;
    458 }
    459 
    460 OMPMapClause *OMPMapClause::CreateEmpty(const ASTContext &C, unsigned N) {
    461   void *Mem = C.Allocate(
    462       llvm::RoundUpToAlignment(sizeof(OMPMapClause), llvm::alignOf<Expr *>()) +
    463       sizeof(Expr *) * N);
    464   return new (Mem) OMPMapClause(N);
    465 }
    466