class AttrSubject; class Decl : AttrSubject { bit Abstract = abstract; } class DDecl : Decl { Decl Base = base; } class DeclContext { } def TranslationUnit : Decl, DeclContext; def Named : Decl<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 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 Declarator : DDecl; def Field : DDecl; def ObjCIvar : DDecl; def ObjCAtDefsField : DDecl; def MSProperty : DDecl; def Function : DDecl, DeclContext; 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 NonTypeTemplateParm : DDecl; def Template : DDecl; def RedeclarableTemplate : DDecl; def FunctionTemplate : DDecl; def ClassTemplate : DDecl; def VarTemplate : DDecl; def TypeAliasTemplate : DDecl; def TemplateTemplateParm : DDecl