/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Attribute serialization code                                               *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

  switch (A->getKind()) {
  case attr::AArch64VectorPcs: {
    const auto *SA = cast<AArch64VectorPcsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AMDGPUFlatWorkGroupSize: {
    const auto *SA = cast<AMDGPUFlatWorkGroupSizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getMin());
    Record.AddStmt(SA->getMax());
    break;
  }
  case attr::AMDGPUNumSGPR: {
    const auto *SA = cast<AMDGPUNumSGPRAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getNumSGPR());
    break;
  }
  case attr::AMDGPUNumVGPR: {
    const auto *SA = cast<AMDGPUNumVGPRAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getNumVGPR());
    break;
  }
  case attr::AMDGPUWavesPerEU: {
    const auto *SA = cast<AMDGPUWavesPerEUAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getMin());
    Record.AddStmt(SA->getMax());
    break;
  }
  case attr::ARMInterrupt: {
    const auto *SA = cast<ARMInterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getInterrupt());
    break;
  }
  case attr::AVRInterrupt: {
    const auto *SA = cast<AVRInterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AVRSignal: {
    const auto *SA = cast<AVRSignalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AbiTag: {
    const auto *SA = cast<AbiTagAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->tags_size());
    for (auto &Val : SA->tags())
      Record.AddString(Val);
    break;
  }
  case attr::AcquireCapability: {
    const auto *SA = cast<AcquireCapabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AcquireHandle: {
    const auto *SA = cast<AcquireHandleAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getHandleType());
    break;
  }
  case attr::AcquiredAfter: {
    const auto *SA = cast<AcquiredAfterAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AcquiredBefore: {
    const auto *SA = cast<AcquiredBeforeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AddressSpace: {
    const auto *SA = cast<AddressSpaceAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getAddressSpace());
    break;
  }
  case attr::Alias: {
    const auto *SA = cast<AliasAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getAliasee());
    break;
  }
  case attr::AlignMac68k: {
    const auto *SA = cast<AlignMac68kAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AlignNatural: {
    const auto *SA = cast<AlignNaturalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AlignValue: {
    const auto *SA = cast<AlignValueAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getAlignment());
    break;
  }
  case attr::Aligned: {
    const auto *SA = cast<AlignedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->isAlignmentExpr());
    if (SA->isAlignmentExpr())
      Record.AddStmt(SA->getAlignmentExpr());
    else
      Record.AddTypeSourceInfo(SA->getAlignmentType());
    break;
  }
  case attr::AllocAlign: {
    const auto *SA = cast<AllocAlignAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getParamIndex().serialize());
    break;
  }
  case attr::AllocSize: {
    const auto *SA = cast<AllocSizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getElemSizeParam().serialize());
    Record.push_back(SA->getNumElemsParam().serialize());
    break;
  }
  case attr::AlwaysDestroy: {
    const auto *SA = cast<AlwaysDestroyAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AlwaysInline: {
    const auto *SA = cast<AlwaysInlineAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AnalyzerNoReturn: {
    const auto *SA = cast<AnalyzerNoReturnAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Annotate: {
    const auto *SA = cast<AnnotateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getAnnotation());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AnyX86Interrupt: {
    const auto *SA = cast<AnyX86InterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AnyX86NoCallerSavedRegisters: {
    const auto *SA = cast<AnyX86NoCallerSavedRegistersAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AnyX86NoCfCheck: {
    const auto *SA = cast<AnyX86NoCfCheckAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ArcWeakrefUnavailable: {
    const auto *SA = cast<ArcWeakrefUnavailableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ArgumentWithTypeTag: {
    const auto *SA = cast<ArgumentWithTypeTagAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getArgumentKind());
    Record.push_back(SA->getArgumentIdx().serialize());
    Record.push_back(SA->getTypeTagIdx().serialize());
    Record.push_back(SA->getIsPointer());
    break;
  }
  case attr::ArmBuiltinAlias: {
    const auto *SA = cast<ArmBuiltinAliasAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getBuiltinName());
    break;
  }
  case attr::ArmMveStrictPolymorphism: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Artificial: {
    const auto *SA = cast<ArtificialAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::AsmLabel: {
    const auto *SA = cast<AsmLabelAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getLabel());
    Record.push_back(SA->getIsLiteralLabel());
    break;
  }
  case attr::AssertCapability: {
    const auto *SA = cast<AssertCapabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AssertExclusiveLock: {
    const auto *SA = cast<AssertExclusiveLockAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AssertSharedLock: {
    const auto *SA = cast<AssertSharedLockAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::AssumeAligned: {
    const auto *SA = cast<AssumeAlignedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getAlignment());
    Record.AddStmt(SA->getOffset());
    break;
  }
  case attr::Assumption: {
    const auto *SA = cast<AssumptionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getAssumption());
    break;
  }
  case attr::Availability: {
    const auto *SA = cast<AvailabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getPlatform());
    Record.AddVersionTuple(SA->getIntroduced());
    Record.AddVersionTuple(SA->getDeprecated());
    Record.AddVersionTuple(SA->getObsoleted());
    Record.push_back(SA->getUnavailable());
    Record.AddString(SA->getMessage());
    Record.push_back(SA->getStrict());
    Record.AddString(SA->getReplacement());
    Record.push_back(SA->getPriority());
    break;
  }
  case attr::BPFPreserveAccessIndex: {
    const auto *SA = cast<BPFPreserveAccessIndexAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::BTFDeclTag: {
    const auto *SA = cast<BTFDeclTagAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getBTFDeclTag());
    break;
  }
  case attr::BTFTypeTag: {
    const auto *SA = cast<BTFTypeTagAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getBTFTypeTag());
    break;
  }
  case attr::Blocks: {
    const auto *SA = cast<BlocksAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getType());
    break;
  }
  case attr::Builtin: {
    const auto *SA = cast<BuiltinAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getID());
    break;
  }
  case attr::BuiltinAlias: {
    const auto *SA = cast<BuiltinAliasAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getBuiltinName());
    break;
  }
  case attr::C11NoReturn: {
    const auto *SA = cast<C11NoReturnAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CDecl: {
    const auto *SA = cast<CDeclAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CFAuditedTransfer: {
    const auto *SA = cast<CFAuditedTransferAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CFConsumed: {
    const auto *SA = cast<CFConsumedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CFGuard: {
    const auto *SA = cast<CFGuardAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getGuard());
    break;
  }
  case attr::CFICanonicalJumpTable: {
    const auto *SA = cast<CFICanonicalJumpTableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CFReturnsNotRetained: {
    const auto *SA = cast<CFReturnsNotRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CFReturnsRetained: {
    const auto *SA = cast<CFReturnsRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CFUnknownTransfer: {
    const auto *SA = cast<CFUnknownTransferAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CPUDispatch: {
    const auto *SA = cast<CPUDispatchAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->cpus_size());
    for (auto &Val : SA->cpus())
      Record.AddIdentifierRef(Val);
    break;
  }
  case attr::CPUSpecific: {
    const auto *SA = cast<CPUSpecificAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->cpus_size());
    for (auto &Val : SA->cpus())
      Record.AddIdentifierRef(Val);
    break;
  }
  case attr::CUDAConstant: {
    const auto *SA = cast<CUDAConstantAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDADevice: {
    const auto *SA = cast<CUDADeviceAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDADeviceBuiltinSurfaceType: {
    const auto *SA = cast<CUDADeviceBuiltinSurfaceTypeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDADeviceBuiltinTextureType: {
    const auto *SA = cast<CUDADeviceBuiltinTextureTypeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDAGlobal: {
    const auto *SA = cast<CUDAGlobalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDAHost: {
    const auto *SA = cast<CUDAHostAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDAInvalidTarget: {
    const auto *SA = cast<CUDAInvalidTargetAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CUDALaunchBounds: {
    const auto *SA = cast<CUDALaunchBoundsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getMaxThreads());
    Record.AddStmt(SA->getMinBlocks());
    break;
  }
  case attr::CUDAShared: {
    const auto *SA = cast<CUDASharedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CXX11NoReturn: {
    const auto *SA = cast<CXX11NoReturnAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CallableWhen: {
    const auto *SA = cast<CallableWhenAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->callableStates_size());
    for (CallableWhenAttr::callableStates_iterator i = SA->callableStates_begin(), e = SA->callableStates_end(); i != e; ++i)
      Record.push_back((*i));
    break;
  }
  case attr::Callback: {
    const auto *SA = cast<CallbackAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->encoding_size());
    for (auto &Val : SA->encoding())
      Record.push_back(Val);
    break;
  }
  case attr::CalledOnce: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Capability: {
    const auto *SA = cast<CapabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::CapturedRecord: {
    const auto *SA = cast<CapturedRecordAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CarriesDependency: {
    const auto *SA = cast<CarriesDependencyAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Cleanup: {
    const auto *SA = cast<CleanupAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddDeclRef(SA->getFunctionDecl());
    break;
  }
  case attr::CmseNSCall: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CmseNSEntry: {
    const auto *SA = cast<CmseNSEntryAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::CodeSeg: {
    const auto *SA = cast<CodeSegAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::Cold: {
    const auto *SA = cast<ColdAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Common: {
    const auto *SA = cast<CommonAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Const: {
    const auto *SA = cast<ConstAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ConstInit: {
    const auto *SA = cast<ConstInitAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Constructor: {
    const auto *SA = cast<ConstructorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getPriority());
    break;
  }
  case attr::Consumable: {
    const auto *SA = cast<ConsumableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getDefaultState());
    break;
  }
  case attr::ConsumableAutoCast: {
    const auto *SA = cast<ConsumableAutoCastAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ConsumableSetOnRead: {
    const auto *SA = cast<ConsumableSetOnReadAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Convergent: {
    const auto *SA = cast<ConvergentAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::DLLExport: {
    const auto *SA = cast<DLLExportAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::DLLExportStaticLocal: {
    const auto *SA = cast<DLLExportStaticLocalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::DLLImport: {
    const auto *SA = cast<DLLImportAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::DLLImportStaticLocal: {
    const auto *SA = cast<DLLImportStaticLocalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Deprecated: {
    const auto *SA = cast<DeprecatedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getMessage());
    Record.AddString(SA->getReplacement());
    break;
  }
  case attr::Destructor: {
    const auto *SA = cast<DestructorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getPriority());
    break;
  }
  case attr::DiagnoseAsBuiltin: {
    const auto *SA = cast<DiagnoseAsBuiltinAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddDeclRef(SA->getFunction());
    Record.push_back(SA->argIndices_size());
    for (auto &Val : SA->argIndices())
      Record.push_back(Val);
    break;
  }
  case attr::DiagnoseIf: {
    const auto *SA = cast<DiagnoseIfAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getCond());
    Record.AddString(SA->getMessage());
Record.push_back(SA->getDiagnosticType());
    Record.push_back(SA->getArgDependent());
    Record.AddDeclRef(SA->getParent());
    break;
  }
  case attr::DisableSanitizerInstrumentation: {
    const auto *SA = cast<DisableSanitizerInstrumentationAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::DisableTailCalls: {
    const auto *SA = cast<DisableTailCallsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::EmptyBases: {
    const auto *SA = cast<EmptyBasesAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::EnableIf: {
    const auto *SA = cast<EnableIfAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getCond());
    Record.AddString(SA->getMessage());
    break;
  }
  case attr::EnforceTCB: {
    const auto *SA = cast<EnforceTCBAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getTCBName());
    break;
  }
  case attr::EnforceTCBLeaf: {
    const auto *SA = cast<EnforceTCBLeafAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getTCBName());
    break;
  }
  case attr::EnumExtensibility: {
    const auto *SA = cast<EnumExtensibilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getExtensibility());
    break;
  }
  case attr::Error: {
    const auto *SA = cast<ErrorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getUserDiagnostic());
    break;
  }
  case attr::ExcludeFromExplicitInstantiation: {
    const auto *SA = cast<ExcludeFromExplicitInstantiationAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ExclusiveTrylockFunction: {
    const auto *SA = cast<ExclusiveTrylockFunctionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getSuccessValue());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::ExternalSourceSymbol: {
    const auto *SA = cast<ExternalSourceSymbolAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getLanguage());
    Record.AddString(SA->getDefinedIn());
    Record.push_back(SA->getGeneratedDeclaration());
    break;
  }
  case attr::FallThrough: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::FastCall: {
    const auto *SA = cast<FastCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Final: {
    const auto *SA = cast<FinalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::FlagEnum: {
    const auto *SA = cast<FlagEnumAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Flatten: {
    const auto *SA = cast<FlattenAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Format: {
    const auto *SA = cast<FormatAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getType());
    Record.push_back(SA->getFormatIdx());
    Record.push_back(SA->getFirstArg());
    break;
  }
  case attr::FormatArg: {
    const auto *SA = cast<FormatArgAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getFormatIdx().serialize());
    break;
  }
  case attr::GNUInline: {
    const auto *SA = cast<GNUInlineAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::GuardedBy: {
    const auto *SA = cast<GuardedByAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getArg());
    break;
  }
  case attr::GuardedVar: {
    const auto *SA = cast<GuardedVarAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::HIPManaged: {
    const auto *SA = cast<HIPManagedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Hot: {
    const auto *SA = cast<HotAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::IBAction: {
    const auto *SA = cast<IBActionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::IBOutlet: {
    const auto *SA = cast<IBOutletAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::IBOutletCollection: {
    const auto *SA = cast<IBOutletCollectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddTypeSourceInfo(SA->getInterfaceLoc());
    break;
  }
  case attr::IFunc: {
    const auto *SA = cast<IFuncAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getResolver());
    break;
  }
  case attr::InitPriority: {
    const auto *SA = cast<InitPriorityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getPriority());
    break;
  }
  case attr::InitSeg: {
    const auto *SA = cast<InitSegAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getSection());
    break;
  }
  case attr::IntelOclBicc: {
    const auto *SA = cast<IntelOclBiccAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::InternalLinkage: {
    const auto *SA = cast<InternalLinkageAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::LTOVisibilityPublic: {
    const auto *SA = cast<LTOVisibilityPublicAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::LayoutVersion: {
    const auto *SA = cast<LayoutVersionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getVersion());
    break;
  }
  case attr::Leaf: {
    const auto *SA = cast<LeafAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::LifetimeBound: {
    const auto *SA = cast<LifetimeBoundAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Likely: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::LoaderUninitialized: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::LockReturned: {
    const auto *SA = cast<LockReturnedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getArg());
    break;
  }
  case attr::LocksExcluded: {
    const auto *SA = cast<LocksExcludedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::LoopHint: {
    const auto *SA = cast<LoopHintAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getOption());
Record.push_back(SA->getState());
    Record.AddStmt(SA->getValue());
    break;
  }
  case attr::M68kInterrupt: {
    const auto *SA = cast<M68kInterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getNumber());
    break;
  }
  case attr::MIGServerRoutine: {
    const auto *SA = cast<MIGServerRoutineAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MSABI: {
    const auto *SA = cast<MSABIAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MSAllocator: {
    const auto *SA = cast<MSAllocatorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MSInheritance: {
    const auto *SA = cast<MSInheritanceAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getBestCase());
    break;
  }
  case attr::MSNoVTable: {
    const auto *SA = cast<MSNoVTableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MSP430Interrupt: {
    const auto *SA = cast<MSP430InterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getNumber());
    break;
  }
  case attr::MSStruct: {
    const auto *SA = cast<MSStructAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MSVtorDisp: {
    const auto *SA = cast<MSVtorDispAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getVdm());
    break;
  }
  case attr::MaxFieldAlignment: {
    const auto *SA = cast<MaxFieldAlignmentAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getAlignment());
    break;
  }
  case attr::MayAlias: {
    const auto *SA = cast<MayAliasAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MicroMips: {
    const auto *SA = cast<MicroMipsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MinSize: {
    const auto *SA = cast<MinSizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MinVectorWidth: {
    const auto *SA = cast<MinVectorWidthAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getVectorWidth());
    break;
  }
  case attr::Mips16: {
    const auto *SA = cast<Mips16Attr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MipsInterrupt: {
    const auto *SA = cast<MipsInterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getInterrupt());
    break;
  }
  case attr::MipsLongCall: {
    const auto *SA = cast<MipsLongCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::MipsShortCall: {
    const auto *SA = cast<MipsShortCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Mode: {
    const auto *SA = cast<ModeAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getMode());
    break;
  }
  case attr::MustTail: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NSConsumed: {
    const auto *SA = cast<NSConsumedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NSConsumesSelf: {
    const auto *SA = cast<NSConsumesSelfAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NSErrorDomain: {
    const auto *SA = cast<NSErrorDomainAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddDeclRef(SA->getErrorDomain());
    break;
  }
  case attr::NSReturnsAutoreleased: {
    const auto *SA = cast<NSReturnsAutoreleasedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NSReturnsNotRetained: {
    const auto *SA = cast<NSReturnsNotRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NSReturnsRetained: {
    const auto *SA = cast<NSReturnsRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Naked: {
    const auto *SA = cast<NakedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoAlias: {
    const auto *SA = cast<NoAliasAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoBuiltin: {
    const auto *SA = cast<NoBuiltinAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->builtinNames_size());
    for (auto &Val : SA->builtinNames())
      Record.AddString(Val);
    break;
  }
  case attr::NoCommon: {
    const auto *SA = cast<NoCommonAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoDebug: {
    const auto *SA = cast<NoDebugAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoDeref: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoDestroy: {
    const auto *SA = cast<NoDestroyAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoDuplicate: {
    const auto *SA = cast<NoDuplicateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoEscape: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoInline: {
    const auto *SA = cast<NoInlineAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoInstrumentFunction: {
    const auto *SA = cast<NoInstrumentFunctionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoMerge: {
    const auto *SA = cast<NoMergeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoMicroMips: {
    const auto *SA = cast<NoMicroMipsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoMips16: {
    const auto *SA = cast<NoMips16Attr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoProfileFunction: {
    const auto *SA = cast<NoProfileFunctionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoReturn: {
    const auto *SA = cast<NoReturnAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoSanitize: {
    const auto *SA = cast<NoSanitizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->sanitizers_size());
    for (auto &Val : SA->sanitizers())
      Record.AddString(Val);
    break;
  }
  case attr::NoSpeculativeLoadHardening: {
    const auto *SA = cast<NoSpeculativeLoadHardeningAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoSplitStack: {
    const auto *SA = cast<NoSplitStackAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoStackProtector: {
    const auto *SA = cast<NoStackProtectorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoThreadSafetyAnalysis: {
    const auto *SA = cast<NoThreadSafetyAnalysisAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoThrow: {
    const auto *SA = cast<NoThrowAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NoUniqueAddress: {
    const auto *SA = cast<NoUniqueAddressAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::NonNull: {
    const auto *SA = cast<NonNullAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.push_back(Val.serialize());
    break;
  }
  case attr::NotTailCalled: {
    const auto *SA = cast<NotTailCalledAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OMPAllocateDecl: {
    const auto *SA = cast<OMPAllocateDeclAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getAllocatorType());
    Record.AddStmt(SA->getAllocator());
    Record.AddStmt(SA->getAlignment());
    break;
  }
  case attr::OMPCaptureKind: {
    const auto *SA = cast<OMPCaptureKindAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getCaptureKindVal());
    break;
  }
  case attr::OMPCaptureNoInit: {
    const auto *SA = cast<OMPCaptureNoInitAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OMPDeclareSimdDecl: {
    const auto *SA = cast<OMPDeclareSimdDeclAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getBranchState());
    Record.AddStmt(SA->getSimdlen());
    Record.push_back(SA->uniforms_size());
    for (auto &Val : SA->uniforms())
      Record.AddStmt(Val);
    Record.push_back(SA->aligneds_size());
    for (auto &Val : SA->aligneds())
      Record.AddStmt(Val);
    Record.push_back(SA->alignments_size());
    for (auto &Val : SA->alignments())
      Record.AddStmt(Val);
    Record.push_back(SA->linears_size());
    for (auto &Val : SA->linears())
      Record.AddStmt(Val);
    Record.push_back(SA->modifiers_size());
    for (auto &Val : SA->modifiers())
      Record.push_back(Val);
    Record.push_back(SA->steps_size());
    for (auto &Val : SA->steps())
      Record.AddStmt(Val);
    break;
  }
  case attr::OMPDeclareTargetDecl: {
    const auto *SA = cast<OMPDeclareTargetDeclAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getMapType());
Record.push_back(SA->getDevType());
    Record.push_back(SA->getLevel());
    break;
  }
  case attr::OMPDeclareVariant: {
    const auto *SA = cast<OMPDeclareVariantAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getVariantFuncRef());
    Record.writeOMPTraitInfo(SA->getTraitInfos());
    Record.push_back(SA->adjustArgsNothing_size());
    for (auto &Val : SA->adjustArgsNothing())
      Record.AddStmt(Val);
    Record.push_back(SA->adjustArgsNeedDevicePtr_size());
    for (auto &Val : SA->adjustArgsNeedDevicePtr())
      Record.AddStmt(Val);
    Record.push_back(SA->appendArgs_size());
    for (OMPDeclareVariantAttr::appendArgs_iterator i = SA->appendArgs_begin(), e = SA->appendArgs_end(); i != e; ++i)
      Record.push_back((*i));
    break;
  }
  case attr::OMPReferencedVar: {
    const auto *SA = cast<OMPReferencedVarAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getRef());
    break;
  }
  case attr::OMPThreadPrivateDecl: {
    const auto *SA = cast<OMPThreadPrivateDeclAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OSConsumed: {
    const auto *SA = cast<OSConsumedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OSConsumesThis: {
    const auto *SA = cast<OSConsumesThisAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OSReturnsNotRetained: {
    const auto *SA = cast<OSReturnsNotRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OSReturnsRetained: {
    const auto *SA = cast<OSReturnsRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OSReturnsRetainedOnNonZero: {
    const auto *SA = cast<OSReturnsRetainedOnNonZeroAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OSReturnsRetainedOnZero: {
    const auto *SA = cast<OSReturnsRetainedOnZeroAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCBoxable: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCBridge: {
    const auto *SA = cast<ObjCBridgeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getBridgedType());
    break;
  }
  case attr::ObjCBridgeMutable: {
    const auto *SA = cast<ObjCBridgeMutableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getBridgedType());
    break;
  }
  case attr::ObjCBridgeRelated: {
    const auto *SA = cast<ObjCBridgeRelatedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getRelatedClass());
    Record.AddIdentifierRef(SA->getClassMethod());
    Record.AddIdentifierRef(SA->getInstanceMethod());
    break;
  }
  case attr::ObjCClassStub: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCDesignatedInitializer: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCDirect: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCDirectMembers: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCException: {
    const auto *SA = cast<ObjCExceptionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCExplicitProtocolImpl: {
    const auto *SA = cast<ObjCExplicitProtocolImplAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCExternallyRetained: {
    const auto *SA = cast<ObjCExternallyRetainedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCGC: {
    const auto *SA = cast<ObjCGCAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getKind());
    break;
  }
  case attr::ObjCIndependentClass: {
    const auto *SA = cast<ObjCIndependentClassAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCInertUnsafeUnretained: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCKindOf: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCMethodFamily: {
    const auto *SA = cast<ObjCMethodFamilyAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getFamily());
    break;
  }
  case attr::ObjCNSObject: {
    const auto *SA = cast<ObjCNSObjectAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCNonLazyClass: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCNonRuntimeProtocol: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCOwnership: {
    const auto *SA = cast<ObjCOwnershipAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getKind());
    break;
  }
  case attr::ObjCPreciseLifetime: {
    const auto *SA = cast<ObjCPreciseLifetimeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCRequiresPropertyDefs: {
    const auto *SA = cast<ObjCRequiresPropertyDefsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCRequiresSuper: {
    const auto *SA = cast<ObjCRequiresSuperAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCReturnsInnerPointer: {
    const auto *SA = cast<ObjCReturnsInnerPointerAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCRootClass: {
    const auto *SA = cast<ObjCRootClassAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCRuntimeName: {
    const auto *SA = cast<ObjCRuntimeNameAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getMetadataName());
    break;
  }
  case attr::ObjCRuntimeVisible: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ObjCSubclassingRestricted: {
    const auto *SA = cast<ObjCSubclassingRestrictedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLAccess: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLConstantAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLGenericAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLGlobalAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLGlobalDeviceAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLGlobalHostAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLIntelReqdSubGroupSize: {
    const auto *SA = cast<OpenCLIntelReqdSubGroupSizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getSubGroupSize());
    break;
  }
  case attr::OpenCLKernel: {
    const auto *SA = cast<OpenCLKernelAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLLocalAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLPrivateAddressSpace: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::OpenCLUnrollHint: {
    const auto *SA = cast<OpenCLUnrollHintAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getUnrollHint());
    break;
  }
  case attr::OptimizeNone: {
    const auto *SA = cast<OptimizeNoneAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Overloadable: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Override: {
    const auto *SA = cast<OverrideAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Owner: {
    const auto *SA = cast<OwnerAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddTypeSourceInfo(SA->getDerefTypeLoc());
    break;
  }
  case attr::Ownership: {
    const auto *SA = cast<OwnershipAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getModule());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.push_back(Val.serialize());
    break;
  }
  case attr::Packed: {
    const auto *SA = cast<PackedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ParamTypestate: {
    const auto *SA = cast<ParamTypestateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getParamState());
    break;
  }
  case attr::Pascal: {
    const auto *SA = cast<PascalAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::PassObjectSize: {
    const auto *SA = cast<PassObjectSizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getType());
    break;
  }
  case attr::PatchableFunctionEntry: {
    const auto *SA = cast<PatchableFunctionEntryAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getCount());
    Record.push_back(SA->getOffset());
    break;
  }
  case attr::Pcs: {
    const auto *SA = cast<PcsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getPCS());
    break;
  }
  case attr::Pointer: {
    const auto *SA = cast<PointerAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddTypeSourceInfo(SA->getDerefTypeLoc());
    break;
  }
  case attr::PragmaClangBSSSection: {
    const auto *SA = cast<PragmaClangBSSSectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::PragmaClangDataSection: {
    const auto *SA = cast<PragmaClangDataSectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::PragmaClangRelroSection: {
    const auto *SA = cast<PragmaClangRelroSectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::PragmaClangRodataSection: {
    const auto *SA = cast<PragmaClangRodataSectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::PragmaClangTextSection: {
    const auto *SA = cast<PragmaClangTextSectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::PreferredName: {
    const auto *SA = cast<PreferredNameAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddTypeSourceInfo(SA->getTypedefTypeLoc());
    break;
  }
  case attr::PreserveAll: {
    const auto *SA = cast<PreserveAllAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::PreserveMost: {
    const auto *SA = cast<PreserveMostAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::PtGuardedBy: {
    const auto *SA = cast<PtGuardedByAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getArg());
    break;
  }
  case attr::PtGuardedVar: {
    const auto *SA = cast<PtGuardedVarAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Ptr32: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Ptr64: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Pure: {
    const auto *SA = cast<PureAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::RISCVInterrupt: {
    const auto *SA = cast<RISCVInterruptAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getInterrupt());
    break;
  }
  case attr::RegCall: {
    const auto *SA = cast<RegCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Reinitializes: {
    const auto *SA = cast<ReinitializesAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ReleaseCapability: {
    const auto *SA = cast<ReleaseCapabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::ReleaseHandle: {
    const auto *SA = cast<ReleaseHandleAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getHandleType());
    break;
  }
  case attr::RenderScriptKernel: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ReqdWorkGroupSize: {
    const auto *SA = cast<ReqdWorkGroupSizeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getXDim());
    Record.push_back(SA->getYDim());
    Record.push_back(SA->getZDim());
    break;
  }
  case attr::RequiresCapability: {
    const auto *SA = cast<RequiresCapabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::Restrict: {
    const auto *SA = cast<RestrictAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Retain: {
    const auto *SA = cast<RetainAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ReturnTypestate: {
    const auto *SA = cast<ReturnTypestateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getState());
    break;
  }
  case attr::ReturnsNonNull: {
    const auto *SA = cast<ReturnsNonNullAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ReturnsTwice: {
    const auto *SA = cast<ReturnsTwiceAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SPtr: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SYCLKernel: {
    const auto *SA = cast<SYCLKernelAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::ScopedLockable: {
    const auto *SA = cast<ScopedLockableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Section: {
    const auto *SA = cast<SectionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::SelectAny: {
    const auto *SA = cast<SelectAnyAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Sentinel: {
    const auto *SA = cast<SentinelAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getSentinel());
    Record.push_back(SA->getNullPos());
    break;
  }
  case attr::SetTypestate: {
    const auto *SA = cast<SetTypestateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getNewState());
    break;
  }
  case attr::SharedTrylockFunction: {
    const auto *SA = cast<SharedTrylockFunctionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getSuccessValue());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::SpeculativeLoadHardening: {
    const auto *SA = cast<SpeculativeLoadHardeningAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::StandaloneDebug: {
    const auto *SA = cast<StandaloneDebugAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::StdCall: {
    const auto *SA = cast<StdCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::StrictFP: {
    const auto *SA = cast<StrictFPAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Suppress: {
    const auto *SA = cast<SuppressAttr>(A);
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->diagnosticIdentifiers_size());
    for (auto &Val : SA->diagnosticIdentifiers())
      Record.AddString(Val);
    break;
  }
  case attr::SwiftAsync: {
    const auto *SA = cast<SwiftAsyncAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getKind());
    Record.push_back(SA->getCompletionHandlerIndex().serialize());
    break;
  }
  case attr::SwiftAsyncCall: {
    const auto *SA = cast<SwiftAsyncCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftAsyncContext: {
    const auto *SA = cast<SwiftAsyncContextAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftAsyncError: {
    const auto *SA = cast<SwiftAsyncErrorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getConvention());
    Record.push_back(SA->getHandlerParamIdx());
    break;
  }
  case attr::SwiftAsyncName: {
    const auto *SA = cast<SwiftAsyncNameAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::SwiftAttr: {
    const auto *SA = cast<SwiftAttrAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getAttribute());
    break;
  }
  case attr::SwiftBridge: {
    const auto *SA = cast<SwiftBridgeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getSwiftType());
    break;
  }
  case attr::SwiftBridgedTypedef: {
    const auto *SA = cast<SwiftBridgedTypedefAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftCall: {
    const auto *SA = cast<SwiftCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftContext: {
    const auto *SA = cast<SwiftContextAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftError: {
    const auto *SA = cast<SwiftErrorAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getConvention());
    break;
  }
  case attr::SwiftErrorResult: {
    const auto *SA = cast<SwiftErrorResultAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftIndirectResult: {
    const auto *SA = cast<SwiftIndirectResultAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftName: {
    const auto *SA = cast<SwiftNameAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getName());
    break;
  }
  case attr::SwiftNewType: {
    const auto *SA = cast<SwiftNewTypeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getNewtypeKind());
    break;
  }
  case attr::SwiftObjCMembers: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SwiftPrivate: {
    const auto *SA = cast<SwiftPrivateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::SysVABI: {
    const auto *SA = cast<SysVABIAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TLSModel: {
    const auto *SA = cast<TLSModelAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getModel());
    break;
  }
  case attr::Target: {
    const auto *SA = cast<TargetAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getFeaturesStr());
    break;
  }
  case attr::TargetClones: {
    const auto *SA = cast<TargetClonesAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->featuresStrs_size());
    for (auto &Val : SA->featuresStrs())
      Record.AddString(Val);
    break;
  }
  case attr::TestTypestate: {
    const auto *SA = cast<TestTypestateAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getTestState());
    break;
  }
  case attr::ThisCall: {
    const auto *SA = cast<ThisCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Thread: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TransparentUnion: {
    const auto *SA = cast<TransparentUnionAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TrivialABI: {
    const auto *SA = cast<TrivialABIAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TryAcquireCapability: {
    const auto *SA = cast<TryAcquireCapabilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddStmt(SA->getSuccessValue());
    Record.push_back(SA->args_size());
    for (auto &Val : SA->args())
      Record.AddStmt(Val);
    break;
  }
  case attr::TypeNonNull: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TypeNullUnspecified: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TypeNullable: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TypeNullableResult: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::TypeTagForDatatype: {
    const auto *SA = cast<TypeTagForDatatypeAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddIdentifierRef(SA->getArgumentKind());
    Record.AddTypeSourceInfo(SA->getMatchingCTypeLoc());
    Record.push_back(SA->getLayoutCompatible());
    Record.push_back(SA->getMustBeNull());
    break;
  }
  case attr::TypeVisibility: {
    const auto *SA = cast<TypeVisibilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getVisibility());
    break;
  }
  case attr::UPtr: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Unavailable: {
    const auto *SA = cast<UnavailableAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getMessage());
Record.push_back(SA->getImplicitReason());
    break;
  }
  case attr::Uninitialized: {
    const auto *SA = cast<UninitializedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Unlikely: {
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Unused: {
    const auto *SA = cast<UnusedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::UseHandle: {
    const auto *SA = cast<UseHandleAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getHandleType());
    break;
  }
  case attr::Used: {
    const auto *SA = cast<UsedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::UsingIfExists: {
    const auto *SA = cast<UsingIfExistsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Uuid: {
    const auto *SA = cast<UuidAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getGuid());
    Record.AddDeclRef(SA->getGuidDecl());
    break;
  }
  case attr::VecReturn: {
    const auto *SA = cast<VecReturnAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::VecTypeHint: {
    const auto *SA = cast<VecTypeHintAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddTypeSourceInfo(SA->getTypeHintLoc());
    break;
  }
  case attr::VectorCall: {
    const auto *SA = cast<VectorCallAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::Visibility: {
    const auto *SA = cast<VisibilityAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
Record.push_back(SA->getVisibility());
    break;
  }
  case attr::WarnUnused: {
    const auto *SA = cast<WarnUnusedAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::WarnUnusedResult: {
    const auto *SA = cast<WarnUnusedResultAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getMessage());
    break;
  }
  case attr::Weak: {
    const auto *SA = cast<WeakAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::WeakImport: {
    const auto *SA = cast<WeakImportAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::WeakRef: {
    const auto *SA = cast<WeakRefAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getAliasee());
    break;
  }
  case attr::WebAssemblyExportName: {
    const auto *SA = cast<WebAssemblyExportNameAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getExportName());
    break;
  }
  case attr::WebAssemblyImportModule: {
    const auto *SA = cast<WebAssemblyImportModuleAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getImportModule());
    break;
  }
  case attr::WebAssemblyImportName: {
    const auto *SA = cast<WebAssemblyImportNameAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.AddString(SA->getImportName());
    break;
  }
  case attr::WorkGroupSizeHint: {
    const auto *SA = cast<WorkGroupSizeHintAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getXDim());
    Record.push_back(SA->getYDim());
    Record.push_back(SA->getZDim());
    break;
  }
  case attr::X86ForceAlignArgPointer: {
    const auto *SA = cast<X86ForceAlignArgPointerAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::XRayInstrument: {
    const auto *SA = cast<XRayInstrumentAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    break;
  }
  case attr::XRayLogArgs: {
    const auto *SA = cast<XRayLogArgsAttr>(A);
    Record.push_back(SA->isInherited());
    Record.push_back(A->isImplicit());
    Record.push_back(A->isPackExpansion());
    Record.push_back(SA->getArgumentCount());
    break;
  }
  }
