diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 | 
| commit | 145449b1e420787bb99721a429341fa6be3adfb6 (patch) | |
| tree | 1d56ae694a6de602e348dd80165cf881a36600ed /clang/lib/Serialization/ASTReader.cpp | |
| parent | ecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (diff) | |
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 1212 | 
1 files changed, 525 insertions, 687 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index d806fb9e1949..d853805bf97e 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -15,6 +15,7 @@  #include "clang/AST/ASTConsumer.h"  #include "clang/AST/ASTContext.h"  #include "clang/AST/ASTMutationListener.h" +#include "clang/AST/ASTStructuralEquivalence.h"  #include "clang/AST/ASTUnresolvedSet.h"  #include "clang/AST/AbstractTypeReader.h"  #include "clang/AST/Decl.h" @@ -42,6 +43,7 @@  #include "clang/Basic/Diagnostic.h"  #include "clang/Basic/DiagnosticError.h"  #include "clang/Basic/DiagnosticOptions.h" +#include "clang/Basic/DiagnosticSema.h"  #include "clang/Basic/ExceptionSpecificationType.h"  #include "clang/Basic/FileManager.h"  #include "clang/Basic/FileSystemOptions.h" @@ -312,7 +314,7 @@ static bool checkLanguageOptions(const LangOptions &LangOpts,  #define BENIGN_LANGOPT(Name, Bits, Default, Description)  #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) -#define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) +#define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description)  #include "clang/Basic/LangOptions.def"    if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { @@ -1587,14 +1589,13 @@ bool ASTReader::ReadSLocEntry(int ID) {    }    case SM_SLOC_EXPANSION_ENTRY: { -    SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); -    SourceMgr.createExpansionLoc(SpellingLoc, -                                     ReadSourceLocation(*F, Record[2]), -                                     ReadSourceLocation(*F, Record[3]), -                                     Record[5], -                                     Record[4], -                                     ID, -                                     BaseOffset + Record[0]); +    LocSeq::State Seq; +    SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1], Seq); +    SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2], Seq); +    SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3], Seq); +    SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd, +                                 Record[5], Record[4], ID, +                                 BaseOffset + Record[0]);      break;    }    } @@ -1694,6 +1695,7 @@ MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {    RecordData Record;    SmallVector<IdentifierInfo*, 16> MacroParams;    MacroInfo *Macro = nullptr; +  llvm::MutableArrayRef<Token> MacroTokens;    while (true) {      // Advance to the next record, but if we get to the end of the block, don't @@ -1748,7 +1750,8 @@ MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {        MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex));        MI->setIsUsed(Record[NextIndex++]);        MI->setUsedForHeaderGuard(Record[NextIndex++]); - +      MacroTokens = MI->allocateTokens(Record[NextIndex++], +                                       PP.getPreprocessorAllocator());        if (RecType == PP_MACRO_FUNCTION_LIKE) {          // Decode function-like macro info.          bool isC99VarArgs = Record[NextIndex++]; @@ -1793,10 +1796,14 @@ MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) {        // If we see a TOKEN before a PP_MACRO_*, then the file is        // erroneous, just pretend we didn't see this.        if (!Macro) break; +      if (MacroTokens.empty()) { +        Error("unexpected number of macro tokens for a macro in AST file"); +        return Macro; +      }        unsigned Idx = 0; -      Token Tok = ReadToken(F, Record, Idx); -      Macro->AddTokenToBody(Tok); +      MacroTokens[0] = ReadToken(F, Record, Idx); +      MacroTokens = MacroTokens.drop_front();        break;      }      } @@ -2219,7 +2226,7 @@ bool ASTReader::shouldDisableValidationForFile(    // If a PCH is loaded and validation is disabled for PCH then disable    // validation for the PCH and the modules it loads. -  ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); +  ModuleKind K = CurrentDeserializingModuleKind.value_or(M.Kind);    switch (K) {    case MK_MainFile: @@ -2433,8 +2440,8 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {            << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind)            << TopLevelPCHName << FileChange.Kind            << (FileChange.Old && FileChange.New) -          << llvm::itostr(FileChange.Old.getValueOr(0)) -          << llvm::itostr(FileChange.New.getValueOr(0)); +          << llvm::itostr(FileChange.Old.value_or(0)) +          << llvm::itostr(FileChange.New.value_or(0));        // Print the import stack.        if (ImportStack.size() > 1) { @@ -2890,6 +2897,7 @@ ASTReader::ReadControlBlock(ModuleFile &F,      case ORIGINAL_PCH_DIR:        F.OriginalDir = std::string(Blob); +      ResolveImportedPath(F, F.OriginalDir);        break;      case MODULE_NAME: @@ -3103,6 +3111,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,        case IDENTIFIER_OFFSET:        case INTERESTING_IDENTIFIERS:        case STATISTICS: +      case PP_ASSUME_NONNULL_LOC:        case PP_CONDITIONAL_STACK:        case PP_COUNTER_VALUE:        case SOURCE_LOCATION_OFFSETS: @@ -3301,7 +3310,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,        break;      case WEAK_UNDECLARED_IDENTIFIERS: -      if (Record.size() % 4 != 0) +      if (Record.size() % 3 != 0)          return llvm::createStringError(std::errc::illegal_byte_sequence,                                         "invalid weak identifiers record"); @@ -3316,8 +3325,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,          WeakUndeclaredIdentifiers.push_back(            getGlobalIdentifierID(F, Record[I++]));          WeakUndeclaredIdentifiers.push_back( -          ReadSourceLocation(F, Record, I).getRawEncoding()); -        WeakUndeclaredIdentifiers.push_back(Record[I++]); +            ReadSourceLocation(F, Record, I).getRawEncoding());        }        break; @@ -3365,6 +3373,14 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,        }        break; +    case PP_ASSUME_NONNULL_LOC: { +      unsigned Idx = 0; +      if (!Record.empty()) +        PP.setPreambleRecordedPragmaAssumeNonNullLoc( +            ReadSourceLocation(F, Record, Idx)); +      break; +    } +      case PP_CONDITIONAL_STACK:        if (!Record.empty()) {          unsigned Idx = 0, End = Record.size() - 1; @@ -5057,7 +5073,8 @@ std::string ASTReader::getOriginalSourceFile(      const std::string &ASTFileName, FileManager &FileMgr,      const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) {    // Open the AST file. -  auto Buffer = FileMgr.getBufferForFile(ASTFileName); +  auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false, +                                         /*RequiresNullTerminator=*/false);    if (!Buffer) {      Diags.Report(diag::err_fe_unable_to_read_pch_file)          << ASTFileName << Buffer.getError().message(); @@ -5620,9 +5637,12 @@ llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F,        // them here.        break; -    case SUBMODULE_TOPHEADER: -      CurrentModule->addTopHeaderFilename(Blob); +    case SUBMODULE_TOPHEADER: { +      std::string HeaderName(Blob); +      ResolveImportedPath(F, HeaderName); +      CurrentModule->addTopHeaderFilename(HeaderName);        break; +    }      case SUBMODULE_UMBRELLA_DIR: {        // See comments in SUBMODULE_UMBRELLA_HEADER @@ -6029,10 +6049,9 @@ PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {    case PPD_INCLUSION_DIRECTIVE: {      const char *FullFileNameStart = Blob.data() + Record[0];      StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); -    const FileEntry *File = nullptr; +    Optional<FileEntryRef> File;      if (!FullFileName.empty()) -      if (auto FE = PP.getFileManager().getFile(FullFileName)) -        File = *FE; +      File = PP.getFileManager().getOptionalFileRef(FullFileName);      // FIXME: Stable encoding      InclusionDirective::InclusionKind Kind @@ -6446,11 +6465,13 @@ QualType ASTReader::readTypeRecord(unsigned Index) {  namespace clang {  class TypeLocReader : public TypeLocVisitor<TypeLocReader> { +  using LocSeq = SourceLocationSequence; +    ASTRecordReader &Reader; +  LocSeq *Seq; -  SourceLocation readSourceLocation() { -    return Reader.readSourceLocation(); -  } +  SourceLocation readSourceLocation() { return Reader.readSourceLocation(Seq); } +  SourceRange readSourceRange() { return Reader.readSourceRange(Seq); }    TypeSourceInfo *GetTypeSourceInfo() {      return Reader.readTypeSourceInfo(); @@ -6465,7 +6486,8 @@ class TypeLocReader : public TypeLocVisitor<TypeLocReader> {    }  public: -  TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} +  TypeLocReader(ASTRecordReader &Reader, LocSeq *Seq) +      : Reader(Reader), Seq(Seq) {}    // We want compile-time assurance that we've enumerated all of    // these, so unfortunately we have to declare them first, then @@ -6562,7 +6584,7 @@ void TypeLocReader::VisitDependentAddressSpaceTypeLoc(      DependentAddressSpaceTypeLoc TL) {      TL.setAttrNameLoc(readSourceLocation()); -    TL.setAttrOperandParensRange(Reader.readSourceRange()); +    TL.setAttrOperandParensRange(readSourceRange());      TL.setAttrExprOperand(Reader.readExpr());  } @@ -6586,7 +6608,7 @@ void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {  void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {    TL.setAttrNameLoc(readSourceLocation()); -  TL.setAttrOperandParensRange(Reader.readSourceRange()); +  TL.setAttrOperandParensRange(readSourceRange());    TL.setAttrRowOperand(Reader.readExpr());    TL.setAttrColumnOperand(Reader.readExpr());  } @@ -6594,7 +6616,7 @@ void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {  void TypeLocReader::VisitDependentSizedMatrixTypeLoc(      DependentSizedMatrixTypeLoc TL) {    TL.setAttrNameLoc(readSourceLocation()); -  TL.setAttrOperandParensRange(Reader.readSourceRange()); +  TL.setAttrOperandParensRange(readSourceRange());    TL.setAttrRowOperand(Reader.readExpr());    TL.setAttrColumnOperand(Reader.readExpr());  } @@ -6603,7 +6625,7 @@ void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) {    TL.setLocalRangeBegin(readSourceLocation());    TL.setLParenLoc(readSourceLocation());    TL.setRParenLoc(readSourceLocation()); -  TL.setExceptionSpecRange(Reader.readSourceRange()); +  TL.setExceptionSpecRange(readSourceRange());    TL.setLocalRangeEnd(readSourceLocation());    for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) {      TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); @@ -6689,6 +6711,10 @@ void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {    TL.setAttr(ReadAttr());  } +void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) { +  // Nothing to do. +} +  void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {    TL.setNameLoc(readSourceLocation());  } @@ -6802,9 +6828,9 @@ void TypeLocReader::VisitDependentBitIntTypeLoc(    TL.setNameLoc(readSourceLocation());  } - -void ASTRecordReader::readTypeLoc(TypeLoc TL) { -  TypeLocReader TLR(*this); +void ASTRecordReader::readTypeLoc(TypeLoc TL, LocSeq *ParentSeq) { +  LocSeq::State Seq(ParentSeq); +  TypeLocReader TLR(*this, Seq);    for (; !TL.isNull(); TL = TL.getNextTypeLoc())      TLR.Visit(TL);  } @@ -8386,11 +8412,9 @@ void ASTReader::ReadWeakUndeclaredIdentifiers(        = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]);      IdentifierInfo *AliasId        = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); -    SourceLocation Loc -      = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); -    bool Used = WeakUndeclaredIdentifiers[I++]; +    SourceLocation Loc = +        SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]);      WeakInfo WI(AliasId, Loc); -    WI.setUsed(Used);      WeakIDs.push_back(std::make_pair(WeakId, WI));    }    WeakUndeclaredIdentifiers.clear(); @@ -8973,11 +8997,10 @@ ASTRecordReader::readNestedNameSpecifierLoc() {    return Builder.getWithLocInContext(Context);  } -SourceRange -ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, -                           unsigned &Idx) { -  SourceLocation beg = ReadSourceLocation(F, Record, Idx); -  SourceLocation end = ReadSourceLocation(F, Record, Idx); +SourceRange ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, +                                       unsigned &Idx, LocSeq *Seq) { +  SourceLocation beg = ReadSourceLocation(F, Record, Idx, Seq); +  SourceLocation end = ReadSourceLocation(F, Record, Idx, Seq);    return SourceRange(beg, end);  } @@ -9177,7 +9200,8 @@ void ASTReader::finishPendingActions() {    while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() ||           !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() ||           !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || -         !PendingUpdateRecords.empty()) { +         !PendingUpdateRecords.empty() || +         !PendingObjCExtensionIvarRedeclarations.empty()) {      // If any identifiers with corresponding top-level declarations have      // been loaded, load those declarations now.      using TopLevelDeclsMap = @@ -9268,6 +9292,43 @@ void ASTReader::finishPendingActions() {        ReadingKindTracker ReadingKind(Read_Decl, *this);        loadDeclUpdateRecords(Update);      } + +    while (!PendingObjCExtensionIvarRedeclarations.empty()) { +      auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first; +      auto DuplicateIvars = +          PendingObjCExtensionIvarRedeclarations.back().second; +      llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls; +      StructuralEquivalenceContext Ctx( +          ExtensionsPair.first->getASTContext(), +          ExtensionsPair.second->getASTContext(), NonEquivalentDecls, +          StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false, +          /*Complain =*/false, +          /*ErrorOnTagTypeMismatch =*/true); +      if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) { +        // Merge redeclared ivars with their predecessors. +        for (auto IvarPair : DuplicateIvars) { +          ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second; +          // Change semantic DeclContext but keep the lexical one. +          Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(), +                                    Ivar->getLexicalDeclContext(), +                                    getContext()); +          getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl()); +        } +        // Invalidate duplicate extension and the cached ivar list. +        ExtensionsPair.first->setInvalidDecl(); +        ExtensionsPair.second->getClassInterface() +            ->getDefinition() +            ->setIvarList(nullptr); +      } else { +        for (auto IvarPair : DuplicateIvars) { +          Diag(IvarPair.first->getLocation(), +               diag::err_duplicate_ivar_declaration) +              << IvarPair.first->getIdentifier(); +          Diag(IvarPair.second->getLocation(), diag::note_previous_definition); +        } +      } +      PendingObjCExtensionIvarRedeclarations.pop_back(); +    }    }    // At this point, all update records for loaded decls are in place, so any @@ -9576,19 +9637,12 @@ void ASTReader::diagnoseOdrViolations() {      Other    }; -  // Used with err_module_odr_violation_mismatch_decl_diff and -  // note_module_odr_violation_mismatch_decl_diff -  enum ODRMismatchDeclDifference { +  // Used with err_module_odr_violation_record and +  // note_module_odr_violation_record +  enum ODRCXXRecordDifference {      StaticAssertCondition,      StaticAssertMessage,      StaticAssertOnlyMessage, -    FieldName, -    FieldTypeName, -    FieldSingleBitField, -    FieldDifferentWidthBitField, -    FieldSingleMutable, -    FieldSingleInitializer, -    FieldDifferentInitializers,      MethodName,      MethodDeleted,      MethodDefaulted, @@ -9607,13 +9661,6 @@ void ASTReader::diagnoseOdrViolations() {      MethodDifferentTemplateArgument,      MethodSingleBody,      MethodDifferentBody, -    TypedefName, -    TypedefType, -    VarName, -    VarType, -    VarSingleInitializer, -    VarDifferentInitializer, -    VarConstexpr,      FriendTypeFunction,      FriendType,      FriendFunction, @@ -9629,34 +9676,39 @@ void ASTReader::diagnoseOdrViolations() {    // These lambdas have the common portions of the ODR diagnostics.  This    // has the same return as Diag(), so addition parameters can be passed    // in with operator<< -  auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, -                                 SourceLocation Loc, SourceRange Range, -                                 ODRMismatchDeclDifference DiffType) { -    return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) -           << FirstRecord << FirstModule.empty() << FirstModule << Range -           << DiffType; -  }; -  auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, -                                SourceRange Range, ODRMismatchDeclDifference DiffType) { -    return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) -           << SecondModule << Range << DiffType; -  }; - -  auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, -                       &ComputeQualTypeODRHash, &ComputeODRHash]( +  auto ODRDiagField = [this, &ComputeQualTypeODRHash, &ComputeODRHash](                            NamedDecl *FirstRecord, StringRef FirstModule,                            StringRef SecondModule, FieldDecl *FirstField,                            FieldDecl *SecondField) { +    enum ODRFieldDifference { +      FieldName, +      FieldTypeName, +      FieldSingleBitField, +      FieldDifferentWidthBitField, +      FieldSingleMutable, +      FieldSingleInitializer, +      FieldDifferentInitializers, +    }; + +    auto DiagError = [FirstRecord, FirstField, FirstModule, +                      this](ODRFieldDifference DiffType) { +      return Diag(FirstField->getLocation(), +                  diag::err_module_odr_violation_field) +             << FirstRecord << FirstModule.empty() << FirstModule +             << FirstField->getSourceRange() << DiffType; +    }; +    auto DiagNote = [SecondField, SecondModule, +                     this](ODRFieldDifference DiffType) { +      return Diag(SecondField->getLocation(), +                  diag::note_module_odr_violation_field) +             << SecondModule << SecondField->getSourceRange() << DiffType; +    }; +      IdentifierInfo *FirstII = FirstField->getIdentifier();      IdentifierInfo *SecondII = SecondField->getIdentifier();      if (FirstII->getName() != SecondII->getName()) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                       FirstField->getSourceRange(), FieldName) -          << FirstII; -      ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                      SecondField->getSourceRange(), FieldName) -          << SecondII; - +      DiagError(FieldName) << FirstII; +      DiagNote(FieldName) << SecondII;        return true;      } @@ -9667,25 +9719,16 @@ void ASTReader::diagnoseOdrViolations() {      QualType SecondType = SecondField->getType();      if (ComputeQualTypeODRHash(FirstType) !=          ComputeQualTypeODRHash(SecondType)) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                       FirstField->getSourceRange(), FieldTypeName) -          << FirstII << FirstType; -      ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                      SecondField->getSourceRange(), FieldTypeName) -          << SecondII << SecondType; - +      DiagError(FieldTypeName) << FirstII << FirstType; +      DiagNote(FieldTypeName) << SecondII << SecondType;        return true;      }      const bool IsFirstBitField = FirstField->isBitField();      const bool IsSecondBitField = SecondField->isBitField();      if (IsFirstBitField != IsSecondBitField) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                       FirstField->getSourceRange(), FieldSingleBitField) -          << FirstII << IsFirstBitField; -      ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                      SecondField->getSourceRange(), FieldSingleBitField) -          << SecondII << IsSecondBitField; +      DiagError(FieldSingleBitField) << FirstII << IsFirstBitField; +      DiagNote(FieldSingleBitField) << SecondII << IsSecondBitField;        return true;      } @@ -9695,13 +9738,9 @@ void ASTReader::diagnoseOdrViolations() {        unsigned SecondBitWidthHash =            ComputeODRHash(SecondField->getBitWidth());        if (FirstBitWidthHash != SecondBitWidthHash) { -        ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                         FirstField->getSourceRange(), -                         FieldDifferentWidthBitField) +        DiagError(FieldDifferentWidthBitField)              << FirstII << FirstField->getBitWidth()->getSourceRange(); -        ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                        SecondField->getSourceRange(), -                        FieldDifferentWidthBitField) +        DiagNote(FieldDifferentWidthBitField)              << SecondII << SecondField->getBitWidth()->getSourceRange();          return true;        } @@ -9713,12 +9752,8 @@ void ASTReader::diagnoseOdrViolations() {      const bool IsFirstMutable = FirstField->isMutable();      const bool IsSecondMutable = SecondField->isMutable();      if (IsFirstMutable != IsSecondMutable) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                       FirstField->getSourceRange(), FieldSingleMutable) -          << FirstII << IsFirstMutable; -      ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                      SecondField->getSourceRange(), FieldSingleMutable) -          << SecondII << IsSecondMutable; +      DiagError(FieldSingleMutable) << FirstII << IsFirstMutable; +      DiagNote(FieldSingleMutable) << SecondII << IsSecondMutable;        return true;      } @@ -9726,11 +9761,9 @@ void ASTReader::diagnoseOdrViolations() {      const Expr *SecondInitializer = SecondField->getInClassInitializer();      if ((!FirstInitializer && SecondInitializer) ||          (FirstInitializer && !SecondInitializer)) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                       FirstField->getSourceRange(), FieldSingleInitializer) +      DiagError(FieldSingleInitializer)            << FirstII << (FirstInitializer != nullptr); -      ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                      SecondField->getSourceRange(), FieldSingleInitializer) +      DiagNote(FieldSingleInitializer)            << SecondII << (SecondInitializer != nullptr);        return true;      } @@ -9739,13 +9772,9 @@ void ASTReader::diagnoseOdrViolations() {        unsigned FirstInitHash = ComputeODRHash(FirstInitializer);        unsigned SecondInitHash = ComputeODRHash(SecondInitializer);        if (FirstInitHash != SecondInitHash) { -        ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), -                         FirstField->getSourceRange(), -                         FieldDifferentInitializers) +        DiagError(FieldDifferentInitializers)              << FirstII << FirstInitializer->getSourceRange(); -        ODRDiagDeclNote(SecondModule, SecondField->getLocation(), -                        SecondField->getSourceRange(), -                        FieldDifferentInitializers) +        DiagNote(FieldDifferentInitializers)              << SecondII << SecondInitializer->getSourceRange();          return true;        } @@ -9755,19 +9784,34 @@ void ASTReader::diagnoseOdrViolations() {    };    auto ODRDiagTypeDefOrAlias = -      [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( +      [this, &ComputeQualTypeODRHash](            NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule,            TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD,            bool IsTypeAlias) { +        enum ODRTypedefDifference { +          TypedefName, +          TypedefType, +        }; + +        auto DiagError = [FirstRecord, FirstTD, FirstModule, +                          this](ODRTypedefDifference DiffType) { +          return Diag(FirstTD->getLocation(), +                      diag::err_module_odr_violation_typedef) +                 << FirstRecord << FirstModule.empty() << FirstModule +                 << FirstTD->getSourceRange() << DiffType; +        }; +        auto DiagNote = [SecondTD, SecondModule, +                         this](ODRTypedefDifference DiffType) { +          return Diag(SecondTD->getLocation(), +                      diag::note_module_odr_violation_typedef) +                 << SecondModule << SecondTD->getSourceRange() << DiffType; +        }; +          auto FirstName = FirstTD->getDeclName();          auto SecondName = SecondTD->getDeclName();          if (FirstName != SecondName) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), -                           FirstTD->getSourceRange(), TypedefName) -              << IsTypeAlias << FirstName; -          ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), -                          SecondTD->getSourceRange(), TypedefName) -              << IsTypeAlias << SecondName; +          DiagError(TypedefName) << IsTypeAlias << FirstName; +          DiagNote(TypedefName) << IsTypeAlias << SecondName;            return true;          } @@ -9775,32 +9819,44 @@ void ASTReader::diagnoseOdrViolations() {          QualType SecondType = SecondTD->getUnderlyingType();          if (ComputeQualTypeODRHash(FirstType) !=              ComputeQualTypeODRHash(SecondType)) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), -                           FirstTD->getSourceRange(), TypedefType) -              << IsTypeAlias << FirstName << FirstType; -          ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), -                          SecondTD->getSourceRange(), TypedefType) -              << IsTypeAlias << SecondName << SecondType; +          DiagError(TypedefType) << IsTypeAlias << FirstName << FirstType; +          DiagNote(TypedefType) << IsTypeAlias << SecondName << SecondType;            return true;          }          return false; -  }; +      }; -  auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, -                     &ComputeQualTypeODRHash, &ComputeODRHash, +  auto ODRDiagVar = [&ComputeQualTypeODRHash, &ComputeODRHash,                       this](NamedDecl *FirstRecord, StringRef FirstModule,                             StringRef SecondModule, VarDecl *FirstVD,                             VarDecl *SecondVD) { +    enum ODRVarDifference { +      VarName, +      VarType, +      VarSingleInitializer, +      VarDifferentInitializer, +      VarConstexpr, +    }; + +    auto DiagError = [FirstRecord, FirstVD, FirstModule, +                      this](ODRVarDifference DiffType) { +      return Diag(FirstVD->getLocation(), +                  diag::err_module_odr_violation_variable) +             << FirstRecord << FirstModule.empty() << FirstModule +             << FirstVD->getSourceRange() << DiffType; +    }; +    auto DiagNote = [SecondVD, SecondModule, this](ODRVarDifference DiffType) { +      return Diag(SecondVD->getLocation(), +                  diag::note_module_odr_violation_variable) +             << SecondModule << SecondVD->getSourceRange() << DiffType; +    }; +      auto FirstName = FirstVD->getDeclName();      auto SecondName = SecondVD->getDeclName();      if (FirstName != SecondName) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), -                       FirstVD->getSourceRange(), VarName) -          << FirstName; -      ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), -                      SecondVD->getSourceRange(), VarName) -          << SecondName; +      DiagError(VarName) << FirstName; +      DiagNote(VarName) << SecondName;        return true;      } @@ -9808,12 +9864,8 @@ void ASTReader::diagnoseOdrViolations() {      QualType SecondType = SecondVD->getType();      if (ComputeQualTypeODRHash(FirstType) !=          ComputeQualTypeODRHash(SecondType)) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), -                       FirstVD->getSourceRange(), VarType) -          << FirstName << FirstType; -      ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), -                      SecondVD->getSourceRange(), VarType) -          << SecondName << SecondType; +      DiagError(VarType) << FirstName << FirstType; +      DiagNote(VarType) << SecondName << SecondType;        return true;      } @@ -9823,12 +9875,10 @@ void ASTReader::diagnoseOdrViolations() {      const Expr *FirstInit = FirstVD->getInit();      const Expr *SecondInit = SecondVD->getInit();      if ((FirstInit == nullptr) != (SecondInit == nullptr)) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), -                       FirstVD->getSourceRange(), VarSingleInitializer) +      DiagError(VarSingleInitializer)            << FirstName << (FirstInit == nullptr)            << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); -      ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), -                      SecondVD->getSourceRange(), VarSingleInitializer) +      DiagNote(VarSingleInitializer)            << SecondName << (SecondInit == nullptr)            << (SecondInit ? SecondInit->getSourceRange() : SourceRange());        return true; @@ -9836,11 +9886,9 @@ void ASTReader::diagnoseOdrViolations() {      if (FirstInit && SecondInit &&          ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), -                       FirstVD->getSourceRange(), VarDifferentInitializer) +      DiagError(VarDifferentInitializer)            << FirstName << FirstInit->getSourceRange(); -      ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), -                      SecondVD->getSourceRange(), VarDifferentInitializer) +      DiagNote(VarDifferentInitializer)            << SecondName << SecondInit->getSourceRange();        return true;      } @@ -9848,12 +9896,8 @@ void ASTReader::diagnoseOdrViolations() {      const bool FirstIsConstexpr = FirstVD->isConstexpr();      const bool SecondIsConstexpr = SecondVD->isConstexpr();      if (FirstIsConstexpr != SecondIsConstexpr) { -      ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), -                       FirstVD->getSourceRange(), VarConstexpr) -          << FirstName << FirstIsConstexpr; -      ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), -                      SecondVD->getSourceRange(), VarConstexpr) -          << SecondName << SecondIsConstexpr; +      DiagError(VarConstexpr) << FirstName << FirstIsConstexpr; +      DiagNote(VarConstexpr) << SecondName << SecondIsConstexpr;        return true;      }      return false; @@ -9968,34 +10012,35 @@ void ASTReader::diagnoseOdrViolations() {      }    }; -  auto DiagnoseODRMismatch = -      [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, -             NamedDecl *SecondRecord, StringRef SecondModule) { -        SourceLocation FirstLoc; -        SourceRange FirstRange; -        auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); -        if (DR.FirstDiffType == EndOfClass && FirstTag) { -          FirstLoc = FirstTag->getBraceRange().getEnd(); -        } else { -          FirstLoc = DR.FirstDecl->getLocation(); -          FirstRange = DR.FirstDecl->getSourceRange(); -        } -        Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) -            << FirstRecord << FirstModule.empty() << FirstModule << FirstRange -            << DR.FirstDiffType; - -        SourceLocation SecondLoc; -        SourceRange SecondRange; -        auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); -        if (DR.SecondDiffType == EndOfClass && SecondTag) { -          SecondLoc = SecondTag->getBraceRange().getEnd(); -        } else { -          SecondLoc = DR.SecondDecl->getLocation(); -          SecondRange = DR.SecondDecl->getSourceRange(); -        } -        Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) -            << SecondModule << SecondRange << DR.SecondDiffType; -      }; +  auto DiagnoseODRMismatch = [this](DiffResult &DR, NamedDecl *FirstRecord, +                                    StringRef FirstModule, +                                    NamedDecl *SecondRecord, +                                    StringRef SecondModule) { +    auto GetMismatchedDeclLoc = [](const NamedDecl *Container, +                                   ODRMismatchDecl DiffType, const Decl *D) { +      SourceLocation Loc; +      SourceRange Range; +      auto *Tag = dyn_cast<TagDecl>(Container); +      if (DiffType == EndOfClass && Tag) { +        Loc = Tag->getBraceRange().getEnd(); +      } else { +        Loc = D->getLocation(); +        Range = D->getSourceRange(); +      } +      return std::make_pair(Loc, Range); +    }; + +    auto FirstDiagInfo = +        GetMismatchedDeclLoc(FirstRecord, DR.FirstDiffType, DR.FirstDecl); +    Diag(FirstDiagInfo.first, diag::err_module_odr_violation_mismatch_decl) +        << FirstRecord << FirstModule.empty() << FirstModule +        << FirstDiagInfo.second << DR.FirstDiffType; + +    auto SecondDiagInfo = +        GetMismatchedDeclLoc(SecondRecord, DR.SecondDiffType, DR.SecondDecl); +    Diag(SecondDiagInfo.first, diag::note_module_odr_violation_mismatch_decl) +        << SecondModule << SecondDiagInfo.second << DR.SecondDiffType; +  };    // Issue any pending ODR-failure diagnostics.    for (auto &Merge : OdrMergeFailures) { @@ -10015,6 +10060,19 @@ void ASTReader::diagnoseOdrViolations() {          continue;        std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); +      auto ODRDiagDeclError = [FirstRecord, &FirstModule, +                               this](SourceLocation Loc, SourceRange Range, +                                     ODRCXXRecordDifference DiffType) { +        return Diag(Loc, diag::err_module_odr_violation_record) +               << FirstRecord << FirstModule.empty() << FirstModule << Range +               << DiffType; +      }; +      auto ODRDiagDeclNote = [&SecondModule, +                              this](SourceLocation Loc, SourceRange Range, +                                    ODRCXXRecordDifference DiffType) { +        return Diag(Loc, diag::note_module_odr_violation_record) +               << SecondModule << Range << DiffType; +      };        auto *FirstDD = FirstRecord->DefinitionData;        auto *SecondDD = RecordPair.second; @@ -10134,13 +10192,6 @@ void ASTReader::diagnoseOdrViolations() {        assert(!FirstTemplate == !SecondTemplate &&               "Both pointers should be null or non-null"); -      enum ODRTemplateDifference { -        ParamEmptyName, -        ParamName, -        ParamSingleDefaultArgument, -        ParamDifferentDefaultArgument, -      }; -        if (FirstTemplate && SecondTemplate) {          DeclHashes FirstTemplateHashes;          DeclHashes SecondTemplateHashes; @@ -10166,155 +10217,60 @@ void ASTReader::diagnoseOdrViolations() {            if (FirstIt->second == SecondIt->second)              continue; -          auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( -                                          SourceLocation Loc, SourceRange Range, -                                          ODRTemplateDifference DiffType) { -            return Diag(Loc, diag::err_module_odr_violation_template_parameter) -                   << FirstRecord << FirstModule.empty() << FirstModule << Range -                   << DiffType; -          }; -          auto ODRDiagTemplateNote = [&SecondModule, this]( -                                         SourceLocation Loc, SourceRange Range, -                                         ODRTemplateDifference DiffType) { -            return Diag(Loc, diag::note_module_odr_violation_template_parameter) -                   << SecondModule << Range << DiffType; -          }; -            const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first);            const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first);            assert(FirstDecl->getKind() == SecondDecl->getKind() &&                   "Parameter Decl's should be the same kind."); +          enum ODRTemplateDifference { +            ParamEmptyName, +            ParamName, +            ParamSingleDefaultArgument, +            ParamDifferentDefaultArgument, +          }; + +          auto hasDefaultArg = [](const NamedDecl *D) { +            if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(D)) +              return TTP->hasDefaultArgument() && +                      !TTP->defaultArgumentWasInherited(); +            if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) +              return NTTP->hasDefaultArgument() && +                      !NTTP->defaultArgumentWasInherited(); +            auto *TTP = cast<TemplateTemplateParmDecl>(D); +            return TTP->hasDefaultArgument() && +                    !TTP->defaultArgumentWasInherited(); +          }; +          bool hasFirstArg = hasDefaultArg(FirstDecl); +          bool hasSecondArg = hasDefaultArg(SecondDecl); + +          ODRTemplateDifference ErrDiffType; +          ODRTemplateDifference NoteDiffType; +            DeclarationName FirstName = FirstDecl->getDeclName();            DeclarationName SecondName = SecondDecl->getDeclName();            if (FirstName != SecondName) { -            const bool FirstNameEmpty = +            bool FirstNameEmpty =                  FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); -            const bool SecondNameEmpty = -                SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); -            assert((!FirstNameEmpty || !SecondNameEmpty) && -                   "Both template parameters cannot be unnamed."); -            ODRDiagTemplateError(FirstDecl->getLocation(), -                                 FirstDecl->getSourceRange(), -                                 FirstNameEmpty ? ParamEmptyName : ParamName) -                << FirstName; -            ODRDiagTemplateNote(SecondDecl->getLocation(), -                                SecondDecl->getSourceRange(), -                                SecondNameEmpty ? ParamEmptyName : ParamName) -                << SecondName; -            break; -          } - -          switch (FirstDecl->getKind()) { -          default: -            llvm_unreachable("Invalid template parameter type."); -          case Decl::TemplateTypeParm: { -            const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); -            const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); -            const bool HasFirstDefaultArgument = -                FirstParam->hasDefaultArgument() && -                !FirstParam->defaultArgumentWasInherited(); -            const bool HasSecondDefaultArgument = -                SecondParam->hasDefaultArgument() && -                !SecondParam->defaultArgumentWasInherited(); - -            if (HasFirstDefaultArgument != HasSecondDefaultArgument) { -              ODRDiagTemplateError(FirstDecl->getLocation(), -                                   FirstDecl->getSourceRange(), -                                   ParamSingleDefaultArgument) -                  << HasFirstDefaultArgument; -              ODRDiagTemplateNote(SecondDecl->getLocation(), -                                  SecondDecl->getSourceRange(), -                                  ParamSingleDefaultArgument) -                  << HasSecondDefaultArgument; -              break; -            } - -            assert(HasFirstDefaultArgument && HasSecondDefaultArgument && -                   "Expecting default arguments."); - -            ODRDiagTemplateError(FirstDecl->getLocation(), -                                 FirstDecl->getSourceRange(), -                                 ParamDifferentDefaultArgument); -            ODRDiagTemplateNote(SecondDecl->getLocation(), -                                SecondDecl->getSourceRange(), -                                ParamDifferentDefaultArgument); - -            break; -          } -          case Decl::NonTypeTemplateParm: { -            const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); -            const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); -            const bool HasFirstDefaultArgument = -                FirstParam->hasDefaultArgument() && -                !FirstParam->defaultArgumentWasInherited(); -            const bool HasSecondDefaultArgument = -                SecondParam->hasDefaultArgument() && -                !SecondParam->defaultArgumentWasInherited(); - -            if (HasFirstDefaultArgument != HasSecondDefaultArgument) { -              ODRDiagTemplateError(FirstDecl->getLocation(), -                                   FirstDecl->getSourceRange(), -                                   ParamSingleDefaultArgument) -                  << HasFirstDefaultArgument; -              ODRDiagTemplateNote(SecondDecl->getLocation(), -                                  SecondDecl->getSourceRange(), -                                  ParamSingleDefaultArgument) -                  << HasSecondDefaultArgument; -              break; -            } - -            assert(HasFirstDefaultArgument && HasSecondDefaultArgument && -                   "Expecting default arguments."); - -            ODRDiagTemplateError(FirstDecl->getLocation(), -                                 FirstDecl->getSourceRange(), -                                 ParamDifferentDefaultArgument); -            ODRDiagTemplateNote(SecondDecl->getLocation(), -                                SecondDecl->getSourceRange(), -                                ParamDifferentDefaultArgument); - -            break; -          } -          case Decl::TemplateTemplateParm: { -            const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); -            const auto *SecondParam = -                cast<TemplateTemplateParmDecl>(SecondDecl); -            const bool HasFirstDefaultArgument = -                FirstParam->hasDefaultArgument() && -                !FirstParam->defaultArgumentWasInherited(); -            const bool HasSecondDefaultArgument = -                SecondParam->hasDefaultArgument() && -                !SecondParam->defaultArgumentWasInherited(); - -            if (HasFirstDefaultArgument != HasSecondDefaultArgument) { -              ODRDiagTemplateError(FirstDecl->getLocation(), -                                   FirstDecl->getSourceRange(), -                                   ParamSingleDefaultArgument) -                  << HasFirstDefaultArgument; -              ODRDiagTemplateNote(SecondDecl->getLocation(), -                                  SecondDecl->getSourceRange(), -                                  ParamSingleDefaultArgument) -                  << HasSecondDefaultArgument; -              break; -            } - -            assert(HasFirstDefaultArgument && HasSecondDefaultArgument && -                   "Expecting default arguments."); - -            ODRDiagTemplateError(FirstDecl->getLocation(), -                                 FirstDecl->getSourceRange(), -                                 ParamDifferentDefaultArgument); -            ODRDiagTemplateNote(SecondDecl->getLocation(), -                                SecondDecl->getSourceRange(), -                                ParamDifferentDefaultArgument); - -            break; -          } -          } - +            bool SecondNameEmpty = SecondName.isIdentifier() && +                                    !SecondName.getAsIdentifierInfo(); +            ErrDiffType = FirstNameEmpty ? ParamEmptyName : ParamName; +            NoteDiffType = SecondNameEmpty ? ParamEmptyName : ParamName; +          } else if (hasFirstArg == hasSecondArg) +            ErrDiffType = NoteDiffType = ParamDifferentDefaultArgument; +          else +            ErrDiffType = NoteDiffType = ParamSingleDefaultArgument; + +          Diag(FirstDecl->getLocation(), +                diag::err_module_odr_violation_template_parameter) +              << FirstRecord << FirstModule.empty() << FirstModule +              << FirstDecl->getSourceRange() << ErrDiffType << hasFirstArg +              << FirstName; +          Diag(SecondDecl->getLocation(), +                diag::note_module_odr_violation_template_parameter) +              << SecondModule << SecondDecl->getSourceRange() << NoteDiffType +              << hasSecondArg << SecondName;            break;          } @@ -10369,9 +10325,9 @@ void ASTReader::diagnoseOdrViolations() {          unsigned FirstODRHash = ComputeODRHash(FirstExpr);          unsigned SecondODRHash = ComputeODRHash(SecondExpr);          if (FirstODRHash != SecondODRHash) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), +          ODRDiagDeclError(FirstExpr->getBeginLoc(),                             FirstExpr->getSourceRange(), StaticAssertCondition); -          ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), +          ODRDiagDeclNote(SecondExpr->getBeginLoc(),                            SecondExpr->getSourceRange(), StaticAssertCondition);            Diagnosed = true;            break; @@ -10397,11 +10353,9 @@ void ASTReader::diagnoseOdrViolations() {              SecondLoc = SecondSA->getBeginLoc();              SecondRange = SecondSA->getSourceRange();            } -          ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, -                           StaticAssertOnlyMessage) +          ODRDiagDeclError(FirstLoc, FirstRange, StaticAssertOnlyMessage)                << (FirstStr == nullptr); -          ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, -                          StaticAssertOnlyMessage) +          ODRDiagDeclNote(SecondLoc, SecondRange, StaticAssertOnlyMessage)                << (SecondStr == nullptr);            Diagnosed = true;            break; @@ -10409,10 +10363,10 @@ void ASTReader::diagnoseOdrViolations() {          if (FirstStr && SecondStr &&              FirstStr->getString() != SecondStr->getString()) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), -                           FirstStr->getSourceRange(), StaticAssertMessage); -          ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), -                          SecondStr->getSourceRange(), StaticAssertMessage); +          ODRDiagDeclError(FirstStr->getBeginLoc(), FirstStr->getSourceRange(), +                           StaticAssertMessage); +          ODRDiagDeclNote(SecondStr->getBeginLoc(), SecondStr->getSourceRange(), +                          StaticAssertMessage);            Diagnosed = true;            break;          } @@ -10440,16 +10394,24 @@ void ASTReader::diagnoseOdrViolations() {          const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl);          FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod);          SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); -        auto FirstName = FirstMethod->getDeclName(); -        auto SecondName = SecondMethod->getDeclName(); -        if (FirstMethodType != SecondMethodType || FirstName != SecondName) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodName) -              << FirstMethodType << FirstName; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodName) -              << SecondMethodType << SecondName; +        DeclarationName FirstName = FirstMethod->getDeclName(); +        DeclarationName SecondName = SecondMethod->getDeclName(); +        auto DiagMethodError = [&ODRDiagDeclError, FirstMethod, FirstMethodType, +                                FirstName](ODRCXXRecordDifference DiffType) { +          return ODRDiagDeclError(FirstMethod->getLocation(), +                                  FirstMethod->getSourceRange(), DiffType) +                 << FirstMethodType << FirstName; +        }; +        auto DiagMethodNote = [&ODRDiagDeclNote, SecondMethod, SecondMethodType, +                               SecondName](ODRCXXRecordDifference DiffType) { +          return ODRDiagDeclNote(SecondMethod->getLocation(), +                                 SecondMethod->getSourceRange(), DiffType) +                 << SecondMethodType << SecondName; +        }; +        if (FirstMethodType != SecondMethodType || FirstName != SecondName) { +          DiagMethodError(MethodName); +          DiagMethodNote(MethodName);            Diagnosed = true;            break;          } @@ -10457,13 +10419,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool FirstDeleted = FirstMethod->isDeletedAsWritten();          const bool SecondDeleted = SecondMethod->isDeletedAsWritten();          if (FirstDeleted != SecondDeleted) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodDeleted) -              << FirstMethodType << FirstName << FirstDeleted; - -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodDeleted) -              << SecondMethodType << SecondName << SecondDeleted; +          DiagMethodError(MethodDeleted) << FirstDeleted; +          DiagMethodNote(MethodDeleted) << SecondDeleted;            Diagnosed = true;            break;          } @@ -10471,13 +10428,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted();          const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted();          if (FirstDefaulted != SecondDefaulted) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodDefaulted) -              << FirstMethodType << FirstName << FirstDefaulted; - -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodDefaulted) -              << SecondMethodType << SecondName << SecondDefaulted; +          DiagMethodError(MethodDefaulted) << FirstDefaulted; +          DiagMethodNote(MethodDefaulted) << SecondDefaulted;            Diagnosed = true;            break;          } @@ -10488,12 +10440,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool SecondPure = SecondMethod->isPure();          if ((FirstVirtual || SecondVirtual) &&              (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodVirtual) -              << FirstMethodType << FirstName << FirstPure << FirstVirtual; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodVirtual) -              << SecondMethodType << SecondName << SecondPure << SecondVirtual; +          DiagMethodError(MethodVirtual) << FirstPure << FirstVirtual; +          DiagMethodNote(MethodVirtual) << SecondPure << SecondVirtual;            Diagnosed = true;            break;          } @@ -10506,12 +10454,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool FirstStatic = FirstStorage == SC_Static;          const bool SecondStatic = SecondStorage == SC_Static;          if (FirstStatic != SecondStatic) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodStatic) -              << FirstMethodType << FirstName << FirstStatic; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodStatic) -              << SecondMethodType << SecondName << SecondStatic; +          DiagMethodError(MethodStatic) << FirstStatic; +          DiagMethodNote(MethodStatic) << SecondStatic;            Diagnosed = true;            break;          } @@ -10519,12 +10463,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool FirstVolatile = FirstMethod->isVolatile();          const bool SecondVolatile = SecondMethod->isVolatile();          if (FirstVolatile != SecondVolatile) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodVolatile) -              << FirstMethodType << FirstName << FirstVolatile; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodVolatile) -              << SecondMethodType << SecondName << SecondVolatile; +          DiagMethodError(MethodVolatile) << FirstVolatile; +          DiagMethodNote(MethodVolatile) << SecondVolatile;            Diagnosed = true;            break;          } @@ -10532,12 +10472,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool FirstConst = FirstMethod->isConst();          const bool SecondConst = SecondMethod->isConst();          if (FirstConst != SecondConst) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodConst) -              << FirstMethodType << FirstName << FirstConst; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodConst) -              << SecondMethodType << SecondName << SecondConst; +          DiagMethodError(MethodConst) << FirstConst; +          DiagMethodNote(MethodConst) << SecondConst;            Diagnosed = true;            break;          } @@ -10545,12 +10481,8 @@ void ASTReader::diagnoseOdrViolations() {          const bool FirstInline = FirstMethod->isInlineSpecified();          const bool SecondInline = SecondMethod->isInlineSpecified();          if (FirstInline != SecondInline) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodInline) -              << FirstMethodType << FirstName << FirstInline; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodInline) -              << SecondMethodType << SecondName << SecondInline; +          DiagMethodError(MethodInline) << FirstInline; +          DiagMethodNote(MethodInline) << SecondInline;            Diagnosed = true;            break;          } @@ -10558,14 +10490,8 @@ void ASTReader::diagnoseOdrViolations() {          const unsigned FirstNumParameters = FirstMethod->param_size();          const unsigned SecondNumParameters = SecondMethod->param_size();          if (FirstNumParameters != SecondNumParameters) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), -                           MethodNumberParameters) -              << FirstMethodType << FirstName << FirstNumParameters; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), -                          MethodNumberParameters) -              << SecondMethodType << SecondName << SecondNumParameters; +          DiagMethodError(MethodNumberParameters) << FirstNumParameters; +          DiagMethodNote(MethodNumberParameters) << SecondNumParameters;            Diagnosed = true;            break;          } @@ -10583,33 +10509,22 @@ void ASTReader::diagnoseOdrViolations() {                    ComputeQualTypeODRHash(SecondParamType)) {              if (const DecayedType *ParamDecayedType =                      FirstParamType->getAs<DecayedType>()) { -              ODRDiagDeclError( -                  FirstRecord, FirstModule, FirstMethod->getLocation(), -                  FirstMethod->getSourceRange(), MethodParameterType) -                  << FirstMethodType << FirstName << (I + 1) << FirstParamType -                  << true << ParamDecayedType->getOriginalType(); +              DiagMethodError(MethodParameterType) +                  << (I + 1) << FirstParamType << true +                  << ParamDecayedType->getOriginalType();              } else { -              ODRDiagDeclError( -                  FirstRecord, FirstModule, FirstMethod->getLocation(), -                  FirstMethod->getSourceRange(), MethodParameterType) -                  << FirstMethodType << FirstName << (I + 1) << FirstParamType -                  << false; +              DiagMethodError(MethodParameterType) +                  << (I + 1) << FirstParamType << false;              }              if (const DecayedType *ParamDecayedType =                      SecondParamType->getAs<DecayedType>()) { -              ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                              SecondMethod->getSourceRange(), -                              MethodParameterType) -                  << SecondMethodType << SecondName << (I + 1) -                  << SecondParamType << true +              DiagMethodNote(MethodParameterType) +                  << (I + 1) << SecondParamType << true                    << ParamDecayedType->getOriginalType();              } else { -              ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                              SecondMethod->getSourceRange(), -                              MethodParameterType) -                  << SecondMethodType << SecondName << (I + 1) -                  << SecondParamType << false; +              DiagMethodNote(MethodParameterType) +                  << (I + 1) << SecondParamType << false;              }              ParameterMismatch = true;              break; @@ -10618,13 +10533,8 @@ void ASTReader::diagnoseOdrViolations() {            DeclarationName FirstParamName = FirstParam->getDeclName();            DeclarationName SecondParamName = SecondParam->getDeclName();            if (FirstParamName != SecondParamName) { -            ODRDiagDeclError(FirstRecord, FirstModule, -                             FirstMethod->getLocation(), -                             FirstMethod->getSourceRange(), MethodParameterName) -                << FirstMethodType << FirstName << (I + 1) << FirstParamName; -            ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                            SecondMethod->getSourceRange(), MethodParameterName) -                << SecondMethodType << SecondName << (I + 1) << SecondParamName; +            DiagMethodError(MethodParameterName) << (I + 1) << FirstParamName; +            DiagMethodNote(MethodParameterName) << (I + 1) << SecondParamName;              ParameterMismatch = true;              break;            } @@ -10632,18 +10542,11 @@ void ASTReader::diagnoseOdrViolations() {            const Expr *FirstInit = FirstParam->getInit();            const Expr *SecondInit = SecondParam->getInit();            if ((FirstInit == nullptr) != (SecondInit == nullptr)) { -            ODRDiagDeclError(FirstRecord, FirstModule, -                             FirstMethod->getLocation(), -                             FirstMethod->getSourceRange(), -                             MethodParameterSingleDefaultArgument) -                << FirstMethodType << FirstName << (I + 1) -                << (FirstInit == nullptr) +            DiagMethodError(MethodParameterSingleDefaultArgument) +                << (I + 1) << (FirstInit == nullptr)                  << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); -            ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                            SecondMethod->getSourceRange(), -                            MethodParameterSingleDefaultArgument) -                << SecondMethodType << SecondName << (I + 1) -                << (SecondInit == nullptr) +            DiagMethodNote(MethodParameterSingleDefaultArgument) +                << (I + 1) << (SecondInit == nullptr)                  << (SecondInit ? SecondInit->getSourceRange() : SourceRange());              ParameterMismatch = true;              break; @@ -10651,17 +10554,10 @@ void ASTReader::diagnoseOdrViolations() {            if (FirstInit && SecondInit &&                ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { -            ODRDiagDeclError(FirstRecord, FirstModule, -                             FirstMethod->getLocation(), -                             FirstMethod->getSourceRange(), -                             MethodParameterDifferentDefaultArgument) -                << FirstMethodType << FirstName << (I + 1) -                << FirstInit->getSourceRange(); -            ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                            SecondMethod->getSourceRange(), -                            MethodParameterDifferentDefaultArgument) -                << SecondMethodType << SecondName << (I + 1) -                << SecondInit->getSourceRange(); +            DiagMethodError(MethodParameterDifferentDefaultArgument) +                << (I + 1) << FirstInit->getSourceRange(); +            DiagMethodNote(MethodParameterDifferentDefaultArgument) +                << (I + 1) << SecondInit->getSourceRange();              ParameterMismatch = true;              break; @@ -10680,16 +10576,10 @@ void ASTReader::diagnoseOdrViolations() {          if ((FirstTemplateArgs && !SecondTemplateArgs) ||              (!FirstTemplateArgs && SecondTemplateArgs)) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), -                           MethodNoTemplateArguments) -              << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), -                          MethodNoTemplateArguments) -              << SecondMethodType << SecondName +          DiagMethodError(MethodNoTemplateArguments) +              << (FirstTemplateArgs != nullptr); +          DiagMethodNote(MethodNoTemplateArguments)                << (SecondTemplateArgs != nullptr); -            Diagnosed = true;            break;          } @@ -10704,9 +10594,8 @@ void ASTReader::diagnoseOdrViolations() {                      ExpandedList.push_back(&TA);                      continue;                    } -                  for (const TemplateArgument &PackTA : TA.getPackAsArray()) { -                    ExpandedList.push_back(&PackTA); -                  } +                  llvm::append_range(ExpandedList, llvm::make_pointer_range( +                                                       TA.getPackAsArray()));                  }                  return ExpandedList;                }; @@ -10716,18 +10605,10 @@ void ASTReader::diagnoseOdrViolations() {                ExpandTemplateArgumentList(SecondTemplateArgs);            if (FirstExpandedList.size() != SecondExpandedList.size()) { -            ODRDiagDeclError(FirstRecord, FirstModule, -                             FirstMethod->getLocation(), -                             FirstMethod->getSourceRange(), -                             MethodDifferentNumberTemplateArguments) -                << FirstMethodType << FirstName +            DiagMethodError(MethodDifferentNumberTemplateArguments)                  << (unsigned)FirstExpandedList.size(); -            ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                            SecondMethod->getSourceRange(), -                            MethodDifferentNumberTemplateArguments) -                << SecondMethodType << SecondName +            DiagMethodNote(MethodDifferentNumberTemplateArguments)                  << (unsigned)SecondExpandedList.size(); -              Diagnosed = true;              break;            } @@ -10741,15 +10622,10 @@ void ASTReader::diagnoseOdrViolations() {                continue;              } -            ODRDiagDeclError( -                FirstRecord, FirstModule, FirstMethod->getLocation(), -                FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) -                << FirstMethodType << FirstName << FirstTA << i + 1; -            ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                            SecondMethod->getSourceRange(), -                            MethodDifferentTemplateArgument) -                << SecondMethodType << SecondName << SecondTA << i + 1; - +            DiagMethodError(MethodDifferentTemplateArgument) +                << FirstTA << i + 1; +            DiagMethodNote(MethodDifferentTemplateArgument) +                << SecondTA << i + 1;              TemplateArgumentMismatch = true;              break;            } @@ -10769,30 +10645,22 @@ void ASTReader::diagnoseOdrViolations() {          // Compare the hash generated to the hash stored.  A difference means          // that a body was present in the original source.  Due to merging, -        // the stardard way of detecting a body will not work. +        // the standard way of detecting a body will not work.          const bool HasFirstBody =              ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash();          const bool HasSecondBody =              ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash();          if (HasFirstBody != HasSecondBody) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodSingleBody) -              << FirstMethodType << FirstName << HasFirstBody; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodSingleBody) -              << SecondMethodType << SecondName << HasSecondBody; +          DiagMethodError(MethodSingleBody) << HasFirstBody; +          DiagMethodNote(MethodSingleBody) << HasSecondBody;            Diagnosed = true;            break;          }          if (HasFirstBody && HasSecondBody) { -          ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), -                           FirstMethod->getSourceRange(), MethodDifferentBody) -              << FirstMethodType << FirstName; -          ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), -                          SecondMethod->getSourceRange(), MethodDifferentBody) -              << SecondMethodType << SecondName; +          DiagMethodError(MethodDifferentBody); +          DiagMethodNote(MethodDifferentBody);            Diagnosed = true;            break;          } @@ -10824,14 +10692,12 @@ void ASTReader::diagnoseOdrViolations() {          TypeSourceInfo *SecondTSI = SecondFriend->getFriendType();          if (FirstND && SecondND) { -          ODRDiagDeclError(FirstRecord, FirstModule, -                           FirstFriend->getFriendLoc(), +          ODRDiagDeclError(FirstFriend->getFriendLoc(),                             FirstFriend->getSourceRange(), FriendFunction)                << FirstND; -          ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), +          ODRDiagDeclNote(SecondFriend->getFriendLoc(),                            SecondFriend->getSourceRange(), FriendFunction)                << SecondND; -            Diagnosed = true;            break;          } @@ -10841,24 +10707,22 @@ void ASTReader::diagnoseOdrViolations() {            QualType SecondFriendType = SecondTSI->getType();            assert(ComputeQualTypeODRHash(FirstFriendType) !=                   ComputeQualTypeODRHash(SecondFriendType)); -          ODRDiagDeclError(FirstRecord, FirstModule, -                           FirstFriend->getFriendLoc(), +          ODRDiagDeclError(FirstFriend->getFriendLoc(),                             FirstFriend->getSourceRange(), FriendType)                << FirstFriendType; -          ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), +          ODRDiagDeclNote(SecondFriend->getFriendLoc(),                            SecondFriend->getSourceRange(), FriendType)                << SecondFriendType;            Diagnosed = true;            break;          } -        ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), +        ODRDiagDeclError(FirstFriend->getFriendLoc(),                           FirstFriend->getSourceRange(), FriendTypeFunction)              << (FirstTSI == nullptr); -        ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), +        ODRDiagDeclNote(SecondFriend->getFriendLoc(),                          SecondFriend->getSourceRange(), FriendTypeFunction)              << (SecondTSI == nullptr); -          Diagnosed = true;          break;        } @@ -10873,17 +10737,24 @@ void ASTReader::diagnoseOdrViolations() {          TemplateParameterList *SecondTPL =              SecondTemplate->getTemplateParameters(); -        if (FirstTPL->size() != SecondTPL->size()) { -          ODRDiagDeclError(FirstRecord, FirstModule, -                           FirstTemplate->getLocation(), -                           FirstTemplate->getSourceRange(), -                           FunctionTemplateDifferentNumberParameters) -              << FirstTemplate << FirstTPL->size(); -          ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                          SecondTemplate->getSourceRange(), -                          FunctionTemplateDifferentNumberParameters) -              << SecondTemplate << SecondTPL->size(); +        auto DiagTemplateError = [&ODRDiagDeclError, FirstTemplate]( +                                     ODRCXXRecordDifference DiffType) { +          return ODRDiagDeclError(FirstTemplate->getLocation(), +                                  FirstTemplate->getSourceRange(), DiffType) +                 << FirstTemplate; +        }; +        auto DiagTemplateNote = [&ODRDiagDeclNote, SecondTemplate]( +                                    ODRCXXRecordDifference DiffType) { +          return ODRDiagDeclNote(SecondTemplate->getLocation(), +                                 SecondTemplate->getSourceRange(), DiffType) +                 << SecondTemplate; +        }; +        if (FirstTPL->size() != SecondTPL->size()) { +          DiagTemplateError(FunctionTemplateDifferentNumberParameters) +              << FirstTPL->size(); +          DiagTemplateNote(FunctionTemplateDifferentNumberParameters) +              << SecondTPL->size();            Diagnosed = true;            break;          } @@ -10912,31 +10783,19 @@ void ASTReader::diagnoseOdrViolations() {                }              }; -            ODRDiagDeclError(FirstRecord, FirstModule, -                             FirstTemplate->getLocation(), -                             FirstTemplate->getSourceRange(), -                             FunctionTemplateParameterDifferentKind) -                << FirstTemplate << (i + 1) << GetParamType(FirstParam); -            ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                            SecondTemplate->getSourceRange(), -                            FunctionTemplateParameterDifferentKind) -                << SecondTemplate << (i + 1) << GetParamType(SecondParam); - +            DiagTemplateError(FunctionTemplateParameterDifferentKind) +                << (i + 1) << GetParamType(FirstParam); +            DiagTemplateNote(FunctionTemplateParameterDifferentKind) +                << (i + 1) << GetParamType(SecondParam);              ParameterMismatch = true;              break;            }            if (FirstParam->getName() != SecondParam->getName()) { -            ODRDiagDeclError( -                FirstRecord, FirstModule, FirstTemplate->getLocation(), -                FirstTemplate->getSourceRange(), FunctionTemplateParameterName) -                << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() -                << FirstParam; -            ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                            SecondTemplate->getSourceRange(), -                            FunctionTemplateParameterName) -                << SecondTemplate << (i + 1) -                << (bool)SecondParam->getIdentifier() << SecondParam; +            DiagTemplateError(FunctionTemplateParameterName) +                << (i + 1) << (bool)FirstParam->getIdentifier() << FirstParam; +            DiagTemplateNote(FunctionTemplateParameterName) +                << (i + 1) << (bool)SecondParam->getIdentifier() << SecondParam;              ParameterMismatch = true;              break;            } @@ -10954,15 +10813,10 @@ void ASTReader::diagnoseOdrViolations() {                  SecondTTPD->hasDefaultArgument() &&                  !SecondTTPD->defaultArgumentWasInherited();              if (HasFirstDefaultArgument != HasSecondDefaultArgument) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplateParameterSingleDefaultArgument) -                  << FirstTemplate << (i + 1) << HasFirstDefaultArgument; -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplateParameterSingleDefaultArgument) -                  << SecondTemplate << (i + 1) << HasSecondDefaultArgument; +              DiagTemplateError(FunctionTemplateParameterSingleDefaultArgument) +                  << (i + 1) << HasFirstDefaultArgument; +              DiagTemplateNote(FunctionTemplateParameterSingleDefaultArgument) +                  << (i + 1) << HasSecondDefaultArgument;                ParameterMismatch = true;                break;              } @@ -10972,16 +10826,12 @@ void ASTReader::diagnoseOdrViolations() {                QualType SecondType = SecondTTPD->getDefaultArgument();                if (ComputeQualTypeODRHash(FirstType) !=                    ComputeQualTypeODRHash(SecondType)) { -                ODRDiagDeclError( -                    FirstRecord, FirstModule, FirstTemplate->getLocation(), -                    FirstTemplate->getSourceRange(), +                DiagTemplateError(                      FunctionTemplateParameterDifferentDefaultArgument) -                    << FirstTemplate << (i + 1) << FirstType; -                ODRDiagDeclNote( -                    SecondModule, SecondTemplate->getLocation(), -                    SecondTemplate->getSourceRange(), +                    << (i + 1) << FirstType; +                DiagTemplateNote(                      FunctionTemplateParameterDifferentDefaultArgument) -                    << SecondTemplate << (i + 1) << SecondType; +                    << (i + 1) << SecondType;                  ParameterMismatch = true;                  break;                } @@ -10989,15 +10839,10 @@ void ASTReader::diagnoseOdrViolations() {              if (FirstTTPD->isParameterPack() !=                  SecondTTPD->isParameterPack()) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplatePackParameter) -                  << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplatePackParameter) -                  << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); +              DiagTemplateError(FunctionTemplatePackParameter) +                  << (i + 1) << FirstTTPD->isParameterPack(); +              DiagTemplateNote(FunctionTemplatePackParameter) +                  << (i + 1) << SecondTTPD->isParameterPack();                ParameterMismatch = true;                break;              } @@ -11017,15 +10862,10 @@ void ASTReader::diagnoseOdrViolations() {              if (ComputeTemplateParameterListODRHash(FirstTPL) !=                  ComputeTemplateParameterListODRHash(SecondTPL)) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplateParameterDifferentType) -                  << FirstTemplate << (i + 1); -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplateParameterDifferentType) -                  << SecondTemplate << (i + 1); +              DiagTemplateError(FunctionTemplateParameterDifferentType) +                  << (i + 1); +              DiagTemplateNote(FunctionTemplateParameterDifferentType) +                  << (i + 1);                ParameterMismatch = true;                break;              } @@ -11037,15 +10877,10 @@ void ASTReader::diagnoseOdrViolations() {                  SecondTTPD->hasDefaultArgument() &&                  !SecondTTPD->defaultArgumentWasInherited();              if (HasFirstDefaultArgument != HasSecondDefaultArgument) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplateParameterSingleDefaultArgument) -                  << FirstTemplate << (i + 1) << HasFirstDefaultArgument; -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplateParameterSingleDefaultArgument) -                  << SecondTemplate << (i + 1) << HasSecondDefaultArgument; +              DiagTemplateError(FunctionTemplateParameterSingleDefaultArgument) +                  << (i + 1) << HasFirstDefaultArgument; +              DiagTemplateNote(FunctionTemplateParameterSingleDefaultArgument) +                  << (i + 1) << HasSecondDefaultArgument;                ParameterMismatch = true;                break;              } @@ -11057,16 +10892,12 @@ void ASTReader::diagnoseOdrViolations() {                    SecondTTPD->getDefaultArgument().getArgument();                if (ComputeTemplateArgumentODRHash(FirstTA) !=                    ComputeTemplateArgumentODRHash(SecondTA)) { -                ODRDiagDeclError( -                    FirstRecord, FirstModule, FirstTemplate->getLocation(), -                    FirstTemplate->getSourceRange(), +                DiagTemplateError(                      FunctionTemplateParameterDifferentDefaultArgument) -                    << FirstTemplate << (i + 1) << FirstTA; -                ODRDiagDeclNote( -                    SecondModule, SecondTemplate->getLocation(), -                    SecondTemplate->getSourceRange(), +                    << (i + 1) << FirstTA; +                DiagTemplateNote(                      FunctionTemplateParameterDifferentDefaultArgument) -                    << SecondTemplate << (i + 1) << SecondTA; +                    << (i + 1) << SecondTA;                  ParameterMismatch = true;                  break;                } @@ -11074,15 +10905,10 @@ void ASTReader::diagnoseOdrViolations() {              if (FirstTTPD->isParameterPack() !=                  SecondTTPD->isParameterPack()) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplatePackParameter) -                  << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplatePackParameter) -                  << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); +              DiagTemplateError(FunctionTemplatePackParameter) +                  << (i + 1) << FirstTTPD->isParameterPack(); +              DiagTemplateNote(FunctionTemplatePackParameter) +                  << (i + 1) << SecondTTPD->isParameterPack();                ParameterMismatch = true;                break;              } @@ -11099,15 +10925,10 @@ void ASTReader::diagnoseOdrViolations() {              QualType SecondType = SecondNTTPD->getType();              if (ComputeQualTypeODRHash(FirstType) !=                  ComputeQualTypeODRHash(SecondType)) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplateParameterDifferentType) -                  << FirstTemplate << (i + 1); -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplateParameterDifferentType) -                  << SecondTemplate << (i + 1); +              DiagTemplateError(FunctionTemplateParameterDifferentType) +                  << (i + 1); +              DiagTemplateNote(FunctionTemplateParameterDifferentType) +                  << (i + 1);                ParameterMismatch = true;                break;              } @@ -11119,15 +10940,10 @@ void ASTReader::diagnoseOdrViolations() {                  SecondNTTPD->hasDefaultArgument() &&                  !SecondNTTPD->defaultArgumentWasInherited();              if (HasFirstDefaultArgument != HasSecondDefaultArgument) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplateParameterSingleDefaultArgument) -                  << FirstTemplate << (i + 1) << HasFirstDefaultArgument; -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplateParameterSingleDefaultArgument) -                  << SecondTemplate << (i + 1) << HasSecondDefaultArgument; +              DiagTemplateError(FunctionTemplateParameterSingleDefaultArgument) +                  << (i + 1) << HasFirstDefaultArgument; +              DiagTemplateNote(FunctionTemplateParameterSingleDefaultArgument) +                  << (i + 1) << HasSecondDefaultArgument;                ParameterMismatch = true;                break;              } @@ -11137,16 +10953,12 @@ void ASTReader::diagnoseOdrViolations() {                Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument();                if (ComputeODRHash(FirstDefaultArgument) !=                    ComputeODRHash(SecondDefaultArgument)) { -                ODRDiagDeclError( -                    FirstRecord, FirstModule, FirstTemplate->getLocation(), -                    FirstTemplate->getSourceRange(), +                DiagTemplateError(                      FunctionTemplateParameterDifferentDefaultArgument) -                    << FirstTemplate << (i + 1) << FirstDefaultArgument; -                ODRDiagDeclNote( -                    SecondModule, SecondTemplate->getLocation(), -                    SecondTemplate->getSourceRange(), +                    << (i + 1) << FirstDefaultArgument; +                DiagTemplateNote(                      FunctionTemplateParameterDifferentDefaultArgument) -                    << SecondTemplate << (i + 1) << SecondDefaultArgument; +                    << (i + 1) << SecondDefaultArgument;                  ParameterMismatch = true;                  break;                } @@ -11154,16 +10966,10 @@ void ASTReader::diagnoseOdrViolations() {              if (FirstNTTPD->isParameterPack() !=                  SecondNTTPD->isParameterPack()) { -              ODRDiagDeclError(FirstRecord, FirstModule, -                               FirstTemplate->getLocation(), -                               FirstTemplate->getSourceRange(), -                               FunctionTemplatePackParameter) -                  << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); -              ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), -                              SecondTemplate->getSourceRange(), -                              FunctionTemplatePackParameter) -                  << SecondTemplate << (i + 1) -                  << SecondNTTPD->isParameterPack(); +              DiagTemplateError(FunctionTemplatePackParameter) +                  << (i + 1) << FirstNTTPD->isParameterPack(); +              DiagTemplateNote(FunctionTemplatePackParameter) +                  << (i + 1) << SecondNTTPD->isParameterPack();                ParameterMismatch = true;                break;              } @@ -11369,8 +11175,8 @@ void ASTReader::diagnoseOdrViolations() {        DifferentSpecifiedTypes,        DifferentNumberEnumConstants,        EnumConstantName, -      EnumConstantSingleInitilizer, -      EnumConstantDifferentInitilizer, +      EnumConstantSingleInitializer, +      EnumConstantDifferentInitializer,      };      // If we've already pointed out a specific problem with this enum, don't @@ -11407,26 +11213,23 @@ void ASTReader::diagnoseOdrViolations() {            getOwningModuleNameForDiagnostic(SecondEnum);        auto ODRDiagError = [FirstEnum, &FirstModule, -                           this](SourceLocation Loc, SourceRange Range, +                           this](const auto *DiagAnchor,                                   ODREnumDifference DiffType) { -        return Diag(Loc, diag::err_module_odr_violation_enum) -               << FirstEnum << FirstModule.empty() << FirstModule << Range -               << DiffType; +        return Diag(DiagAnchor->getLocation(), +                    diag::err_module_odr_violation_enum) +               << FirstEnum << FirstModule.empty() << FirstModule +               << DiagAnchor->getSourceRange() << DiffType;        }; -      auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, -                                               SourceRange Range, +      auto ODRDiagNote = [&SecondModule, this](const auto *DiagAnchor,                                                 ODREnumDifference DiffType) { -        return Diag(Loc, diag::note_module_odr_violation_enum) -               << SecondModule << Range << DiffType; +        return Diag(DiagAnchor->getLocation(), +                    diag::note_module_odr_violation_enum) +               << SecondModule << DiagAnchor->getSourceRange() << DiffType;        };        if (FirstEnum->isScoped() != SecondEnum->isScoped()) { -        ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), -                     SingleScopedEnum) -            << FirstEnum->isScoped(); -        ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), -                    SingleScopedEnum) -            << SecondEnum->isScoped(); +        ODRDiagError(FirstEnum, SingleScopedEnum) << FirstEnum->isScoped(); +        ODRDiagNote(SecondEnum, SingleScopedEnum) << SecondEnum->isScoped();          Diagnosed = true;          continue;        } @@ -11434,11 +11237,9 @@ void ASTReader::diagnoseOdrViolations() {        if (FirstEnum->isScoped() && SecondEnum->isScoped()) {          if (FirstEnum->isScopedUsingClassTag() !=              SecondEnum->isScopedUsingClassTag()) { -          ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), -                       EnumTagKeywordMismatch) +          ODRDiagError(FirstEnum, EnumTagKeywordMismatch)                << FirstEnum->isScopedUsingClassTag(); -          ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), -                      EnumTagKeywordMismatch) +          ODRDiagNote(SecondEnum, EnumTagKeywordMismatch)                << SecondEnum->isScopedUsingClassTag();            Diagnosed = true;            continue; @@ -11454,24 +11255,20 @@ void ASTReader::diagnoseOdrViolations() {                ? SecondEnum->getIntegerTypeSourceInfo()->getType()                : QualType();        if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { -          ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), -                       SingleSpecifiedType) -              << !FirstUnderlyingType.isNull(); -          ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), -                      SingleSpecifiedType) -              << !SecondUnderlyingType.isNull(); -          Diagnosed = true; -          continue; +        ODRDiagError(FirstEnum, SingleSpecifiedType) +            << !FirstUnderlyingType.isNull(); +        ODRDiagNote(SecondEnum, SingleSpecifiedType) +            << !SecondUnderlyingType.isNull(); +        Diagnosed = true; +        continue;        }        if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) {          if (ComputeQualTypeODRHash(FirstUnderlyingType) !=              ComputeQualTypeODRHash(SecondUnderlyingType)) { -          ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), -                       DifferentSpecifiedTypes) +          ODRDiagError(FirstEnum, DifferentSpecifiedTypes)                << FirstUnderlyingType; -          ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), -                      DifferentSpecifiedTypes) +          ODRDiagNote(SecondEnum, DifferentSpecifiedTypes)                << SecondUnderlyingType;            Diagnosed = true;            continue; @@ -11482,11 +11279,9 @@ void ASTReader::diagnoseOdrViolations() {        PopulateHashes(SecondHashes, SecondEnum);        if (FirstHashes.size() != SecondHashes.size()) { -        ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), -                     DifferentNumberEnumConstants) +        ODRDiagError(FirstEnum, DifferentNumberEnumConstants)              << (int)FirstHashes.size(); -        ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), -                    DifferentNumberEnumConstants) +        ODRDiagNote(SecondEnum, DifferentNumberEnumConstants)              << (int)SecondHashes.size();          Diagnosed = true;          continue; @@ -11501,11 +11296,9 @@ void ASTReader::diagnoseOdrViolations() {          if (FirstEnumConstant->getDeclName() !=              SecondEnumConstant->getDeclName()) { -          ODRDiagError(FirstEnumConstant->getLocation(), -                       FirstEnumConstant->getSourceRange(), EnumConstantName) +          ODRDiagError(FirstEnumConstant, EnumConstantName)                << I + 1 << FirstEnumConstant; -          ODRDiagNote(SecondEnumConstant->getLocation(), -                      SecondEnumConstant->getSourceRange(), EnumConstantName) +          ODRDiagNote(SecondEnumConstant, EnumConstantName)                << I + 1 << SecondEnumConstant;            Diagnosed = true;            break; @@ -11517,26 +11310,18 @@ void ASTReader::diagnoseOdrViolations() {            continue;          if (!FirstInit || !SecondInit) { -          ODRDiagError(FirstEnumConstant->getLocation(), -                       FirstEnumConstant->getSourceRange(), -                       EnumConstantSingleInitilizer) +          ODRDiagError(FirstEnumConstant, EnumConstantSingleInitializer)                << I + 1 << FirstEnumConstant << (FirstInit != nullptr); -          ODRDiagNote(SecondEnumConstant->getLocation(), -                      SecondEnumConstant->getSourceRange(), -                      EnumConstantSingleInitilizer) +          ODRDiagNote(SecondEnumConstant, EnumConstantSingleInitializer)                << I + 1 << SecondEnumConstant << (SecondInit != nullptr);            Diagnosed = true;            break;          }          if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { -          ODRDiagError(FirstEnumConstant->getLocation(), -                       FirstEnumConstant->getSourceRange(), -                       EnumConstantDifferentInitilizer) +          ODRDiagError(FirstEnumConstant, EnumConstantDifferentInitializer)                << I + 1 << FirstEnumConstant; -          ODRDiagNote(SecondEnumConstant->getLocation(), -                      SecondEnumConstant->getSourceRange(), -                      EnumConstantDifferentInitilizer) +          ODRDiagNote(SecondEnumConstant, EnumConstantDifferentInitializer)                << I + 1 << SecondEnumConstant;            Diagnosed = true;            break; @@ -11954,6 +11739,15 @@ OMPClause *OMPClauseReader::readClause() {      C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes);      break;    } +  case llvm::omp::OMPC_has_device_addr: { +    OMPMappableExprListSizeTy Sizes; +    Sizes.NumVars = Record.readInt(); +    Sizes.NumUniqueDeclarations = Record.readInt(); +    Sizes.NumComponentLists = Record.readInt(); +    Sizes.NumComponents = Record.readInt(); +    C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes); +    break; +  }    case llvm::omp::OMPC_allocate:      C = OMPAllocateClause::CreateEmpty(Context, Record.readInt());      break; @@ -12523,6 +12317,7 @@ void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {        static_cast<OpenMPDependClauseKind>(Record.readInt()));    C->setDependencyLoc(Record.readSourceLocation());    C->setColonLoc(Record.readSourceLocation()); +  C->setOmpAllMemoryLoc(Record.readSourceLocation());    unsigned NumVars = C->varlist_size();    SmallVector<Expr *, 16> Vars;    Vars.reserve(NumVars); @@ -12914,6 +12709,49 @@ void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {    C->setComponents(Components, ListSizes);  } +void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) { +  C->setLParenLoc(Record.readSourceLocation()); +  auto NumVars = C->varlist_size(); +  auto UniqueDecls = C->getUniqueDeclarationsNum(); +  auto TotalLists = C->getTotalComponentListNum(); +  auto TotalComponents = C->getTotalComponentsNum(); + +  SmallVector<Expr *, 16> Vars; +  Vars.reserve(NumVars); +  for (unsigned I = 0; I != NumVars; ++I) +    Vars.push_back(Record.readSubExpr()); +  C->setVarRefs(Vars); +  Vars.clear(); + +  SmallVector<ValueDecl *, 16> Decls; +  Decls.reserve(UniqueDecls); +  for (unsigned I = 0; I < UniqueDecls; ++I) +    Decls.push_back(Record.readDeclAs<ValueDecl>()); +  C->setUniqueDecls(Decls); + +  SmallVector<unsigned, 16> ListsPerDecl; +  ListsPerDecl.reserve(UniqueDecls); +  for (unsigned I = 0; I < UniqueDecls; ++I) +    ListsPerDecl.push_back(Record.readInt()); +  C->setDeclNumLists(ListsPerDecl); + +  SmallVector<unsigned, 32> ListSizes; +  ListSizes.reserve(TotalLists); +  for (unsigned i = 0; i < TotalLists; ++i) +    ListSizes.push_back(Record.readInt()); +  C->setComponentListSizes(ListSizes); + +  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; +  Components.reserve(TotalComponents); +  for (unsigned I = 0; I < TotalComponents; ++I) { +    Expr *AssociatedExpr = Record.readSubExpr(); +    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); +    Components.emplace_back(AssociatedExpr, AssociatedDecl, +                            /*IsNonContiguous=*/false); +  } +  C->setComponents(Components, ListSizes); +} +  void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) {    C->setLParenLoc(Record.readSourceLocation());    unsigned NumVars = C->varlist_size();  | 
