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

  void VisitAMDGPUNumSGPRAttr(const AMDGPUNumSGPRAttr *A) {
    const auto *SA = cast<AMDGPUNumSGPRAttr>(A); (void)SA;
    OS << " " << SA->getNumSGPR();
  }
  void VisitAMDGPUNumVGPRAttr(const AMDGPUNumVGPRAttr *A) {
    const auto *SA = cast<AMDGPUNumVGPRAttr>(A); (void)SA;
    OS << " " << SA->getNumVGPR();
  }
  void VisitARMInterruptAttr(const ARMInterruptAttr *A) {
    const auto *SA = cast<ARMInterruptAttr>(A); (void)SA;
    switch(SA->getInterrupt()) {
    case ARMInterruptAttr::IRQ:
      OS << " IRQ";
      break;
    case ARMInterruptAttr::FIQ:
      OS << " FIQ";
      break;
    case ARMInterruptAttr::SWI:
      OS << " SWI";
      break;
    case ARMInterruptAttr::ABORT:
      OS << " ABORT";
      break;
    case ARMInterruptAttr::UNDEF:
      OS << " UNDEF";
      break;
    case ARMInterruptAttr::Generic:
      OS << " Generic";
      break;
    }
  }
  void VisitAbiTagAttr(const AbiTagAttr *A) {
    const auto *SA = cast<AbiTagAttr>(A); (void)SA;
    for (const auto &Val : SA->tags())
      OS << " " << Val;
  }
  void VisitAcquireCapabilityAttr(const AcquireCapabilityAttr *A) {
    const auto *SA = cast<AcquireCapabilityAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
  }
  void VisitAcquireHandleAttr(const AcquireHandleAttr *A) {
    const auto *SA = cast<AcquireHandleAttr>(A); (void)SA;
    OS << " \"" << SA->getHandleType() << "\"";
  }
  void VisitAddressSpaceAttr(const AddressSpaceAttr *A) {
    const auto *SA = cast<AddressSpaceAttr>(A); (void)SA;
    OS << " " << SA->getAddressSpace();
  }
  void VisitAliasAttr(const AliasAttr *A) {
    const auto *SA = cast<AliasAttr>(A); (void)SA;
    OS << " \"" << SA->getAliasee() << "\"";
  }
  void VisitAlignedAttr(const AlignedAttr *A) {
    const auto *SA = cast<AlignedAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    if (!SA->isAlignmentExpr())
      dumpType(SA->getAlignmentType()->getType());
  }
  void VisitAllocAlignAttr(const AllocAlignAttr *A) {
    const auto *SA = cast<AllocAlignAttr>(A); (void)SA;
    OS << " " << SA->getParamIndex().getSourceIndex();
  }
  void VisitAllocSizeAttr(const AllocSizeAttr *A) {
    const auto *SA = cast<AllocSizeAttr>(A); (void)SA;
    OS << " " << SA->getElemSizeParam().getSourceIndex();
    if (SA->getNumElemsParam().isValid())
      OS << " " << SA->getNumElemsParam().getSourceIndex();
  }
  void VisitAlwaysInlineAttr(const AlwaysInlineAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitAnnotateAttr(const AnnotateAttr *A) {
    const auto *SA = cast<AnnotateAttr>(A); (void)SA;
    OS << " \"" << SA->getAnnotation() << "\"";
  }
  void VisitAnnotateTypeAttr(const AnnotateTypeAttr *A) {
    const auto *SA = cast<AnnotateTypeAttr>(A); (void)SA;
    OS << " \"" << SA->getAnnotation() << "\"";
  }
  void VisitArgumentWithTypeTagAttr(const ArgumentWithTypeTagAttr *A) {
    const auto *SA = cast<ArgumentWithTypeTagAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    if (SA->getArgumentKind())
      OS << " " << SA->getArgumentKind()->getName();
    OS << " " << SA->getArgumentIdx().getSourceIndex();
    OS << " " << SA->getTypeTagIdx().getSourceIndex();
    if (SA->getIsPointer()) OS << " IsPointer";
  }
  void VisitArmBuiltinAliasAttr(const ArmBuiltinAliasAttr *A) {
    const auto *SA = cast<ArmBuiltinAliasAttr>(A); (void)SA;
    if (SA->getBuiltinName())
      OS << " " << SA->getBuiltinName()->getName();
  }
  void VisitAsmLabelAttr(const AsmLabelAttr *A) {
    const auto *SA = cast<AsmLabelAttr>(A); (void)SA;
    OS << " \"" << SA->getLabel() << "\"";
    if (SA->getIsLiteralLabel()) OS << " IsLiteralLabel";
  }
  void VisitAssertCapabilityAttr(const AssertCapabilityAttr *A) {
    const auto *SA = cast<AssertCapabilityAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
  }
  void VisitAssumptionAttr(const AssumptionAttr *A) {
    const auto *SA = cast<AssumptionAttr>(A); (void)SA;
    OS << " \"" << SA->getAssumption() << "\"";
  }
  void VisitAvailabilityAttr(const AvailabilityAttr *A) {
    const auto *SA = cast<AvailabilityAttr>(A); (void)SA;
    if (SA->getPlatform())
      OS << " " << SA->getPlatform()->getName();
    OS << " " << SA->getIntroduced();
    OS << " " << SA->getDeprecated();
    OS << " " << SA->getObsoleted();
    if (SA->getUnavailable()) OS << " Unavailable";
    OS << " \"" << SA->getMessage() << "\"";
    if (SA->getStrict()) OS << " Strict";
    OS << " \"" << SA->getReplacement() << "\"";
    OS << " " << SA->getPriority();
  }
  void VisitBTFDeclTagAttr(const BTFDeclTagAttr *A) {
    const auto *SA = cast<BTFDeclTagAttr>(A); (void)SA;
    OS << " \"" << SA->getBTFDeclTag() << "\"";
  }
  void VisitBTFTypeTagAttr(const BTFTypeTagAttr *A) {
    const auto *SA = cast<BTFTypeTagAttr>(A); (void)SA;
    OS << " \"" << SA->getBTFTypeTag() << "\"";
  }
  void VisitBlocksAttr(const BlocksAttr *A) {
    const auto *SA = cast<BlocksAttr>(A); (void)SA;
    switch(SA->getType()) {
    case BlocksAttr::ByRef:
      OS << " ByRef";
      break;
    }
  }
  void VisitBuiltinAttr(const BuiltinAttr *A) {
    const auto *SA = cast<BuiltinAttr>(A); (void)SA;
    OS << " " << SA->getID();
  }
  void VisitBuiltinAliasAttr(const BuiltinAliasAttr *A) {
    const auto *SA = cast<BuiltinAliasAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    if (SA->getBuiltinName())
      OS << " " << SA->getBuiltinName()->getName();
  }
  void VisitCFGuardAttr(const CFGuardAttr *A) {
    const auto *SA = cast<CFGuardAttr>(A); (void)SA;
    switch(SA->getGuard()) {
    case CFGuardAttr::nocf:
      OS << " nocf";
      break;
    }
  }
  void VisitCPUDispatchAttr(const CPUDispatchAttr *A) {
    const auto *SA = cast<CPUDispatchAttr>(A); (void)SA;
    for (const auto &Val : SA->cpus())
      OS << " " << Val;
  }
  void VisitCPUSpecificAttr(const CPUSpecificAttr *A) {
    const auto *SA = cast<CPUSpecificAttr>(A); (void)SA;
    for (const auto &Val : SA->cpus())
      OS << " " << Val;
  }
  void VisitCXX11NoReturnAttr(const CXX11NoReturnAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitCallableWhenAttr(const CallableWhenAttr *A) {
    const auto *SA = cast<CallableWhenAttr>(A); (void)SA;
    for (CallableWhenAttr::callableStates_iterator I = SA->callableStates_begin(), E = SA->callableStates_end(); I != E; ++I) {
      switch(*I) {
    case CallableWhenAttr::Unknown:
      OS << " Unknown";
      break;
    case CallableWhenAttr::Consumed:
      OS << " Consumed";
      break;
    case CallableWhenAttr::Unconsumed:
      OS << " Unconsumed";
      break;
      }
    }
  }
  void VisitCallbackAttr(const CallbackAttr *A) {
    const auto *SA = cast<CallbackAttr>(A); (void)SA;
    for (const auto &Val : SA->encoding())
      OS << " " << Val;
  }
  void VisitCapabilityAttr(const CapabilityAttr *A) {
    const auto *SA = cast<CapabilityAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitCleanupAttr(const CleanupAttr *A) {
    const auto *SA = cast<CleanupAttr>(A); (void)SA;
    OS << " ";
    dumpBareDeclRef(SA->getFunctionDecl());
  }
  void VisitCodeSegAttr(const CodeSegAttr *A) {
    const auto *SA = cast<CodeSegAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitConstInitAttr(const ConstInitAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitConstructorAttr(const ConstructorAttr *A) {
    const auto *SA = cast<ConstructorAttr>(A); (void)SA;
    OS << " " << SA->getPriority();
  }
  void VisitConsumableAttr(const ConsumableAttr *A) {
    const auto *SA = cast<ConsumableAttr>(A); (void)SA;
    switch(SA->getDefaultState()) {
    case ConsumableAttr::Unknown:
      OS << " Unknown";
      break;
    case ConsumableAttr::Consumed:
      OS << " Consumed";
      break;
    case ConsumableAttr::Unconsumed:
      OS << " Unconsumed";
      break;
    }
  }
  void VisitDeprecatedAttr(const DeprecatedAttr *A) {
    const auto *SA = cast<DeprecatedAttr>(A); (void)SA;
    OS << " \"" << SA->getMessage() << "\"";
    OS << " \"" << SA->getReplacement() << "\"";
  }
  void VisitDestructorAttr(const DestructorAttr *A) {
    const auto *SA = cast<DestructorAttr>(A); (void)SA;
    OS << " " << SA->getPriority();
  }
  void VisitDiagnoseAsBuiltinAttr(const DiagnoseAsBuiltinAttr *A) {
    const auto *SA = cast<DiagnoseAsBuiltinAttr>(A); (void)SA;
    OS << " ";
    dumpBareDeclRef(SA->getFunction());
    for (const auto &Val : SA->argIndices())
      OS << " " << Val;
  }
  void VisitDiagnoseIfAttr(const DiagnoseIfAttr *A) {
    const auto *SA = cast<DiagnoseIfAttr>(A); (void)SA;
    OS << " \"" << SA->getMessage() << "\"";
    switch(SA->getDiagnosticType()) {
    case DiagnoseIfAttr::DT_Error:
      OS << " DT_Error";
      break;
    case DiagnoseIfAttr::DT_Warning:
      OS << " DT_Warning";
      break;
    }
    if (SA->getArgDependent()) OS << " ArgDependent";
    OS << " ";
    dumpBareDeclRef(SA->getParent());
  }
  void VisitEnableIfAttr(const EnableIfAttr *A) {
    const auto *SA = cast<EnableIfAttr>(A); (void)SA;
    OS << " \"" << SA->getMessage() << "\"";
  }
  void VisitEnforceTCBAttr(const EnforceTCBAttr *A) {
    const auto *SA = cast<EnforceTCBAttr>(A); (void)SA;
    OS << " \"" << SA->getTCBName() << "\"";
  }
  void VisitEnforceTCBLeafAttr(const EnforceTCBLeafAttr *A) {
    const auto *SA = cast<EnforceTCBLeafAttr>(A); (void)SA;
    OS << " \"" << SA->getTCBName() << "\"";
  }
  void VisitEnumExtensibilityAttr(const EnumExtensibilityAttr *A) {
    const auto *SA = cast<EnumExtensibilityAttr>(A); (void)SA;
    switch(SA->getExtensibility()) {
    case EnumExtensibilityAttr::Closed:
      OS << " Closed";
      break;
    case EnumExtensibilityAttr::Open:
      OS << " Open";
      break;
    }
  }
  void VisitErrorAttr(const ErrorAttr *A) {
    const auto *SA = cast<ErrorAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    OS << " \"" << SA->getUserDiagnostic() << "\"";
  }
  void VisitExternalSourceSymbolAttr(const ExternalSourceSymbolAttr *A) {
    const auto *SA = cast<ExternalSourceSymbolAttr>(A); (void)SA;
    OS << " \"" << SA->getLanguage() << "\"";
    OS << " \"" << SA->getDefinedIn() << "\"";
    if (SA->getGeneratedDeclaration()) OS << " GeneratedDeclaration";
    OS << " \"" << SA->getUSR() << "\"";
  }
  void VisitFinalAttr(const FinalAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitFormatAttr(const FormatAttr *A) {
    const auto *SA = cast<FormatAttr>(A); (void)SA;
    if (SA->getType())
      OS << " " << SA->getType()->getName();
    OS << " " << SA->getFormatIdx();
    OS << " " << SA->getFirstArg();
  }
  void VisitFormatArgAttr(const FormatArgAttr *A) {
    const auto *SA = cast<FormatArgAttr>(A); (void)SA;
    OS << " " << SA->getFormatIdx().getSourceIndex();
  }
  void VisitFunctionReturnThunksAttr(const FunctionReturnThunksAttr *A) {
    const auto *SA = cast<FunctionReturnThunksAttr>(A); (void)SA;
    switch(SA->getThunkType()) {
    case FunctionReturnThunksAttr::Keep:
      OS << " Keep";
      break;
    case FunctionReturnThunksAttr::Extern:
      OS << " Extern";
      break;
    }
  }
  void VisitHLSLNumThreadsAttr(const HLSLNumThreadsAttr *A) {
    const auto *SA = cast<HLSLNumThreadsAttr>(A); (void)SA;
    OS << " " << SA->getX();
    OS << " " << SA->getY();
    OS << " " << SA->getZ();
  }
  void VisitHLSLResourceAttr(const HLSLResourceAttr *A) {
    const auto *SA = cast<HLSLResourceAttr>(A); (void)SA;
    switch(SA->getResourceType()) {
    case HLSLResourceAttr::SRV:
      OS << " SRV";
      break;
    case HLSLResourceAttr::UAV:
      OS << " UAV";
      break;
    case HLSLResourceAttr::CBuffer:
      OS << " CBuffer";
      break;
    case HLSLResourceAttr::Sampler:
      OS << " Sampler";
      break;
    }
    switch(SA->getResourceShape()) {
    case HLSLResourceAttr::Texture1D:
      OS << " Texture1D";
      break;
    case HLSLResourceAttr::Texture2D:
      OS << " Texture2D";
      break;
    case HLSLResourceAttr::Texture2DMS:
      OS << " Texture2DMS";
      break;
    case HLSLResourceAttr::Texture3D:
      OS << " Texture3D";
      break;
    case HLSLResourceAttr::TextureCube:
      OS << " TextureCube";
      break;
    case HLSLResourceAttr::Texture1DArray:
      OS << " Texture1DArray";
      break;
    case HLSLResourceAttr::Texture2DArray:
      OS << " Texture2DArray";
      break;
    case HLSLResourceAttr::Texture2DMSArray:
      OS << " Texture2DMSArray";
      break;
    case HLSLResourceAttr::TextureCubeArray:
      OS << " TextureCubeArray";
      break;
    case HLSLResourceAttr::TypedBuffer:
      OS << " TypedBuffer";
      break;
    case HLSLResourceAttr::RawBuffer:
      OS << " RawBuffer";
      break;
    case HLSLResourceAttr::StructuredBuffer:
      OS << " StructuredBuffer";
      break;
    case HLSLResourceAttr::CBufferKind:
      OS << " CBufferKind";
      break;
    case HLSLResourceAttr::SamplerKind:
      OS << " SamplerKind";
      break;
    case HLSLResourceAttr::TBuffer:
      OS << " TBuffer";
      break;
    case HLSLResourceAttr::RTAccelerationStructure:
      OS << " RTAccelerationStructure";
      break;
    case HLSLResourceAttr::FeedbackTexture2D:
      OS << " FeedbackTexture2D";
      break;
    case HLSLResourceAttr::FeedbackTexture2DArray:
      OS << " FeedbackTexture2DArray";
      break;
    }
  }
  void VisitHLSLResourceBindingAttr(const HLSLResourceBindingAttr *A) {
    const auto *SA = cast<HLSLResourceBindingAttr>(A); (void)SA;
    OS << " \"" << SA->getSlot() << "\"";
    OS << " \"" << SA->getSpace() << "\"";
  }
  void VisitHLSLShaderAttr(const HLSLShaderAttr *A) {
    const auto *SA = cast<HLSLShaderAttr>(A); (void)SA;
    switch(SA->getType()) {
    case HLSLShaderAttr::Pixel:
      OS << " Pixel";
      break;
    case HLSLShaderAttr::Vertex:
      OS << " Vertex";
      break;
    case HLSLShaderAttr::Geometry:
      OS << " Geometry";
      break;
    case HLSLShaderAttr::Hull:
      OS << " Hull";
      break;
    case HLSLShaderAttr::Domain:
      OS << " Domain";
      break;
    case HLSLShaderAttr::Compute:
      OS << " Compute";
      break;
    case HLSLShaderAttr::Library:
      OS << " Library";
      break;
    case HLSLShaderAttr::RayGeneration:
      OS << " RayGeneration";
      break;
    case HLSLShaderAttr::Intersection:
      OS << " Intersection";
      break;
    case HLSLShaderAttr::AnyHit:
      OS << " AnyHit";
      break;
    case HLSLShaderAttr::ClosestHit:
      OS << " ClosestHit";
      break;
    case HLSLShaderAttr::Miss:
      OS << " Miss";
      break;
    case HLSLShaderAttr::Callable:
      OS << " Callable";
      break;
    case HLSLShaderAttr::Mesh:
      OS << " Mesh";
      break;
    case HLSLShaderAttr::Amplification:
      OS << " Amplification";
      break;
    }
  }
  void VisitIBOutletCollectionAttr(const IBOutletCollectionAttr *A) {
    const auto *SA = cast<IBOutletCollectionAttr>(A); (void)SA;
    if (SA->getInterfaceLoc())    OS << " " << SA->getInterface().getAsString();
  }
  void VisitIFuncAttr(const IFuncAttr *A) {
    const auto *SA = cast<IFuncAttr>(A); (void)SA;
    OS << " \"" << SA->getResolver() << "\"";
  }
  void VisitInitPriorityAttr(const InitPriorityAttr *A) {
    const auto *SA = cast<InitPriorityAttr>(A); (void)SA;
    OS << " " << SA->getPriority();
  }
  void VisitInitSegAttr(const InitSegAttr *A) {
    const auto *SA = cast<InitSegAttr>(A); (void)SA;
    OS << " \"" << SA->getSection() << "\"";
  }
  void VisitLayoutVersionAttr(const LayoutVersionAttr *A) {
    const auto *SA = cast<LayoutVersionAttr>(A); (void)SA;
    OS << " " << SA->getVersion();
  }
  void VisitLoopHintAttr(const LoopHintAttr *A) {
    const auto *SA = cast<LoopHintAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    switch(SA->getOption()) {
    case LoopHintAttr::Vectorize:
      OS << " Vectorize";
      break;
    case LoopHintAttr::VectorizeWidth:
      OS << " VectorizeWidth";
      break;
    case LoopHintAttr::Interleave:
      OS << " Interleave";
      break;
    case LoopHintAttr::InterleaveCount:
      OS << " InterleaveCount";
      break;
    case LoopHintAttr::Unroll:
      OS << " Unroll";
      break;
    case LoopHintAttr::UnrollCount:
      OS << " UnrollCount";
      break;
    case LoopHintAttr::UnrollAndJam:
      OS << " UnrollAndJam";
      break;
    case LoopHintAttr::UnrollAndJamCount:
      OS << " UnrollAndJamCount";
      break;
    case LoopHintAttr::PipelineDisabled:
      OS << " PipelineDisabled";
      break;
    case LoopHintAttr::PipelineInitiationInterval:
      OS << " PipelineInitiationInterval";
      break;
    case LoopHintAttr::Distribute:
      OS << " Distribute";
      break;
    case LoopHintAttr::VectorizePredicate:
      OS << " VectorizePredicate";
      break;
    }
    switch(SA->getState()) {
    case LoopHintAttr::Enable:
      OS << " Enable";
      break;
    case LoopHintAttr::Disable:
      OS << " Disable";
      break;
    case LoopHintAttr::Numeric:
      OS << " Numeric";
      break;
    case LoopHintAttr::FixedWidth:
      OS << " FixedWidth";
      break;
    case LoopHintAttr::ScalableWidth:
      OS << " ScalableWidth";
      break;
    case LoopHintAttr::AssumeSafety:
      OS << " AssumeSafety";
      break;
    case LoopHintAttr::Full:
      OS << " Full";
      break;
    }
  }
  void VisitM68kInterruptAttr(const M68kInterruptAttr *A) {
    const auto *SA = cast<M68kInterruptAttr>(A); (void)SA;
    OS << " " << SA->getNumber();
  }
  void VisitMSInheritanceAttr(const MSInheritanceAttr *A) {
    const auto *SA = cast<MSInheritanceAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    if (SA->getBestCase()) OS << " BestCase";
  }
  void VisitMSP430InterruptAttr(const MSP430InterruptAttr *A) {
    const auto *SA = cast<MSP430InterruptAttr>(A); (void)SA;
    OS << " " << SA->getNumber();
  }
  void VisitMSVtorDispAttr(const MSVtorDispAttr *A) {
    const auto *SA = cast<MSVtorDispAttr>(A); (void)SA;
    OS << " " << SA->getVdm();
  }
  void VisitMaxFieldAlignmentAttr(const MaxFieldAlignmentAttr *A) {
    const auto *SA = cast<MaxFieldAlignmentAttr>(A); (void)SA;
    OS << " " << SA->getAlignment();
  }
  void VisitMinVectorWidthAttr(const MinVectorWidthAttr *A) {
    const auto *SA = cast<MinVectorWidthAttr>(A); (void)SA;
    OS << " " << SA->getVectorWidth();
  }
  void VisitMipsInterruptAttr(const MipsInterruptAttr *A) {
    const auto *SA = cast<MipsInterruptAttr>(A); (void)SA;
    switch(SA->getInterrupt()) {
    case MipsInterruptAttr::sw0:
      OS << " sw0";
      break;
    case MipsInterruptAttr::sw1:
      OS << " sw1";
      break;
    case MipsInterruptAttr::hw0:
      OS << " hw0";
      break;
    case MipsInterruptAttr::hw1:
      OS << " hw1";
      break;
    case MipsInterruptAttr::hw2:
      OS << " hw2";
      break;
    case MipsInterruptAttr::hw3:
      OS << " hw3";
      break;
    case MipsInterruptAttr::hw4:
      OS << " hw4";
      break;
    case MipsInterruptAttr::hw5:
      OS << " hw5";
      break;
    case MipsInterruptAttr::eic:
      OS << " eic";
      break;
    }
  }
  void VisitMipsLongCallAttr(const MipsLongCallAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitMipsShortCallAttr(const MipsShortCallAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitModeAttr(const ModeAttr *A) {
    const auto *SA = cast<ModeAttr>(A); (void)SA;
    if (SA->getMode())
      OS << " " << SA->getMode()->getName();
  }
  void VisitNSErrorDomainAttr(const NSErrorDomainAttr *A) {
    const auto *SA = cast<NSErrorDomainAttr>(A); (void)SA;
    OS << " ";
    dumpBareDeclRef(SA->getErrorDomain());
  }
  void VisitNoBuiltinAttr(const NoBuiltinAttr *A) {
    const auto *SA = cast<NoBuiltinAttr>(A); (void)SA;
    for (const auto &Val : SA->builtinNames())
      OS << " " << Val;
  }
  void VisitNoSanitizeAttr(const NoSanitizeAttr *A) {
    const auto *SA = cast<NoSanitizeAttr>(A); (void)SA;
    for (const auto &Val : SA->sanitizers())
      OS << " " << Val;
  }
  void VisitNoStackProtectorAttr(const NoStackProtectorAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitNonNullAttr(const NonNullAttr *A) {
    const auto *SA = cast<NonNullAttr>(A); (void)SA;
    for (const auto &Val : SA->args())
      OS << " " << Val.getSourceIndex();
  }
  void VisitOMPAllocateDeclAttr(const OMPAllocateDeclAttr *A) {
    const auto *SA = cast<OMPAllocateDeclAttr>(A); (void)SA;
    switch(SA->getAllocatorType()) {
    case OMPAllocateDeclAttr::OMPNullMemAlloc:
      OS << " OMPNullMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPDefaultMemAlloc:
      OS << " OMPDefaultMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPLargeCapMemAlloc:
      OS << " OMPLargeCapMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPConstMemAlloc:
      OS << " OMPConstMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPHighBWMemAlloc:
      OS << " OMPHighBWMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPLowLatMemAlloc:
      OS << " OMPLowLatMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPCGroupMemAlloc:
      OS << " OMPCGroupMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPPTeamMemAlloc:
      OS << " OMPPTeamMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPThreadMemAlloc:
      OS << " OMPThreadMemAlloc";
      break;
    case OMPAllocateDeclAttr::OMPUserDefinedMemAlloc:
      OS << " OMPUserDefinedMemAlloc";
      break;
    }
  }
  void VisitOMPCaptureKindAttr(const OMPCaptureKindAttr *A) {
    const auto *SA = cast<OMPCaptureKindAttr>(A); (void)SA;
    OS << " " << SA->getCaptureKindVal();
  }
  void VisitOMPDeclareSimdDeclAttr(const OMPDeclareSimdDeclAttr *A) {
    const auto *SA = cast<OMPDeclareSimdDeclAttr>(A); (void)SA;
    switch(SA->getBranchState()) {
    case OMPDeclareSimdDeclAttr::BS_Undefined:
      OS << " BS_Undefined";
      break;
    case OMPDeclareSimdDeclAttr::BS_Inbranch:
      OS << " BS_Inbranch";
      break;
    case OMPDeclareSimdDeclAttr::BS_Notinbranch:
      OS << " BS_Notinbranch";
      break;
    }
    for (const auto &Val : SA->modifiers())
      OS << " " << Val;
  }
  void VisitOMPDeclareTargetDeclAttr(const OMPDeclareTargetDeclAttr *A) {
    const auto *SA = cast<OMPDeclareTargetDeclAttr>(A); (void)SA;
    switch(SA->getMapType()) {
    case OMPDeclareTargetDeclAttr::MT_To:
      OS << " MT_To";
      break;
    case OMPDeclareTargetDeclAttr::MT_Enter:
      OS << " MT_Enter";
      break;
    case OMPDeclareTargetDeclAttr::MT_Link:
      OS << " MT_Link";
      break;
    }
    switch(SA->getDevType()) {
    case OMPDeclareTargetDeclAttr::DT_Host:
      OS << " DT_Host";
      break;
    case OMPDeclareTargetDeclAttr::DT_NoHost:
      OS << " DT_NoHost";
      break;
    case OMPDeclareTargetDeclAttr::DT_Any:
      OS << " DT_Any";
      break;
    }
    if (SA->getIndirect()) OS << " Indirect";
    OS << " " << SA->getLevel();
  }
  void VisitOMPDeclareVariantAttr(const OMPDeclareVariantAttr *A) {
    const auto *SA = cast<OMPDeclareVariantAttr>(A); (void)SA;
    OS << " " << SA->getTraitInfos();
    for (OMPDeclareVariantAttr::appendArgs_iterator I = SA->appendArgs_begin(), E = SA->appendArgs_end(); I != E; ++I) {
      if (I->IsTarget && I->IsTargetSync)
        OS << " Target_TargetSync";
      else if (I->IsTarget)
        OS << " Target";
      else
        OS << " TargetSync";
    }
  }
  void VisitObjCBridgeAttr(const ObjCBridgeAttr *A) {
    const auto *SA = cast<ObjCBridgeAttr>(A); (void)SA;
    if (SA->getBridgedType())
      OS << " " << SA->getBridgedType()->getName();
  }
  void VisitObjCBridgeMutableAttr(const ObjCBridgeMutableAttr *A) {
    const auto *SA = cast<ObjCBridgeMutableAttr>(A); (void)SA;
    if (SA->getBridgedType())
      OS << " " << SA->getBridgedType()->getName();
  }
  void VisitObjCBridgeRelatedAttr(const ObjCBridgeRelatedAttr *A) {
    const auto *SA = cast<ObjCBridgeRelatedAttr>(A); (void)SA;
    if (SA->getRelatedClass())
      OS << " " << SA->getRelatedClass()->getName();
    if (SA->getClassMethod())
      OS << " " << SA->getClassMethod()->getName();
    if (SA->getInstanceMethod())
      OS << " " << SA->getInstanceMethod()->getName();
  }
  void VisitObjCGCAttr(const ObjCGCAttr *A) {
    const auto *SA = cast<ObjCGCAttr>(A); (void)SA;
    if (SA->getKind())
      OS << " " << SA->getKind()->getName();
  }
  void VisitObjCMethodFamilyAttr(const ObjCMethodFamilyAttr *A) {
    const auto *SA = cast<ObjCMethodFamilyAttr>(A); (void)SA;
    switch(SA->getFamily()) {
    case ObjCMethodFamilyAttr::OMF_None:
      OS << " OMF_None";
      break;
    case ObjCMethodFamilyAttr::OMF_alloc:
      OS << " OMF_alloc";
      break;
    case ObjCMethodFamilyAttr::OMF_copy:
      OS << " OMF_copy";
      break;
    case ObjCMethodFamilyAttr::OMF_init:
      OS << " OMF_init";
      break;
    case ObjCMethodFamilyAttr::OMF_mutableCopy:
      OS << " OMF_mutableCopy";
      break;
    case ObjCMethodFamilyAttr::OMF_new:
      OS << " OMF_new";
      break;
    }
  }
  void VisitObjCOwnershipAttr(const ObjCOwnershipAttr *A) {
    const auto *SA = cast<ObjCOwnershipAttr>(A); (void)SA;
    if (SA->getKind())
      OS << " " << SA->getKind()->getName();
  }
  void VisitObjCRuntimeNameAttr(const ObjCRuntimeNameAttr *A) {
    const auto *SA = cast<ObjCRuntimeNameAttr>(A); (void)SA;
    OS << " \"" << SA->getMetadataName() << "\"";
  }
  void VisitOpenCLAccessAttr(const OpenCLAccessAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitOpenCLConstantAddressSpaceAttr(const OpenCLConstantAddressSpaceAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitOpenCLGenericAddressSpaceAttr(const OpenCLGenericAddressSpaceAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitOpenCLGlobalAddressSpaceAttr(const OpenCLGlobalAddressSpaceAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitOpenCLIntelReqdSubGroupSizeAttr(const OpenCLIntelReqdSubGroupSizeAttr *A) {
    const auto *SA = cast<OpenCLIntelReqdSubGroupSizeAttr>(A); (void)SA;
    OS << " " << SA->getSubGroupSize();
  }
  void VisitOpenCLLocalAddressSpaceAttr(const OpenCLLocalAddressSpaceAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitOpenCLPrivateAddressSpaceAttr(const OpenCLPrivateAddressSpaceAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitOpenCLUnrollHintAttr(const OpenCLUnrollHintAttr *A) {
    const auto *SA = cast<OpenCLUnrollHintAttr>(A); (void)SA;
    OS << " " << SA->getUnrollHint();
  }
  void VisitOwnerAttr(const OwnerAttr *A) {
    const auto *SA = cast<OwnerAttr>(A); (void)SA;
    if (SA->getDerefTypeLoc())    OS << " " << SA->getDerefType().getAsString();
  }
  void VisitOwnershipAttr(const OwnershipAttr *A) {
    const auto *SA = cast<OwnershipAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    if (SA->getModule())
      OS << " " << SA->getModule()->getName();
    for (const auto &Val : SA->args())
      OS << " " << Val.getSourceIndex();
  }
  void VisitParamTypestateAttr(const ParamTypestateAttr *A) {
    const auto *SA = cast<ParamTypestateAttr>(A); (void)SA;
    switch(SA->getParamState()) {
    case ParamTypestateAttr::Unknown:
      OS << " Unknown";
      break;
    case ParamTypestateAttr::Consumed:
      OS << " Consumed";
      break;
    case ParamTypestateAttr::Unconsumed:
      OS << " Unconsumed";
      break;
    }
  }
  void VisitPassObjectSizeAttr(const PassObjectSizeAttr *A) {
    const auto *SA = cast<PassObjectSizeAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    OS << " " << SA->getType();
  }
  void VisitPatchableFunctionEntryAttr(const PatchableFunctionEntryAttr *A) {
    const auto *SA = cast<PatchableFunctionEntryAttr>(A); (void)SA;
    OS << " " << SA->getCount();
    OS << " " << SA->getOffset();
  }
  void VisitPcsAttr(const PcsAttr *A) {
    const auto *SA = cast<PcsAttr>(A); (void)SA;
    switch(SA->getPCS()) {
    case PcsAttr::AAPCS:
      OS << " AAPCS";
      break;
    case PcsAttr::AAPCS_VFP:
      OS << " AAPCS_VFP";
      break;
    }
  }
  void VisitPointerAttr(const PointerAttr *A) {
    const auto *SA = cast<PointerAttr>(A); (void)SA;
    if (SA->getDerefTypeLoc())    OS << " " << SA->getDerefType().getAsString();
  }
  void VisitPragmaClangBSSSectionAttr(const PragmaClangBSSSectionAttr *A) {
    const auto *SA = cast<PragmaClangBSSSectionAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitPragmaClangDataSectionAttr(const PragmaClangDataSectionAttr *A) {
    const auto *SA = cast<PragmaClangDataSectionAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitPragmaClangRelroSectionAttr(const PragmaClangRelroSectionAttr *A) {
    const auto *SA = cast<PragmaClangRelroSectionAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitPragmaClangRodataSectionAttr(const PragmaClangRodataSectionAttr *A) {
    const auto *SA = cast<PragmaClangRodataSectionAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitPragmaClangTextSectionAttr(const PragmaClangTextSectionAttr *A) {
    const auto *SA = cast<PragmaClangTextSectionAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitPreferredNameAttr(const PreferredNameAttr *A) {
    const auto *SA = cast<PreferredNameAttr>(A); (void)SA;
    OS << " " << SA->getTypedefType().getAsString();
  }
  void VisitRISCVInterruptAttr(const RISCVInterruptAttr *A) {
    const auto *SA = cast<RISCVInterruptAttr>(A); (void)SA;
    switch(SA->getInterrupt()) {
    case RISCVInterruptAttr::supervisor:
      OS << " supervisor";
      break;
    case RISCVInterruptAttr::machine:
      OS << " machine";
      break;
    }
  }
  void VisitReleaseCapabilityAttr(const ReleaseCapabilityAttr *A) {
    const auto *SA = cast<ReleaseCapabilityAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
  }
  void VisitReleaseHandleAttr(const ReleaseHandleAttr *A) {
    const auto *SA = cast<ReleaseHandleAttr>(A); (void)SA;
    OS << " \"" << SA->getHandleType() << "\"";
  }
  void VisitReqdWorkGroupSizeAttr(const ReqdWorkGroupSizeAttr *A) {
    const auto *SA = cast<ReqdWorkGroupSizeAttr>(A); (void)SA;
    OS << " " << SA->getXDim();
    OS << " " << SA->getYDim();
    OS << " " << SA->getZDim();
  }
  void VisitRequiresCapabilityAttr(const RequiresCapabilityAttr *A) {
    const auto *SA = cast<RequiresCapabilityAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
  }
  void VisitRestrictAttr(const RestrictAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitReturnTypestateAttr(const ReturnTypestateAttr *A) {
    const auto *SA = cast<ReturnTypestateAttr>(A); (void)SA;
    switch(SA->getState()) {
    case ReturnTypestateAttr::Unknown:
      OS << " Unknown";
      break;
    case ReturnTypestateAttr::Consumed:
      OS << " Consumed";
      break;
    case ReturnTypestateAttr::Unconsumed:
      OS << " Unconsumed";
      break;
    }
  }
  void VisitSectionAttr(const SectionAttr *A) {
    const auto *SA = cast<SectionAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitSentinelAttr(const SentinelAttr *A) {
    const auto *SA = cast<SentinelAttr>(A); (void)SA;
    OS << " " << SA->getSentinel();
    OS << " " << SA->getNullPos();
  }
  void VisitSetTypestateAttr(const SetTypestateAttr *A) {
    const auto *SA = cast<SetTypestateAttr>(A); (void)SA;
    switch(SA->getNewState()) {
    case SetTypestateAttr::Unknown:
      OS << " Unknown";
      break;
    case SetTypestateAttr::Consumed:
      OS << " Consumed";
      break;
    case SetTypestateAttr::Unconsumed:
      OS << " Unconsumed";
      break;
    }
  }
  void VisitSuppressAttr(const SuppressAttr *A) {
    const auto *SA = cast<SuppressAttr>(A); (void)SA;
    for (const auto &Val : SA->diagnosticIdentifiers())
      OS << " " << Val;
  }
  void VisitSwiftAsyncAttr(const SwiftAsyncAttr *A) {
    const auto *SA = cast<SwiftAsyncAttr>(A); (void)SA;
    switch(SA->getKind()) {
    case SwiftAsyncAttr::None:
      OS << " None";
      break;
    case SwiftAsyncAttr::SwiftPrivate:
      OS << " SwiftPrivate";
      break;
    case SwiftAsyncAttr::NotSwiftPrivate:
      OS << " NotSwiftPrivate";
      break;
    }
    if (SA->getCompletionHandlerIndex().isValid())
      OS << " " << SA->getCompletionHandlerIndex().getSourceIndex();
  }
  void VisitSwiftAsyncErrorAttr(const SwiftAsyncErrorAttr *A) {
    const auto *SA = cast<SwiftAsyncErrorAttr>(A); (void)SA;
    switch(SA->getConvention()) {
    case SwiftAsyncErrorAttr::None:
      OS << " None";
      break;
    case SwiftAsyncErrorAttr::NonNullError:
      OS << " NonNullError";
      break;
    case SwiftAsyncErrorAttr::ZeroArgument:
      OS << " ZeroArgument";
      break;
    case SwiftAsyncErrorAttr::NonZeroArgument:
      OS << " NonZeroArgument";
      break;
    }
    OS << " " << SA->getHandlerParamIdx();
  }
  void VisitSwiftAsyncNameAttr(const SwiftAsyncNameAttr *A) {
    const auto *SA = cast<SwiftAsyncNameAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitSwiftAttrAttr(const SwiftAttrAttr *A) {
    const auto *SA = cast<SwiftAttrAttr>(A); (void)SA;
    OS << " \"" << SA->getAttribute() << "\"";
  }
  void VisitSwiftBridgeAttr(const SwiftBridgeAttr *A) {
    const auto *SA = cast<SwiftBridgeAttr>(A); (void)SA;
    OS << " \"" << SA->getSwiftType() << "\"";
  }
  void VisitSwiftErrorAttr(const SwiftErrorAttr *A) {
    const auto *SA = cast<SwiftErrorAttr>(A); (void)SA;
    switch(SA->getConvention()) {
    case SwiftErrorAttr::None:
      OS << " None";
      break;
    case SwiftErrorAttr::NonNullError:
      OS << " NonNullError";
      break;
    case SwiftErrorAttr::NullResult:
      OS << " NullResult";
      break;
    case SwiftErrorAttr::ZeroResult:
      OS << " ZeroResult";
      break;
    case SwiftErrorAttr::NonZeroResult:
      OS << " NonZeroResult";
      break;
    }
  }
  void VisitSwiftNameAttr(const SwiftNameAttr *A) {
    const auto *SA = cast<SwiftNameAttr>(A); (void)SA;
    OS << " \"" << SA->getName() << "\"";
  }
  void VisitSwiftNewTypeAttr(const SwiftNewTypeAttr *A) {
    const auto *SA = cast<SwiftNewTypeAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    switch(SA->getNewtypeKind()) {
    case SwiftNewTypeAttr::NK_Struct:
      OS << " NK_Struct";
      break;
    case SwiftNewTypeAttr::NK_Enum:
      OS << " NK_Enum";
      break;
    }
  }
  void VisitTLSModelAttr(const TLSModelAttr *A) {
    const auto *SA = cast<TLSModelAttr>(A); (void)SA;
    OS << " \"" << SA->getModel() << "\"";
  }
  void VisitTargetAttr(const TargetAttr *A) {
    const auto *SA = cast<TargetAttr>(A); (void)SA;
    OS << " \"" << SA->getFeaturesStr() << "\"";
  }
  void VisitTargetClonesAttr(const TargetClonesAttr *A) {
    const auto *SA = cast<TargetClonesAttr>(A); (void)SA;
    for (const auto &Val : SA->featuresStrs())
      OS << " " << Val;
  }
  void VisitTargetVersionAttr(const TargetVersionAttr *A) {
    const auto *SA = cast<TargetVersionAttr>(A); (void)SA;
    OS << " \"" << SA->getNamesStr() << "\"";
  }
  void VisitTestTypestateAttr(const TestTypestateAttr *A) {
    const auto *SA = cast<TestTypestateAttr>(A); (void)SA;
    switch(SA->getTestState()) {
    case TestTypestateAttr::Consumed:
      OS << " Consumed";
      break;
    case TestTypestateAttr::Unconsumed:
      OS << " Unconsumed";
      break;
    }
  }
  void VisitTryAcquireCapabilityAttr(const TryAcquireCapabilityAttr *A) {
    const auto *SA = cast<TryAcquireCapabilityAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
  }
  void VisitTypeTagForDatatypeAttr(const TypeTagForDatatypeAttr *A) {
    const auto *SA = cast<TypeTagForDatatypeAttr>(A); (void)SA;
    if (SA->getArgumentKind())
      OS << " " << SA->getArgumentKind()->getName();
    OS << " " << SA->getMatchingCType().getAsString();
    if (SA->getLayoutCompatible()) OS << " LayoutCompatible";
    if (SA->getMustBeNull()) OS << " MustBeNull";
  }
  void VisitTypeVisibilityAttr(const TypeVisibilityAttr *A) {
    const auto *SA = cast<TypeVisibilityAttr>(A); (void)SA;
    switch(SA->getVisibility()) {
    case TypeVisibilityAttr::Default:
      OS << " Default";
      break;
    case TypeVisibilityAttr::Hidden:
      OS << " Hidden";
      break;
    case TypeVisibilityAttr::Protected:
      OS << " Protected";
      break;
    }
  }
  void VisitUnavailableAttr(const UnavailableAttr *A) {
    const auto *SA = cast<UnavailableAttr>(A); (void)SA;
    OS << " \"" << SA->getMessage() << "\"";
    switch(SA->getImplicitReason()) {
    case UnavailableAttr::IR_None:
      OS << " IR_None";
      break;
    case UnavailableAttr::IR_ARCForbiddenType:
      OS << " IR_ARCForbiddenType";
      break;
    case UnavailableAttr::IR_ForbiddenWeak:
      OS << " IR_ForbiddenWeak";
      break;
    case UnavailableAttr::IR_ARCForbiddenConversion:
      OS << " IR_ARCForbiddenConversion";
      break;
    case UnavailableAttr::IR_ARCInitReturnsUnrelated:
      OS << " IR_ARCInitReturnsUnrelated";
      break;
    case UnavailableAttr::IR_ARCFieldWithOwnership:
      OS << " IR_ARCFieldWithOwnership";
      break;
    }
  }
  void VisitUnusedAttr(const UnusedAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitUseHandleAttr(const UseHandleAttr *A) {
    const auto *SA = cast<UseHandleAttr>(A); (void)SA;
    OS << " \"" << SA->getHandleType() << "\"";
  }
  void VisitUuidAttr(const UuidAttr *A) {
    const auto *SA = cast<UuidAttr>(A); (void)SA;
    OS << " \"" << SA->getGuid() << "\"";
    OS << " ";
    dumpBareDeclRef(SA->getGuidDecl());
  }
  void VisitVecTypeHintAttr(const VecTypeHintAttr *A) {
    const auto *SA = cast<VecTypeHintAttr>(A); (void)SA;
    OS << " " << SA->getTypeHint().getAsString();
  }
  void VisitVisibilityAttr(const VisibilityAttr *A) {
    const auto *SA = cast<VisibilityAttr>(A); (void)SA;
    switch(SA->getVisibility()) {
    case VisibilityAttr::Default:
      OS << " Default";
      break;
    case VisibilityAttr::Hidden:
      OS << " Hidden";
      break;
    case VisibilityAttr::Protected:
      OS << " Protected";
      break;
    }
  }
  void VisitWarnUnusedResultAttr(const WarnUnusedResultAttr *A) {
    const auto *SA = cast<WarnUnusedResultAttr>(A); (void)SA;
    OS << " " << A->getSpelling();
    OS << " \"" << SA->getMessage() << "\"";
  }
  void VisitWeakRefAttr(const WeakRefAttr *A) {
    const auto *SA = cast<WeakRefAttr>(A); (void)SA;
    OS << " \"" << SA->getAliasee() << "\"";
  }
  void VisitWebAssemblyExportNameAttr(const WebAssemblyExportNameAttr *A) {
    const auto *SA = cast<WebAssemblyExportNameAttr>(A); (void)SA;
    OS << " \"" << SA->getExportName() << "\"";
  }
  void VisitWebAssemblyImportModuleAttr(const WebAssemblyImportModuleAttr *A) {
    const auto *SA = cast<WebAssemblyImportModuleAttr>(A); (void)SA;
    OS << " \"" << SA->getImportModule() << "\"";
  }
  void VisitWebAssemblyImportNameAttr(const WebAssemblyImportNameAttr *A) {
    const auto *SA = cast<WebAssemblyImportNameAttr>(A); (void)SA;
    OS << " \"" << SA->getImportName() << "\"";
  }
  void VisitWorkGroupSizeHintAttr(const WorkGroupSizeHintAttr *A) {
    const auto *SA = cast<WorkGroupSizeHintAttr>(A); (void)SA;
    OS << " " << SA->getXDim();
    OS << " " << SA->getYDim();
    OS << " " << SA->getZDim();
  }
  void VisitXRayInstrumentAttr(const XRayInstrumentAttr *A) {
    OS << " " << A->getSpelling();
  }
  void VisitXRayLogArgsAttr(const XRayLogArgsAttr *A) {
    const auto *SA = cast<XRayLogArgsAttr>(A); (void)SA;
    OS << " " << SA->getArgumentCount();
  }
  void VisitZeroCallUsedRegsAttr(const ZeroCallUsedRegsAttr *A) {
    const auto *SA = cast<ZeroCallUsedRegsAttr>(A); (void)SA;
    switch(SA->getZeroCallUsedRegs()) {
    case ZeroCallUsedRegsAttr::Skip:
      OS << " Skip";
      break;
    case ZeroCallUsedRegsAttr::UsedGPRArg:
      OS << " UsedGPRArg";
      break;
    case ZeroCallUsedRegsAttr::UsedGPR:
      OS << " UsedGPR";
      break;
    case ZeroCallUsedRegsAttr::UsedArg:
      OS << " UsedArg";
      break;
    case ZeroCallUsedRegsAttr::Used:
      OS << " Used";
      break;
    case ZeroCallUsedRegsAttr::AllGPRArg:
      OS << " AllGPRArg";
      break;
    case ZeroCallUsedRegsAttr::AllGPR:
      OS << " AllGPR";
      break;
    case ZeroCallUsedRegsAttr::AllArg:
      OS << " AllArg";
      break;
    case ZeroCallUsedRegsAttr::All:
      OS << " All";
      break;
    }
  }
