class AttrSubject; class Decl : AttrSubject { bit Abstract = abstract; string DiagSpelling = diagSpelling; } class DDecl : Decl { Decl Base = base; } class DeclContext {} def TranslationUnit : Decl, DeclContext; def PragmaComment : Decl; def PragmaDetectMismatch : Decl; def ExternCContext : Decl, DeclContext; def Named : Decl<"named declarations", 1>; def Namespace : DDecl, DeclContext; def UsingDirective : DDecl; def NamespaceAlias : DDecl; def Label : DDecl; def Type : DDecl; def TypedefName : DDecl; def Typedef : DDecl; def TypeAlias : DDecl; def ObjCTypeParam : DDecl; def UnresolvedUsingTypename : DDecl; def Tag : DDecl, DeclContext; def Enum : DDecl; def Record : DDecl; def CXXRecord : DDecl; def ClassTemplateSpecialization : DDecl; def ClassTemplatePartialSpecialization : DDecl; def TemplateTypeParm : DDecl; def Value : DDecl; def EnumConstant : DDecl; def UnresolvedUsingValue : DDecl; def IndirectField : DDecl; def Binding : DDecl; def OMPDeclareReduction : DDecl, DeclContext; def Declarator : DDecl; def Field : DDecl; def ObjCIvar : DDecl; def ObjCAtDefsField : DDecl; def MSProperty : DDecl; def Function : DDecl, DeclContext; def CXXDeductionGuide : DDecl; def CXXMethod : DDecl; def CXXConstructor : DDecl; def CXXDestructor : DDecl; def CXXConversion : DDecl; def Var : DDecl; def VarTemplateSpecialization : DDecl; def VarTemplatePartialSpecialization : DDecl; def ImplicitParam : DDecl; def ParmVar : DDecl; def Decomposition : DDecl; def OMPCapturedExpr : DDecl; def NonTypeTemplateParm : DDecl; def Template : DDecl; def RedeclarableTemplate : DDecl; def FunctionTemplate : DDecl; def ClassTemplate : DDecl; def VarTemplate : DDecl; def TypeAliasTemplate : DDecl; def TemplateTemplateParm : DDecl