diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp | 331 | 
1 files changed, 291 insertions, 40 deletions
diff --git a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp index 76e8334695f7..4082dec48c0a 100644 --- a/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp @@ -93,6 +93,7 @@ namespace clang {      /// \brief Read and initialize a ExplicitTemplateArgumentList structure.      void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, +                                   TemplateArgumentLoc *ArgsLocArray,                                     unsigned NumTemplateArgs);      /// \brief Read and initialize a ExplicitTemplateArgumentList structure.      void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList, @@ -105,9 +106,9 @@ namespace clang {    };  } -void ASTStmtReader:: -ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, -                          unsigned NumTemplateArgs) { +void ASTStmtReader::ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, +                                              TemplateArgumentLoc *ArgsLocArray, +                                              unsigned NumTemplateArgs) {    SourceLocation TemplateKWLoc = ReadSourceLocation(Record, Idx);    TemplateArgumentListInfo ArgInfo;    ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx)); @@ -115,7 +116,7 @@ ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,    for (unsigned i = 0; i != NumTemplateArgs; ++i)      ArgInfo.addArgument(          Reader.ReadTemplateArgumentLoc(F, Record, Idx)); -  Args.initializeFrom(TemplateKWLoc, ArgInfo); +  Args.initializeFrom(TemplateKWLoc, ArgInfo, ArgsLocArray);  }  void ASTStmtReader::VisitStmt(Stmt *S) { @@ -134,7 +135,7 @@ void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {    unsigned NumStmts = Record[Idx++];    while (NumStmts--)      Stmts.push_back(Reader.ReadSubStmt()); -  S->setStmts(Reader.getContext(), Stmts.data(), Stmts.size()); +  S->setStmts(Reader.getContext(), Stmts);    S->LBraceLoc = ReadSourceLocation(Record, Idx);    S->RBraceLoc = ReadSourceLocation(Record, Idx);  } @@ -381,6 +382,26 @@ void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {                  Constraints, Exprs, Clobbers);  } +void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) { +  // FIXME: Implement coroutine serialization. +  llvm_unreachable("unimplemented"); +} + +void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) { +  // FIXME: Implement coroutine serialization. +  llvm_unreachable("unimplemented"); +} + +void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *S) { +  // FIXME: Implement coroutine serialization. +  llvm_unreachable("unimplemented"); +} + +void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *S) { +  // FIXME: Implement coroutine serialization. +  llvm_unreachable("unimplemented"); +} +  void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {    VisitStmt(S);    ++Idx; @@ -439,15 +460,17 @@ void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {      NumTemplateArgs = Record[Idx++];    if (E->hasQualifier()) -    E->getInternalQualifierLoc() -      = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); +    new (E->getTrailingObjects<NestedNameSpecifierLoc>()) +        NestedNameSpecifierLoc( +            Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));    if (E->hasFoundDecl()) -    E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx); +    *E->getTrailingObjects<NamedDecl *>() = ReadDeclAs<NamedDecl>(Record, Idx);    if (E->hasTemplateKWAndArgsInfo()) -    ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), -                              NumTemplateArgs); +    ReadTemplateKWAndArgsInfo( +        *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), +        E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);    E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx));    E->setLocation(ReadSourceLocation(Record, Idx)); @@ -527,7 +550,6 @@ void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {  }  void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { -  typedef OffsetOfExpr::OffsetOfNode Node;    VisitExpr(E);    assert(E->getNumComponents() == Record[Idx]);    ++Idx; @@ -537,29 +559,29 @@ void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {    E->setRParenLoc(ReadSourceLocation(Record, Idx));    E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));    for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { -    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]); +    OffsetOfNode::Kind Kind = static_cast<OffsetOfNode::Kind>(Record[Idx++]);      SourceLocation Start = ReadSourceLocation(Record, Idx);      SourceLocation End = ReadSourceLocation(Record, Idx);      switch (Kind) { -    case Node::Array: -      E->setComponent(I, Node(Start, Record[Idx++], End)); +    case OffsetOfNode::Array: +      E->setComponent(I, OffsetOfNode(Start, Record[Idx++], End));        break; -         -    case Node::Field: -      E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End)); + +    case OffsetOfNode::Field: +      E->setComponent( +          I, OffsetOfNode(Start, ReadDeclAs<FieldDecl>(Record, Idx), End));        break; -    case Node::Identifier: -      E->setComponent(I,  -                      Node(Start,  -                           Reader.GetIdentifierInfo(F, Record, Idx), -                           End)); +    case OffsetOfNode::Identifier: +      E->setComponent( +          I, +          OffsetOfNode(Start, Reader.GetIdentifierInfo(F, Record, Idx), End));        break; -         -    case Node::Base: { + +    case OffsetOfNode::Base: {        CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier();        *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx); -      E->setComponent(I, Node(Base)); +      E->setComponent(I, OffsetOfNode(Base));        break;      }      } @@ -589,6 +611,15 @@ void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {    E->setRBracketLoc(ReadSourceLocation(Record, Idx));  } +void ASTStmtReader::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) { +  VisitExpr(E); +  E->setBase(Reader.ReadSubExpr()); +  E->setLowerBound(Reader.ReadSubExpr()); +  E->setLength(Reader.ReadSubExpr()); +  E->setColonLoc(ReadSourceLocation(Record, Idx)); +  E->setRBracketLoc(ReadSourceLocation(Record, Idx)); +} +  void ASTStmtReader::VisitCallExpr(CallExpr *E) {    VisitExpr(E);    E->setNumArgs(Reader.getContext(), Record[Idx++]); @@ -821,6 +852,7 @@ void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {    E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));    E->setBuiltinLoc(ReadSourceLocation(Record, Idx));    E->setRParenLoc(ReadSourceLocation(Record, Idx)); +  E->setIsMicrosoftABI(Record[Idx++]);  }  void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { @@ -1168,9 +1200,10 @@ void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {  void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {    VisitStmt(S); -  S->setForLoc(ReadSourceLocation(Record, Idx)); -  S->setColonLoc(ReadSourceLocation(Record, Idx)); -  S->setRParenLoc(ReadSourceLocation(Record, Idx)); +  S->ForLoc = ReadSourceLocation(Record, Idx); +  S->CoawaitLoc = ReadSourceLocation(Record, Idx); +  S->ColonLoc = ReadSourceLocation(Record, Idx); +  S->RParenLoc = ReadSourceLocation(Record, Idx);    S->setRangeStmt(Reader.ReadSubStmt());    S->setBeginEndStmt(Reader.ReadSubStmt());    S->setCond(Reader.ReadSubExpr()); @@ -1422,8 +1455,10 @@ ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){    VisitExpr(E);    if (Record[Idx++]) // HasTemplateKWAndArgsInfo -    ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), -                              /*NumTemplateArgs=*/Record[Idx++]); +    ReadTemplateKWAndArgsInfo( +        *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), +        E->getTrailingObjects<TemplateArgumentLoc>(), +        /*NumTemplateArgs=*/Record[Idx++]);    E->Base = Reader.ReadSubExpr();    E->BaseType = Reader.readType(F, Record, Idx); @@ -1439,8 +1474,10 @@ ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {    VisitExpr(E);    if (Record[Idx++]) // HasTemplateKWAndArgsInfo -    ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), -                              /*NumTemplateArgs=*/Record[Idx++]); +    ReadTemplateKWAndArgsInfo( +        *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), +        E->getTrailingObjects<TemplateArgumentLoc>(), +        /*NumTemplateArgs=*/Record[Idx++]);    E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);    ReadDeclarationNameInfo(E->NameInfo, Record, Idx); @@ -1462,7 +1499,8 @@ void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {    VisitExpr(E);    if (Record[Idx++]) // HasTemplateKWAndArgsInfo -    ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), +    ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(), +                              E->getTrailingTemplateArgumentLoc(),                                /*NumTemplateArgs=*/Record[Idx++]);    unsigned NumDecls = Record[Idx++]; @@ -1544,11 +1582,20 @@ void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {  void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {    VisitExpr(E); +  unsigned NumPartialArgs = Record[Idx++];    E->OperatorLoc = ReadSourceLocation(Record, Idx);    E->PackLoc = ReadSourceLocation(Record, Idx);    E->RParenLoc = ReadSourceLocation(Record, Idx); -  E->Length = Record[Idx++]; -  E->Pack = ReadDeclAs<NamedDecl>(Record, Idx); +  E->Pack = Reader.ReadDeclAs<NamedDecl>(F, Record, Idx); +  if (E->isPartiallySubstituted()) { +    assert(E->Length == NumPartialArgs); +    for (auto *I = reinterpret_cast<TemplateArgument *>(E + 1), +              *E = I + NumPartialArgs; +         I != E; ++I) +      new (I) TemplateArgument(Reader.ReadTemplateArgument(F, Record, Idx)); +  } else if (!E->isValueDependent()) { +    E->Length = Record[Idx++]; +  }  }  void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( @@ -1622,6 +1669,13 @@ void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {    E->TheDecl = ReadDeclAs<MSPropertyDecl>(Record, Idx);  } +void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) { +  VisitExpr(E); +  E->setBase(Reader.ReadSubExpr()); +  E->setIdx(Reader.ReadSubExpr()); +  E->setRBracketLoc(ReadSourceLocation(Record, Idx)); +} +  void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {    VisitExpr(E);    E->setSourceRange(ReadSourceRange(Record, Idx)); @@ -1716,6 +1770,9 @@ OMPClause *OMPClauseReader::readClause() {    case OMPC_safelen:      C = new (Context) OMPSafelenClause();      break; +  case OMPC_simdlen: +    C = new (Context) OMPSimdlenClause(); +    break;    case OMPC_collapse:      C = new (Context) OMPCollapseClause();      break; @@ -1755,6 +1812,15 @@ OMPClause *OMPClauseReader::readClause() {    case OMPC_seq_cst:      C = new (Context) OMPSeqCstClause();      break; +  case OMPC_threads: +    C = new (Context) OMPThreadsClause(); +    break; +  case OMPC_simd: +    C = new (Context) OMPSIMDClause(); +    break; +  case OMPC_nogroup: +    C = new (Context) OMPNogroupClause(); +    break;    case OMPC_private:      C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]);      break; @@ -1788,6 +1854,30 @@ OMPClause *OMPClauseReader::readClause() {    case OMPC_depend:      C = OMPDependClause::CreateEmpty(Context, Record[Idx++]);      break; +  case OMPC_device: +    C = new (Context) OMPDeviceClause(); +    break; +  case OMPC_map: +    C = OMPMapClause::CreateEmpty(Context, Record[Idx++]); +    break; +  case OMPC_num_teams: +    C = new (Context) OMPNumTeamsClause(); +    break; +  case OMPC_thread_limit: +    C = new (Context) OMPThreadLimitClause(); +    break; +  case OMPC_priority: +    C = new (Context) OMPPriorityClause(); +    break; +  case OMPC_grainsize: +    C = new (Context) OMPGrainsizeClause(); +    break; +  case OMPC_num_tasks: +    C = new (Context) OMPNumTasksClause(); +    break; +  case OMPC_hint: +    C = new (Context) OMPHintClause(); +    break;    }    Visit(C);    C->setLocStart(Reader->ReadSourceLocation(Record, Idx)); @@ -1797,6 +1887,9 @@ OMPClause *OMPClauseReader::readClause() {  }  void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { +  C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record[Idx++])); +  C->setNameModifierLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));    C->setCondition(Reader->Reader.ReadSubExpr());    C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));  } @@ -1816,6 +1909,11 @@ void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {    C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));  } +void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { +  C->setSimdlen(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} +  void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {    C->setNumForLoops(Reader->Reader.ReadSubExpr());    C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); @@ -1838,14 +1936,23 @@ void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {  void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {    C->setScheduleKind(         static_cast<OpenMPScheduleClauseKind>(Record[Idx++])); +  C->setFirstScheduleModifier( +      static_cast<OpenMPScheduleClauseModifier>(Record[Idx++])); +  C->setSecondScheduleModifier( +      static_cast<OpenMPScheduleClauseModifier>(Record[Idx++]));    C->setChunkSize(Reader->Reader.ReadSubExpr());    C->setHelperChunkSize(Reader->Reader.ReadSubExpr());    C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setFirstScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setSecondScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx));    C->setScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx));    C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx));  } -void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *) {} +void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { +  C->setNumForLoops(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +}  void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} @@ -1863,6 +1970,12 @@ void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}  void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} +void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} + +void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} + +void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} +  void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {    C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));    unsigned NumVars = C->varlist_size(); @@ -1950,6 +2063,10 @@ void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {    Vars.clear();    for (unsigned i = 0; i != NumVars; ++i)      Vars.push_back(Reader->Reader.ReadSubExpr()); +  C->setPrivates(Vars); +  Vars.clear(); +  for (unsigned i = 0; i != NumVars; ++i) +    Vars.push_back(Reader->Reader.ReadSubExpr());    C->setLHSExprs(Vars);    Vars.clear();    for (unsigned i = 0; i != NumVars; ++i) @@ -1964,6 +2081,8 @@ void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {  void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {    C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));    C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setModifier(static_cast<OpenMPLinearClauseKind>(Record[Idx++])); +  C->setModifierLoc(Reader->ReadSourceLocation(Record, Idx));    unsigned NumVars = C->varlist_size();    SmallVector<Expr *, 16> Vars;    Vars.reserve(NumVars); @@ -1973,6 +2092,10 @@ void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {    Vars.clear();    for (unsigned i = 0; i != NumVars; ++i)      Vars.push_back(Reader->Reader.ReadSubExpr()); +  C->setPrivates(Vars); +  Vars.clear(); +  for (unsigned i = 0; i != NumVars; ++i) +    Vars.push_back(Reader->Reader.ReadSubExpr());    C->setInits(Vars);    Vars.clear();    for (unsigned i = 0; i != NumVars; ++i) @@ -2065,6 +2188,58 @@ void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {    C->setVarRefs(Vars);  } +void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { +  C->setDevice(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setMapTypeModifier( +     static_cast<OpenMPMapClauseKind>(Record[Idx++])); +  C->setMapType( +     static_cast<OpenMPMapClauseKind>(Record[Idx++])); +  C->setMapLoc(Reader->ReadSourceLocation(Record, Idx)); +  C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); +  auto NumVars = C->varlist_size(); +  SmallVector<Expr *, 16> Vars; +  Vars.reserve(NumVars); +  for (unsigned i = 0; i != NumVars; ++i) { +    Vars.push_back(Reader->Reader.ReadSubExpr()); +  } +  C->setVarRefs(Vars); +} + +void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { +  C->setNumTeams(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { +  C->setThreadLimit(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { +  C->setPriority(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { +  C->setGrainsize(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { +  C->setNumTasks(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} + +void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { +  C->setHint(Reader->Reader.ReadSubExpr()); +  C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); +} +  //===----------------------------------------------------------------------===//  // OpenMP Directives.  //===----------------------------------------------------------------------===// @@ -2110,6 +2285,10 @@ void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) {    Sub.clear();    for (unsigned i = 0; i < CollapsedNum; ++i)      Sub.push_back(Reader.ReadSubExpr()); +  D->setPrivateCounters(Sub); +  Sub.clear(); +  for (unsigned i = 0; i < CollapsedNum; ++i) +    Sub.push_back(Reader.ReadSubExpr());    D->setInits(Sub);    Sub.clear();    for (unsigned i = 0; i < CollapsedNum; ++i) @@ -2126,6 +2305,7 @@ void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) {    // The NumClauses field was read in ReadStmtFromStream.    ++Idx;    VisitOMPExecutableDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) { @@ -2134,6 +2314,7 @@ void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {  void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) {    VisitOMPLoopDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) { @@ -2145,11 +2326,13 @@ void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) {    // The NumClauses field was read in ReadStmtFromStream.    ++Idx;    VisitOMPExecutableDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) {    VisitStmt(D);    VisitOMPExecutableDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) { @@ -2166,12 +2349,15 @@ void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) {  void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) {    VisitStmt(D); +  // The NumClauses field was read in ReadStmtFromStream. +  ++Idx;    VisitOMPExecutableDirective(D);    ReadDeclarationNameInfo(D->DirName, Record, Idx);  }  void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) {    VisitOMPLoopDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPParallelForSimdDirective( @@ -2185,6 +2371,7 @@ void ASTStmtReader::VisitOMPParallelSectionsDirective(    // The NumClauses field was read in ReadStmtFromStream.    ++Idx;    VisitOMPExecutableDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) { @@ -2192,6 +2379,7 @@ void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {    // The NumClauses field was read in ReadStmtFromStream.    ++Idx;    VisitOMPExecutableDirective(D); +  D->setHasCancel(Record[Idx++]);  }  void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) { @@ -2223,6 +2411,8 @@ void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) {  void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) {    VisitStmt(D); +  // The NumClauses field was read in ReadStmtFromStream. +  ++Idx;    VisitOMPExecutableDirective(D);  } @@ -2246,6 +2436,12 @@ void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) {    VisitOMPExecutableDirective(D);  } +void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) { +  VisitStmt(D); +  ++Idx; +  VisitOMPExecutableDirective(D); +} +  void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) {    VisitStmt(D);    // The NumClauses field was read in ReadStmtFromStream. @@ -2262,10 +2458,24 @@ void ASTStmtReader::VisitOMPCancellationPointDirective(  void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) {    VisitStmt(D); +  // The NumClauses field was read in ReadStmtFromStream. +  ++Idx;    VisitOMPExecutableDirective(D);    D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++]));  } +void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) { +  VisitOMPLoopDirective(D); +} + +void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) { +  VisitOMPLoopDirective(D); +} + +void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) { +  VisitOMPLoopDirective(D); +} +  //===----------------------------------------------------------------------===//  // ASTReader Implementation  //===----------------------------------------------------------------------===// @@ -2497,6 +2707,10 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        S = new (Context) ArraySubscriptExpr(Empty);        break; +    case EXPR_OMP_ARRAY_SECTION: +      S = new (Context) OMPArraySectionExpr(Empty); +      break; +      case EXPR_CALL:        S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty);        break; @@ -2800,7 +3014,8 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        break;      case STMT_OMP_CRITICAL_DIRECTIVE: -      S = OMPCriticalDirective::CreateEmpty(Context, Empty); +      S = OMPCriticalDirective::CreateEmpty( +          Context, Record[ASTStmtReader::NumStmtFields], Empty);        break;      case STMT_OMP_PARALLEL_FOR_DIRECTIVE: { @@ -2851,7 +3066,8 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        break;      case STMT_OMP_ORDERED_DIRECTIVE: -      S = OMPOrderedDirective::CreateEmpty(Context, Empty); +      S = OMPOrderedDirective::CreateEmpty( +          Context, Record[ASTStmtReader::NumStmtFields], Empty);        break;      case STMT_OMP_ATOMIC_DIRECTIVE: @@ -2864,6 +3080,11 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {            Context, Record[ASTStmtReader::NumStmtFields], Empty);        break; +    case STMT_OMP_TARGET_DATA_DIRECTIVE: +      S = OMPTargetDataDirective::CreateEmpty( +          Context, Record[ASTStmtReader::NumStmtFields], Empty); +      break; +      case STMT_OMP_TEAMS_DIRECTIVE:        S = OMPTeamsDirective::CreateEmpty(            Context, Record[ASTStmtReader::NumStmtFields], Empty); @@ -2874,9 +3095,34 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        break;      case STMT_OMP_CANCEL_DIRECTIVE: -      S = OMPCancelDirective::CreateEmpty(Context, Empty); +      S = OMPCancelDirective::CreateEmpty( +          Context, Record[ASTStmtReader::NumStmtFields], Empty);        break; +    case STMT_OMP_TASKLOOP_DIRECTIVE: { +      unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; +      unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; +      S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum, +                                            Empty); +      break; +    } + +    case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: { +      unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; +      unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; +      S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses, +                                                CollapsedNum, Empty); +      break; +    } + +    case STMT_OMP_DISTRIBUTE_DIRECTIVE: { +      unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; +      unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; +      S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum, +                                              Empty); +      break; +    } +      case EXPR_CXX_OPERATOR_CALL:        S = new (Context) CXXOperatorCallExpr(Context, Empty);        break; @@ -2944,6 +3190,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {      case EXPR_CXX_PROPERTY_REF_EXPR:        S = new (Context) MSPropertyRefExpr(Empty);        break; +    case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR: +      S = new (Context) MSPropertySubscriptExpr(Empty); +      break;      case EXPR_CXX_UUIDOF_TYPE:        S = new (Context) CXXUuidofExpr(Empty, false);        break; @@ -3047,7 +3296,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {        break;      case EXPR_SIZEOF_PACK: -      S = new (Context) SizeOfPackExpr(Empty); +      S = SizeOfPackExpr::CreateDeserialized( +              Context, +              /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);        break;      case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:  | 
