Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/clang/AST/AbstractBasicReader.inc is written in an unsupported language. File is not indexed.

0001 /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
0002 |*                                                                            *|
0003 |* Helper classes for BasicReaders                                            *|
0004 |*                                                                            *|
0005 |* Automatically generated file, do not edit!                                 *|
0006 |* From: PropertiesBase.td                                                    *|
0007 |*                                                                            *|
0008 \*===----------------------------------------------------------------------===*/
0009 
0010 template <class ValueType>
0011 struct ReadDispatcher;
0012 template <>
0013 struct ReadDispatcher<llvm::APInt> {
0014   template <class BasicReader, class... Args>
0015   static llvm::APInt read(BasicReader &R, Args &&... args) {
0016     return R.readAPInt(std::forward<Args>(args)...);
0017   }
0018 };
0019 template <>
0020 struct ReadDispatcher<llvm::APSInt> {
0021   template <class BasicReader, class... Args>
0022   static llvm::APSInt read(BasicReader &R, Args &&... args) {
0023     return R.readAPSInt(std::forward<Args>(args)...);
0024   }
0025 };
0026 template <>
0027 struct ReadDispatcher<APValue> {
0028   template <class BasicReader, class... Args>
0029   static APValue read(BasicReader &R, Args &&... args) {
0030     return R.readAPValue(std::forward<Args>(args)...);
0031   }
0032 };
0033 template <>
0034 struct ReadDispatcher<APValue::ValueKind> {
0035   template <class BasicReader, class... Args>
0036   static APValue::ValueKind read(BasicReader &R, Args &&... args) {
0037     return R.readAPValueKind(std::forward<Args>(args)...);
0038   }
0039 };
0040 template <>
0041 struct ReadDispatcher<ArraySizeModifier> {
0042   template <class BasicReader, class... Args>
0043   static ArraySizeModifier read(BasicReader &R, Args &&... args) {
0044     return R.readArraySizeModifier(std::forward<Args>(args)...);
0045   }
0046 };
0047 template <>
0048 struct ReadDispatcher<const Attr *> {
0049   template <class BasicReader, class... Args>
0050   static const Attr * read(BasicReader &R, Args &&... args) {
0051     return R.readAttr(std::forward<Args>(args)...);
0052   }
0053 };
0054 template <>
0055 struct ReadDispatcher<attr::Kind> {
0056   template <class BasicReader, class... Args>
0057   static attr::Kind read(BasicReader &R, Args &&... args) {
0058     return R.readAttrKind(std::forward<Args>(args)...);
0059   }
0060 };
0061 template <>
0062 struct ReadDispatcher<AutoTypeKeyword> {
0063   template <class BasicReader, class... Args>
0064   static AutoTypeKeyword read(BasicReader &R, Args &&... args) {
0065     return R.readAutoTypeKeyword(std::forward<Args>(args)...);
0066   }
0067 };
0068 template <>
0069 struct ReadDispatcher<const BTFTypeTagAttr *> {
0070   template <class BasicReader, class... Args>
0071   static const BTFTypeTagAttr * read(BasicReader &R, Args &&... args) {
0072     return R.readBTFTypeTagAttr(std::forward<Args>(args)...);
0073   }
0074 };
0075 template <>
0076 struct ReadDispatcher<bool> {
0077   template <class BasicReader, class... Args>
0078   static bool read(BasicReader &R, Args &&... args) {
0079     return R.readBool(std::forward<Args>(args)...);
0080   }
0081 };
0082 template <>
0083 struct ReadDispatcher<BuiltinType::Kind> {
0084   template <class BasicReader, class... Args>
0085   static BuiltinType::Kind read(BasicReader &R, Args &&... args) {
0086     return R.readBuiltinTypeKind(std::forward<Args>(args)...);
0087   }
0088 };
0089 template <>
0090 struct ReadDispatcher<CXXRecordDecl*> {
0091   template <class BasicReader, class... Args>
0092   static CXXRecordDecl* read(BasicReader &R, Args &&... args) {
0093     return R.readCXXRecordDeclRef(std::forward<Args>(args)...);
0094   }
0095 };
0096 template <>
0097 struct ReadDispatcher<CallingConv> {
0098   template <class BasicReader, class... Args>
0099   static CallingConv read(BasicReader &R, Args &&... args) {
0100     return R.readCallingConv(std::forward<Args>(args)...);
0101   }
0102 };
0103 template <>
0104 struct ReadDispatcher<ConceptDecl*> {
0105   template <class BasicReader, class... Args>
0106   static ConceptDecl* read(BasicReader &R, Args &&... args) {
0107     return R.readConceptDeclRef(std::forward<Args>(args)...);
0108   }
0109 };
0110 template <>
0111 struct ReadDispatcher<Decl*> {
0112   template <class BasicReader, class... Args>
0113   static Decl* read(BasicReader &R, Args &&... args) {
0114     return R.readDeclRef(std::forward<Args>(args)...);
0115   }
0116 };
0117 template <>
0118 struct ReadDispatcher<DeclarationName> {
0119   template <class BasicReader, class... Args>
0120   static DeclarationName read(BasicReader &R, Args &&... args) {
0121     return R.readDeclarationName(std::forward<Args>(args)...);
0122   }
0123 };
0124 template <>
0125 struct ReadDispatcher<DeclarationName::NameKind> {
0126   template <class BasicReader, class... Args>
0127   static DeclarationName::NameKind read(BasicReader &R, Args &&... args) {
0128     return R.readDeclarationNameKind(std::forward<Args>(args)...);
0129   }
0130 };
0131 template <>
0132 struct ReadDispatcher<EffectConditionExpr> {
0133   template <class BasicReader, class... Args>
0134   static EffectConditionExpr read(BasicReader &R, Args &&... args) {
0135     return R.readEffectConditionExpr(std::forward<Args>(args)...);
0136   }
0137 };
0138 template <>
0139 struct ReadDispatcher<ElaboratedTypeKeyword> {
0140   template <class BasicReader, class... Args>
0141   static ElaboratedTypeKeyword read(BasicReader &R, Args &&... args) {
0142     return R.readElaboratedTypeKeyword(std::forward<Args>(args)...);
0143   }
0144 };
0145 template <>
0146 struct ReadDispatcher<FunctionProtoType::ExceptionSpecInfo> {
0147   template <class BasicReader, class... Args>
0148   static FunctionProtoType::ExceptionSpecInfo read(BasicReader &R, Args &&... args) {
0149     return R.readExceptionSpecInfo(std::forward<Args>(args)...);
0150   }
0151 };
0152 template <>
0153 struct ReadDispatcher<Expr*> {
0154   template <class BasicReader, class... Args>
0155   static Expr* read(BasicReader &R, Args &&... args) {
0156     return R.readExprRef(std::forward<Args>(args)...);
0157   }
0158 };
0159 template <>
0160 struct ReadDispatcher<FunctionProtoType::ExtParameterInfo> {
0161   template <class BasicReader, class... Args>
0162   static FunctionProtoType::ExtParameterInfo read(BasicReader &R, Args &&... args) {
0163     return R.readExtParameterInfo(std::forward<Args>(args)...);
0164   }
0165 };
0166 template <>
0167 struct ReadDispatcher<llvm::FixedPointSemantics> {
0168   template <class BasicReader, class... Args>
0169   static llvm::FixedPointSemantics read(BasicReader &R, Args &&... args) {
0170     return R.readFixedPointSemantics(std::forward<Args>(args)...);
0171   }
0172 };
0173 template <>
0174 struct ReadDispatcher<FunctionDecl*> {
0175   template <class BasicReader, class... Args>
0176   static FunctionDecl* read(BasicReader &R, Args &&... args) {
0177     return R.readFunctionDeclRef(std::forward<Args>(args)...);
0178   }
0179 };
0180 template <>
0181 struct ReadDispatcher<FunctionEffect> {
0182   template <class BasicReader, class... Args>
0183   static FunctionEffect read(BasicReader &R, Args &&... args) {
0184     return R.readFunctionEffect(std::forward<Args>(args)...);
0185   }
0186 };
0187 template <>
0188 struct ReadDispatcher<IdentifierInfo*> {
0189   template <class BasicReader, class... Args>
0190   static IdentifierInfo* read(BasicReader &R, Args &&... args) {
0191     return R.readIdentifier(std::forward<Args>(args)...);
0192   }
0193 };
0194 template <>
0195 struct ReadDispatcher<APValue::LValuePathEntry> {
0196   template <class BasicReader, class... Args>
0197   static APValue::LValuePathEntry read(BasicReader &R, Args &&... args) {
0198     return R.readLValuePathEntry(std::forward<Args>(args)...);
0199   }
0200 };
0201 template <>
0202 struct ReadDispatcher<APValue::LValuePathSerializationHelper> {
0203   template <class BasicReader, class... Args>
0204   static APValue::LValuePathSerializationHelper read(BasicReader &R, Args &&... args) {
0205     return R.readLValuePathSerializationHelper(std::forward<Args>(args)...);
0206   }
0207 };
0208 template <>
0209 struct ReadDispatcher<NamedDecl*> {
0210   template <class BasicReader, class... Args>
0211   static NamedDecl* read(BasicReader &R, Args &&... args) {
0212     return R.readNamedDeclRef(std::forward<Args>(args)...);
0213   }
0214 };
0215 template <>
0216 struct ReadDispatcher<NamespaceAliasDecl*> {
0217   template <class BasicReader, class... Args>
0218   static NamespaceAliasDecl* read(BasicReader &R, Args &&... args) {
0219     return R.readNamespaceAliasDeclRef(std::forward<Args>(args)...);
0220   }
0221 };
0222 template <>
0223 struct ReadDispatcher<NamespaceDecl*> {
0224   template <class BasicReader, class... Args>
0225   static NamespaceDecl* read(BasicReader &R, Args &&... args) {
0226     return R.readNamespaceDeclRef(std::forward<Args>(args)...);
0227   }
0228 };
0229 template <>
0230 struct ReadDispatcher<NestedNameSpecifier *> {
0231   template <class BasicReader, class... Args>
0232   static NestedNameSpecifier * read(BasicReader &R, Args &&... args) {
0233     return R.readNestedNameSpecifier(std::forward<Args>(args)...);
0234   }
0235 };
0236 template <>
0237 struct ReadDispatcher<NestedNameSpecifier::SpecifierKind> {
0238   template <class BasicReader, class... Args>
0239   static NestedNameSpecifier::SpecifierKind read(BasicReader &R, Args &&... args) {
0240     return R.readNestedNameSpecifierKind(std::forward<Args>(args)...);
0241   }
0242 };
0243 template <>
0244 struct ReadDispatcher<ObjCProtocolDecl*> {
0245   template <class BasicReader, class... Args>
0246   static ObjCProtocolDecl* read(BasicReader &R, Args &&... args) {
0247     return R.readObjCProtocolDeclRef(std::forward<Args>(args)...);
0248   }
0249 };
0250 template <>
0251 struct ReadDispatcher<ObjCTypeParamDecl*> {
0252   template <class BasicReader, class... Args>
0253   static ObjCTypeParamDecl* read(BasicReader &R, Args &&... args) {
0254     return R.readObjCTypeParamDeclRef(std::forward<Args>(args)...);
0255   }
0256 };
0257 template <>
0258 struct ReadDispatcher<OverloadedOperatorKind> {
0259   template <class BasicReader, class... Args>
0260   static OverloadedOperatorKind read(BasicReader &R, Args &&... args) {
0261     return R.readOverloadedOperatorKind(std::forward<Args>(args)...);
0262   }
0263 };
0264 template <>
0265 struct ReadDispatcher<QualType> {
0266   template <class BasicReader, class... Args>
0267   static QualType read(BasicReader &R, Args &&... args) {
0268     return R.readQualType(std::forward<Args>(args)...);
0269   }
0270 };
0271 template <>
0272 struct ReadDispatcher<Qualifiers> {
0273   template <class BasicReader, class... Args>
0274   static Qualifiers read(BasicReader &R, Args &&... args) {
0275     return R.readQualifiers(std::forward<Args>(args)...);
0276   }
0277 };
0278 template <>
0279 struct ReadDispatcher<RefQualifierKind> {
0280   template <class BasicReader, class... Args>
0281   static RefQualifierKind read(BasicReader &R, Args &&... args) {
0282     return R.readRefQualifierKind(std::forward<Args>(args)...);
0283   }
0284 };
0285 template <>
0286 struct ReadDispatcher<Selector> {
0287   template <class BasicReader, class... Args>
0288   static Selector read(BasicReader &R, Args &&... args) {
0289     return R.readSelector(std::forward<Args>(args)...);
0290   }
0291 };
0292 template <>
0293 struct ReadDispatcher<SourceLocation> {
0294   template <class BasicReader, class... Args>
0295   static SourceLocation read(BasicReader &R, Args &&... args) {
0296     return R.readSourceLocation(std::forward<Args>(args)...);
0297   }
0298 };
0299 template <>
0300 struct ReadDispatcher<Stmt*> {
0301   template <class BasicReader, class... Args>
0302   static Stmt* read(BasicReader &R, Args &&... args) {
0303     return R.readStmtRef(std::forward<Args>(args)...);
0304   }
0305 };
0306 template <>
0307 struct ReadDispatcher<SubstTemplateTypeParmTypeFlag> {
0308   template <class BasicReader, class... Args>
0309   static SubstTemplateTypeParmTypeFlag read(BasicReader &R, Args &&... args) {
0310     return R.readSubstTemplateTypeParmTypeFlag(std::forward<Args>(args)...);
0311   }
0312 };
0313 template <>
0314 struct ReadDispatcher<TagDecl*> {
0315   template <class BasicReader, class... Args>
0316   static TagDecl* read(BasicReader &R, Args &&... args) {
0317     return R.readTagDeclRef(std::forward<Args>(args)...);
0318   }
0319 };
0320 template <>
0321 struct ReadDispatcher<TemplateArgument> {
0322   template <class BasicReader, class... Args>
0323   static TemplateArgument read(BasicReader &R, Args &&... args) {
0324     return R.readTemplateArgument(std::forward<Args>(args)...);
0325   }
0326 };
0327 template <>
0328 struct ReadDispatcher<TemplateArgument::ArgKind> {
0329   template <class BasicReader, class... Args>
0330   static TemplateArgument::ArgKind read(BasicReader &R, Args &&... args) {
0331     return R.readTemplateArgumentKind(std::forward<Args>(args)...);
0332   }
0333 };
0334 template <>
0335 struct ReadDispatcher<TemplateDecl*> {
0336   template <class BasicReader, class... Args>
0337   static TemplateDecl* read(BasicReader &R, Args &&... args) {
0338     return R.readTemplateDeclRef(std::forward<Args>(args)...);
0339   }
0340 };
0341 template <>
0342 struct ReadDispatcher<TemplateName> {
0343   template <class BasicReader, class... Args>
0344   static TemplateName read(BasicReader &R, Args &&... args) {
0345     return R.readTemplateName(std::forward<Args>(args)...);
0346   }
0347 };
0348 template <>
0349 struct ReadDispatcher<TemplateName::NameKind> {
0350   template <class BasicReader, class... Args>
0351   static TemplateName::NameKind read(BasicReader &R, Args &&... args) {
0352     return R.readTemplateNameKind(std::forward<Args>(args)...);
0353   }
0354 };
0355 template <>
0356 struct ReadDispatcher<TemplateTemplateParmDecl*> {
0357   template <class BasicReader, class... Args>
0358   static TemplateTemplateParmDecl* read(BasicReader &R, Args &&... args) {
0359     return R.readTemplateTemplateParmDeclRef(std::forward<Args>(args)...);
0360   }
0361 };
0362 template <>
0363 struct ReadDispatcher<TemplateTypeParmDecl*> {
0364   template <class BasicReader, class... Args>
0365   static TemplateTypeParmDecl* read(BasicReader &R, Args &&... args) {
0366     return R.readTemplateTypeParmDeclRef(std::forward<Args>(args)...);
0367   }
0368 };
0369 template <>
0370 struct ReadDispatcher<TypeCoupledDeclRefInfo> {
0371   template <class BasicReader, class... Args>
0372   static TypeCoupledDeclRefInfo read(BasicReader &R, Args &&... args) {
0373     return R.readTypeCoupledDeclRefInfo(std::forward<Args>(args)...);
0374   }
0375 };
0376 template <>
0377 struct ReadDispatcher<TypeOfKind> {
0378   template <class BasicReader, class... Args>
0379   static TypeOfKind read(BasicReader &R, Args &&... args) {
0380     return R.readTypeOfKind(std::forward<Args>(args)...);
0381   }
0382 };
0383 template <>
0384 struct ReadDispatcher<uint32_t> {
0385   template <class BasicReader, class... Args>
0386   static uint32_t read(BasicReader &R, Args &&... args) {
0387     return R.readUInt32(std::forward<Args>(args)...);
0388   }
0389 };
0390 template <>
0391 struct ReadDispatcher<uint64_t> {
0392   template <class BasicReader, class... Args>
0393   static uint64_t read(BasicReader &R, Args &&... args) {
0394     return R.readUInt64(std::forward<Args>(args)...);
0395   }
0396 };
0397 template <>
0398 struct ReadDispatcher<UnaryTransformType::UTTKind> {
0399   template <class BasicReader, class... Args>
0400   static UnaryTransformType::UTTKind read(BasicReader &R, Args &&... args) {
0401     return R.readUnaryTypeTransformKind(std::forward<Args>(args)...);
0402   }
0403 };
0404 template <>
0405 struct ReadDispatcher<UsingShadowDecl*> {
0406   template <class BasicReader, class... Args>
0407   static UsingShadowDecl* read(BasicReader &R, Args &&... args) {
0408     return R.readUsingShadowDeclRef(std::forward<Args>(args)...);
0409   }
0410 };
0411 template <>
0412 struct ReadDispatcher<ValueDecl*> {
0413   template <class BasicReader, class... Args>
0414   static ValueDecl* read(BasicReader &R, Args &&... args) {
0415     return R.readValueDeclRef(std::forward<Args>(args)...);
0416   }
0417 };
0418 template <>
0419 struct ReadDispatcher<VectorKind> {
0420   template <class BasicReader, class... Args>
0421   static VectorKind read(BasicReader &R, Args &&... args) {
0422     return R.readVectorKind(std::forward<Args>(args)...);
0423   }
0424 };
0425 template <class T>
0426 struct ReadDispatcher<llvm::ArrayRef<T>> {
0427   template <class BasicReader, class... Args>
0428   static llvm::ArrayRef<T> read(BasicReader &R, Args &&... args) {
0429     return R.readArray(std::forward<Args>(args)...);
0430   }
0431 };
0432 template <class T>
0433 struct ReadDispatcher<std::optional<T>> {
0434   template <class BasicReader, class... Args>
0435   static std::optional<T> read(BasicReader &R, Args &&... args) {
0436     return R.readOptional(std::forward<Args>(args)...);
0437   }
0438 };
0439 
0440 template <class ValueType>
0441 struct UnpackOptionalValue;
0442 template <>
0443 struct UnpackOptionalValue<CXXRecordDecl*> {
0444   static std::optional<CXXRecordDecl*> unpack(CXXRecordDecl* value) {
0445     return value ? std::optional<CXXRecordDecl*>(value) : std::nullopt;
0446   }
0447 };
0448 template <>
0449 struct UnpackOptionalValue<ConceptDecl*> {
0450   static std::optional<ConceptDecl*> unpack(ConceptDecl* value) {
0451     return value ? std::optional<ConceptDecl*>(value) : std::nullopt;
0452   }
0453 };
0454 template <>
0455 struct UnpackOptionalValue<Decl*> {
0456   static std::optional<Decl*> unpack(Decl* value) {
0457     return value ? std::optional<Decl*>(value) : std::nullopt;
0458   }
0459 };
0460 template <>
0461 struct UnpackOptionalValue<Expr*> {
0462   static std::optional<Expr*> unpack(Expr* value) {
0463     return value ? std::optional<Expr*>(value) : std::nullopt;
0464   }
0465 };
0466 template <>
0467 struct UnpackOptionalValue<FunctionDecl*> {
0468   static std::optional<FunctionDecl*> unpack(FunctionDecl* value) {
0469     return value ? std::optional<FunctionDecl*>(value) : std::nullopt;
0470   }
0471 };
0472 template <>
0473 struct UnpackOptionalValue<IdentifierInfo*> {
0474   static std::optional<IdentifierInfo*> unpack(IdentifierInfo* value) {
0475     return value ? std::optional<IdentifierInfo*>(value) : std::nullopt;
0476   }
0477 };
0478 template <>
0479 struct UnpackOptionalValue<NamedDecl*> {
0480   static std::optional<NamedDecl*> unpack(NamedDecl* value) {
0481     return value ? std::optional<NamedDecl*>(value) : std::nullopt;
0482   }
0483 };
0484 template <>
0485 struct UnpackOptionalValue<NamespaceAliasDecl*> {
0486   static std::optional<NamespaceAliasDecl*> unpack(NamespaceAliasDecl* value) {
0487     return value ? std::optional<NamespaceAliasDecl*>(value) : std::nullopt;
0488   }
0489 };
0490 template <>
0491 struct UnpackOptionalValue<NamespaceDecl*> {
0492   static std::optional<NamespaceDecl*> unpack(NamespaceDecl* value) {
0493     return value ? std::optional<NamespaceDecl*>(value) : std::nullopt;
0494   }
0495 };
0496 template <>
0497 struct UnpackOptionalValue<ObjCProtocolDecl*> {
0498   static std::optional<ObjCProtocolDecl*> unpack(ObjCProtocolDecl* value) {
0499     return value ? std::optional<ObjCProtocolDecl*>(value) : std::nullopt;
0500   }
0501 };
0502 template <>
0503 struct UnpackOptionalValue<ObjCTypeParamDecl*> {
0504   static std::optional<ObjCTypeParamDecl*> unpack(ObjCTypeParamDecl* value) {
0505     return value ? std::optional<ObjCTypeParamDecl*>(value) : std::nullopt;
0506   }
0507 };
0508 template <>
0509 struct UnpackOptionalValue<QualType> {
0510   static std::optional<QualType> unpack(QualType value) {
0511     return value.isNull() ? std::nullopt : std::optional<QualType>(value);
0512   }
0513 };
0514 template <>
0515 struct UnpackOptionalValue<Stmt*> {
0516   static std::optional<Stmt*> unpack(Stmt* value) {
0517     return value ? std::optional<Stmt*>(value) : std::nullopt;
0518   }
0519 };
0520 template <>
0521 struct UnpackOptionalValue<TagDecl*> {
0522   static std::optional<TagDecl*> unpack(TagDecl* value) {
0523     return value ? std::optional<TagDecl*>(value) : std::nullopt;
0524   }
0525 };
0526 template <>
0527 struct UnpackOptionalValue<TemplateDecl*> {
0528   static std::optional<TemplateDecl*> unpack(TemplateDecl* value) {
0529     return value ? std::optional<TemplateDecl*>(value) : std::nullopt;
0530   }
0531 };
0532 template <>
0533 struct UnpackOptionalValue<TemplateName> {
0534   static std::optional<TemplateName> unpack(TemplateName value) {
0535     return value.isNull() ? std::nullopt : std::optional<TemplateName>(value);
0536   }
0537 };
0538 template <>
0539 struct UnpackOptionalValue<TemplateTemplateParmDecl*> {
0540   static std::optional<TemplateTemplateParmDecl*> unpack(TemplateTemplateParmDecl* value) {
0541     return value ? std::optional<TemplateTemplateParmDecl*>(value) : std::nullopt;
0542   }
0543 };
0544 template <>
0545 struct UnpackOptionalValue<TemplateTypeParmDecl*> {
0546   static std::optional<TemplateTypeParmDecl*> unpack(TemplateTypeParmDecl* value) {
0547     return value ? std::optional<TemplateTypeParmDecl*>(value) : std::nullopt;
0548   }
0549 };
0550 template <>
0551 struct UnpackOptionalValue<uint32_t> {
0552   static std::optional<uint32_t> unpack(uint32_t value) {
0553     return value ? std::optional<uint32_t>(value - 1) : std::nullopt;
0554   }
0555 };
0556 template <>
0557 struct UnpackOptionalValue<uint64_t> {
0558   static std::optional<uint64_t> unpack(uint64_t value) {
0559     return value ? std::optional<uint64_t>(value - 1) : std::nullopt;
0560   }
0561 };
0562 template <>
0563 struct UnpackOptionalValue<UsingShadowDecl*> {
0564   static std::optional<UsingShadowDecl*> unpack(UsingShadowDecl* value) {
0565     return value ? std::optional<UsingShadowDecl*>(value) : std::nullopt;
0566   }
0567 };
0568 template <>
0569 struct UnpackOptionalValue<ValueDecl*> {
0570   static std::optional<ValueDecl*> unpack(ValueDecl* value) {
0571     return value ? std::optional<ValueDecl*>(value) : std::nullopt;
0572   }
0573 };
0574 
0575 template <class Impl>
0576 class BasicReaderBase {
0577   ASTContext &C;
0578 protected:
0579   BasicReaderBase(ASTContext &ctx) : C(ctx) {}
0580 public:
0581   ASTContext &getASTContext() { return C; }
0582   Impl &asImpl() { return static_cast<Impl&>(*this); }
0583   APValue readAPValue() {
0584     auto &ctx = asImpl().getASTContext();
0585     auto &&subR = asImpl().readObject();
0586     APValue::ValueKind kind = subR.find("kind").readAPValueKind();
0587     switch (kind) {
0588     case APValue::None: {
0589      return APValue(); 
0590     }
0591 
0592     case APValue::Indeterminate: {
0593      return APValue::IndeterminateValue(); 
0594     }
0595 
0596     case APValue::Int: {
0597     llvm::APSInt value = subR.find("value").readAPSInt();
0598      return APValue(value); 
0599     }
0600 
0601     case APValue::Float: {
0602     uint32_t semantics = subR.find("semantics").readUInt32();
0603     llvm::APInt value = subR.find("value").readAPInt();
0604     
0605     const llvm::fltSemantics &floatSema = llvm::APFloatBase::EnumToSemantics(
0606         static_cast<llvm::APFloatBase::Semantics>(semantics));
0607     return APValue(llvm::APFloat(floatSema, value));
0608   
0609     }
0610 
0611     case APValue::FixedPoint: {
0612     llvm::FixedPointSemantics semantics = subR.find("semantics").readFixedPointSemantics();
0613     llvm::APSInt value = subR.find("value").readAPSInt();
0614     
0615     return APValue(llvm::APFixedPoint(std::move(value), semantics));
0616   
0617     }
0618 
0619     case APValue::ComplexInt: {
0620     llvm::APSInt real = subR.find("real").readAPSInt();
0621     llvm::APSInt imag = subR.find("imag").readAPSInt();
0622      return APValue(real, imag); 
0623     }
0624 
0625     case APValue::ComplexFloat: {
0626     uint32_t semantics = subR.find("semantics").readUInt32();
0627     llvm::APInt real = subR.find("real").readAPInt();
0628     llvm::APInt imag = subR.find("imag").readAPInt();
0629     
0630     const llvm::fltSemantics &sema = llvm::APFloatBase::EnumToSemantics(
0631         static_cast<llvm::APFloatBase::Semantics>(semantics));
0632     return APValue(llvm::APFloat(sema, real),
0633                    llvm::APFloat(sema, imag));
0634   
0635     }
0636 
0637     case APValue::Vector: {
0638     llvm::SmallVector<APValue, 8> elements_buffer_0;
0639     llvm::ArrayRef<APValue> elements = subR.find("elements").template readArray<APValue>(elements_buffer_0);
0640     
0641     APValue result;
0642     result.MakeVector();
0643     unsigned length = elements.size();
0644     (void)result.setVectorUninit(length);
0645     for (unsigned i = 0; i < length; i++)
0646       result.getVectorElt(i) = elements[i];
0647     return result;
0648   
0649     }
0650 
0651     case APValue::Array: {
0652     uint32_t totalLength = subR.find("totalLength").readUInt32();
0653     bool hasFiller = subR.find("hasFiller").readBool();
0654     llvm::SmallVector<APValue, 8> elements_buffer_0;
0655     llvm::ArrayRef<APValue> elements = subR.find("elements").template readArray<APValue>(elements_buffer_0);
0656     
0657     APValue result;
0658     unsigned initLength = elements.size() - (hasFiller ? 1 : 0);
0659     result.MakeArray(initLength, totalLength);
0660     for (unsigned i = 0; i < initLength; ++i)
0661       result.getArrayInitializedElt(i) = elements[i];
0662     if (hasFiller)
0663       result.getArrayFiller() = elements.back();
0664     return result;
0665   
0666     }
0667 
0668     case APValue::Struct: {
0669     llvm::SmallVector<APValue, 8> bases_buffer_0;
0670     llvm::ArrayRef<APValue> bases = subR.find("bases").template readArray<APValue>(bases_buffer_0);
0671     llvm::SmallVector<APValue, 8> fields_buffer_0;
0672     llvm::ArrayRef<APValue> fields = subR.find("fields").template readArray<APValue>(fields_buffer_0);
0673     
0674     APValue result;
0675     result.MakeStruct(bases.size(), fields.size());
0676     for (unsigned i = 0; i < bases.size(); ++i)
0677       result.getStructBase(i) = bases[i];
0678     for (unsigned i = 0; i < fields.size(); ++i)
0679       result.getStructField(i) = fields[i];
0680     return result;
0681   
0682     }
0683 
0684     case APValue::Union: {
0685     Decl* fieldDecl = subR.find("fieldDecl").readDeclRef();
0686     APValue value = subR.find("value").readAPValue();
0687     
0688     return APValue(cast<clang::FieldDecl>(fieldDecl), std::move(value));
0689   
0690     }
0691 
0692     case APValue::AddrLabelDiff: {
0693     Stmt* lhs = subR.find("lhs").readStmtRef();
0694     Stmt* rhs = subR.find("rhs").readStmtRef();
0695     
0696     return APValue(cast<AddrLabelExpr>(lhs), cast<AddrLabelExpr>(rhs));
0697   
0698     }
0699 
0700     case APValue::MemberPointer: {
0701     bool isDerived = subR.find("isDerived").readBool();
0702     ValueDecl* member = subR.find("member").readValueDeclRef();
0703     llvm::SmallVector<CXXRecordDecl*, 8> memberPath_buffer_0;
0704     llvm::ArrayRef<CXXRecordDecl*> memberPath = subR.find("memberPath").template readArray<CXXRecordDecl*>(memberPath_buffer_0);
0705     
0706     APValue result;
0707     unsigned pathSize = memberPath.size();
0708     const CXXRecordDecl **pathArray =
0709         result.setMemberPointerUninit(member, isDerived, pathSize).data();
0710     for (unsigned i = 0; i < pathSize; ++i)
0711       pathArray[i] = memberPath[i]->getCanonicalDecl();
0712     return result;
0713   
0714     }
0715 
0716     case APValue::LValue: {
0717     bool hasLValuePath = subR.find("hasLValuePath").readBool();
0718     bool isLValueOnePastTheEnd = subR.find("isLValueOnePastTheEnd").readBool();
0719     bool isExpr = subR.find("isExpr").readBool();
0720     bool isTypeInfo = subR.find("isTypeInfo").readBool();
0721     bool isDynamicAlloc = subR.find("isDynamicAlloc").readBool();
0722     bool hasBase = subR.find("hasBase").readBool();
0723     bool isNullPtr = subR.find("isNullPtr").readBool();
0724     std::optional<QualType> typeInfo;
0725     if ( hasBase && isTypeInfo ) {
0726       typeInfo.emplace(subR.find("typeInfo").readQualType());
0727     }
0728     std::optional<uint32_t> dynamicAlloc;
0729     if ( hasBase && isDynamicAlloc ) {
0730       dynamicAlloc.emplace(subR.find("dynamicAlloc").readUInt32());
0731     }
0732     std::optional<QualType> type;
0733     if ( hasBase && (isTypeInfo || isDynamicAlloc) ) {
0734       type.emplace(subR.find("type").readQualType());
0735     }
0736     std::optional<uint32_t> callIndex;
0737     if ( hasBase && !isTypeInfo ) {
0738       callIndex.emplace(subR.find("callIndex").readUInt32());
0739     }
0740     std::optional<uint32_t> version;
0741     if ( hasBase && !isTypeInfo ) {
0742       version.emplace(subR.find("version").readUInt32());
0743     }
0744     std::optional<Stmt*> stmt;
0745     if ( hasBase && !isTypeInfo && isExpr ) {
0746       stmt.emplace(subR.find("stmt").readStmtRef());
0747     }
0748     std::optional<Decl*> decl;
0749     if ( hasBase && !isTypeInfo && !isDynamicAlloc && !isExpr ) {
0750       decl.emplace(subR.find("decl").readDeclRef());
0751     }
0752     uint32_t offsetQuantity = subR.find("offsetQuantity").readUInt32();
0753     llvm::SmallVector<APValue::LValuePathEntry, 8> lvaluePath_buffer_0;
0754     std::optional<APValue::LValuePathSerializationHelper> lvaluePath;
0755     if ( hasLValuePath ) {
0756       lvaluePath.emplace(subR.find("lvaluePath").readLValuePathSerializationHelper(lvaluePath_buffer_0));
0757     }
0758     
0759     (void)ctx;
0760     APValue::LValueBase base;
0761     if (hasBase) {
0762       if (isTypeInfo) {
0763         base = APValue::LValueBase::getTypeInfo(
0764             TypeInfoLValue(typeInfo->getTypePtr()), *type);
0765       } else if (isDynamicAlloc) {
0766         base = APValue::LValueBase::getDynamicAlloc(
0767             DynamicAllocLValue(*dynamicAlloc), *type);
0768       } else if (isExpr) {
0769         base = APValue::LValueBase(cast<Expr>(*stmt),
0770                                    *callIndex, *version);
0771       } else {
0772         base = APValue::LValueBase(cast<ValueDecl>(*decl),
0773                                    *callIndex, *version);
0774       }
0775     }
0776     CharUnits offset = CharUnits::fromQuantity(offsetQuantity);
0777     APValue result;
0778     result.MakeLValue();
0779     if (!hasLValuePath) {
0780       result.setLValue(base, offset, APValue::NoLValuePath{}, isNullPtr);
0781       return result;
0782     }
0783     auto pathLength = lvaluePath->Path.size();
0784     APValue::LValuePathEntry *path = result.setLValueUninit(
0785         base, offset, pathLength, isLValueOnePastTheEnd, isNullPtr).data();
0786     llvm::copy(lvaluePath->Path, path);
0787     return result;
0788   
0789     }
0790 
0791     }
0792     llvm_unreachable("bad APValue::ValueKind");
0793   }
0794   APValue::ValueKind readAPValueKind() {
0795     return asImpl().template readEnum<APValue::ValueKind>();
0796   }
0797   ArraySizeModifier readArraySizeModifier() {
0798     return asImpl().template readEnum<ArraySizeModifier>();
0799   }
0800   attr::Kind readAttrKind() {
0801     return asImpl().template readEnum<attr::Kind>();
0802   }
0803   AutoTypeKeyword readAutoTypeKeyword() {
0804     return asImpl().template readEnum<AutoTypeKeyword>();
0805   }
0806   BuiltinType::Kind readBuiltinTypeKind() {
0807     return asImpl().template readEnum<BuiltinType::Kind>();
0808   }
0809   CXXRecordDecl* readCXXRecordDeclRef() {
0810     return cast_or_null<CXXRecordDecl>(asImpl().readDeclRef());
0811   }
0812   CallingConv readCallingConv() {
0813     return asImpl().template readEnum<CallingConv>();
0814   }
0815   ConceptDecl* readConceptDeclRef() {
0816     return cast_or_null<ConceptDecl>(asImpl().readDeclRef());
0817   }
0818   DeclarationName readDeclarationName() {
0819     auto &ctx = asImpl().getASTContext();
0820     auto &&subR = asImpl().readObject();
0821     DeclarationName::NameKind kind = subR.find("kind").readDeclarationNameKind();
0822     switch (kind) {
0823     case DeclarationName::Identifier: {
0824     IdentifierInfo* identifier = subR.find("identifier").readIdentifier();
0825     
0826     return DeclarationName(identifier);
0827   
0828     }
0829 
0830     case DeclarationName::ObjCZeroArgSelector: {
0831     Selector selector = subR.find("selector").readSelector();
0832     
0833       return DeclarationName(selector);
0834     
0835     }
0836 
0837     case DeclarationName::ObjCOneArgSelector: {
0838     Selector selector = subR.find("selector").readSelector();
0839     
0840       return DeclarationName(selector);
0841     
0842     }
0843 
0844     case DeclarationName::ObjCMultiArgSelector: {
0845     Selector selector = subR.find("selector").readSelector();
0846     
0847       return DeclarationName(selector);
0848     
0849     }
0850 
0851     case DeclarationName::CXXConstructorName: {
0852     QualType type = subR.find("type").readQualType();
0853     
0854       return ctx.DeclarationNames.getCXXConstructorName(
0855                ctx.getCanonicalType(type));
0856     
0857     }
0858 
0859     case DeclarationName::CXXDestructorName: {
0860     QualType type = subR.find("type").readQualType();
0861     
0862       return ctx.DeclarationNames.getCXXDestructorName(
0863                ctx.getCanonicalType(type));
0864     
0865     }
0866 
0867     case DeclarationName::CXXConversionFunctionName: {
0868     QualType type = subR.find("type").readQualType();
0869     
0870       return ctx.DeclarationNames.getCXXConversionFunctionName(
0871                ctx.getCanonicalType(type));
0872     
0873     }
0874 
0875     case DeclarationName::CXXDeductionGuideName: {
0876     TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef();
0877     
0878     return ctx.DeclarationNames.getCXXDeductionGuideName(declaration);
0879   
0880     }
0881 
0882     case DeclarationName::CXXOperatorName: {
0883     OverloadedOperatorKind operatorKind = subR.find("operatorKind").readOverloadedOperatorKind();
0884     
0885     return ctx.DeclarationNames.getCXXOperatorName(operatorKind);
0886   
0887     }
0888 
0889     case DeclarationName::CXXLiteralOperatorName: {
0890     IdentifierInfo* identifier = subR.find("identifier").readIdentifier();
0891     
0892     return ctx.DeclarationNames.getCXXLiteralOperatorName(identifier);
0893   
0894     }
0895 
0896     case DeclarationName::CXXUsingDirective: {
0897     
0898     return DeclarationName::getUsingDirectiveName();
0899   
0900     }
0901 
0902     }
0903     llvm_unreachable("bad DeclarationName::NameKind");
0904   }
0905   DeclarationName::NameKind readDeclarationNameKind() {
0906     return asImpl().template readEnum<DeclarationName::NameKind>();
0907   }
0908   ElaboratedTypeKeyword readElaboratedTypeKeyword() {
0909     return asImpl().template readEnum<ElaboratedTypeKeyword>();
0910   }
0911   Expr* readExprRef() {
0912     return cast_or_null<Expr>(asImpl().readStmtRef());
0913   }
0914   FunctionDecl* readFunctionDeclRef() {
0915     return cast_or_null<FunctionDecl>(asImpl().readDeclRef());
0916   }
0917   NamedDecl* readNamedDeclRef() {
0918     return cast_or_null<NamedDecl>(asImpl().readDeclRef());
0919   }
0920   NamespaceAliasDecl* readNamespaceAliasDeclRef() {
0921     return cast_or_null<NamespaceAliasDecl>(asImpl().readDeclRef());
0922   }
0923   NamespaceDecl* readNamespaceDeclRef() {
0924     return cast_or_null<NamespaceDecl>(asImpl().readDeclRef());
0925   }
0926   NestedNameSpecifier::SpecifierKind readNestedNameSpecifierKind() {
0927     return asImpl().template readEnum<NestedNameSpecifier::SpecifierKind>();
0928   }
0929   ObjCProtocolDecl* readObjCProtocolDeclRef() {
0930     return cast_or_null<ObjCProtocolDecl>(asImpl().readDeclRef());
0931   }
0932   ObjCTypeParamDecl* readObjCTypeParamDeclRef() {
0933     return cast_or_null<ObjCTypeParamDecl>(asImpl().readDeclRef());
0934   }
0935   OverloadedOperatorKind readOverloadedOperatorKind() {
0936     return asImpl().template readEnum<OverloadedOperatorKind>();
0937   }
0938   RefQualifierKind readRefQualifierKind() {
0939     return asImpl().template readEnum<RefQualifierKind>();
0940   }
0941   SubstTemplateTypeParmTypeFlag readSubstTemplateTypeParmTypeFlag() {
0942     return asImpl().template readEnum<SubstTemplateTypeParmTypeFlag>();
0943   }
0944   TagDecl* readTagDeclRef() {
0945     return cast_or_null<TagDecl>(asImpl().readDeclRef());
0946   }
0947   TemplateArgument readTemplateArgument() {
0948     auto &ctx = asImpl().getASTContext();
0949     auto &&subR = asImpl().readObject();
0950     TemplateArgument::ArgKind kind = subR.find("kind").readTemplateArgumentKind();
0951     switch (kind) {
0952     case TemplateArgument::Null: {
0953     
0954     return TemplateArgument();
0955   
0956     }
0957 
0958     case TemplateArgument::Type: {
0959     QualType type = subR.find("type").readQualType();
0960     bool isDefaulted = subR.find("isDefaulted").readBool();
0961     
0962     return TemplateArgument(type, /* isNullPtr */ false, isDefaulted);
0963   
0964     }
0965 
0966     case TemplateArgument::Declaration: {
0967     ValueDecl* declaration = subR.find("declaration").readValueDeclRef();
0968     QualType parameterType = subR.find("parameterType").readQualType();
0969     bool isDefaulted = subR.find("isDefaulted").readBool();
0970     
0971     return TemplateArgument(declaration, parameterType, isDefaulted);
0972   
0973     }
0974 
0975     case TemplateArgument::NullPtr: {
0976     QualType type = subR.find("type").readQualType();
0977     bool isDefaulted = subR.find("isDefaulted").readBool();
0978     
0979     return TemplateArgument(type, /*nullptr*/ true, isDefaulted);
0980   
0981     }
0982 
0983     case TemplateArgument::Integral: {
0984     llvm::APSInt value = subR.find("value").readAPSInt();
0985     QualType type = subR.find("type").readQualType();
0986     bool isDefaulted = subR.find("isDefaulted").readBool();
0987     
0988     return TemplateArgument(ctx, value, type, isDefaulted);
0989   
0990     }
0991 
0992     case TemplateArgument::StructuralValue: {
0993     APValue value = subR.find("value").readAPValue();
0994     QualType type = subR.find("type").readQualType();
0995     bool isDefaulted = subR.find("isDefaulted").readBool();
0996     
0997     return TemplateArgument(ctx, type, value, isDefaulted);
0998   
0999     }
1000 
1001     case TemplateArgument::Template: {
1002     TemplateName name = subR.find("name").readTemplateName();
1003     bool isDefaulted = subR.find("isDefaulted").readBool();
1004     
1005     return TemplateArgument(name, isDefaulted);
1006   
1007     }
1008 
1009     case TemplateArgument::TemplateExpansion: {
1010     TemplateName name = subR.find("name").readTemplateName();
1011     std::optional<uint32_t> numExpansions = subR.find("numExpansions").template readOptional<uint32_t>();
1012     bool isDefaulted = subR.find("isDefaulted").readBool();
1013     
1014     auto numExpansionsUnsigned = llvm::transformOptional(
1015         numExpansions, [](uint32_t i) { return unsigned(i); });
1016 
1017     return TemplateArgument(name, numExpansionsUnsigned, isDefaulted);
1018   
1019     }
1020 
1021     case TemplateArgument::Expression: {
1022     Expr* expression = subR.find("expression").readExprRef();
1023     bool isDefaulted = subR.find("isDefaulted").readBool();
1024     
1025     return TemplateArgument(expression, isDefaulted);
1026   
1027     }
1028 
1029     case TemplateArgument::Pack: {
1030     llvm::SmallVector<TemplateArgument, 8> elements_buffer_0;
1031     llvm::ArrayRef<TemplateArgument> elements = subR.find("elements").template readArray<TemplateArgument>(elements_buffer_0);
1032     
1033     // Copy the pack into the ASTContext.
1034     TemplateArgument *ctxElements = new (ctx) TemplateArgument[elements.size()];
1035     for (size_t i = 0, e = elements.size(); i != e; ++i)
1036       ctxElements[i] = elements[i];
1037     return TemplateArgument(llvm::ArrayRef(ctxElements, elements.size()));
1038   
1039     }
1040 
1041     }
1042     llvm_unreachable("bad TemplateArgument::ArgKind");
1043   }
1044   TemplateArgument::ArgKind readTemplateArgumentKind() {
1045     return asImpl().template readEnum<TemplateArgument::ArgKind>();
1046   }
1047   TemplateDecl* readTemplateDeclRef() {
1048     return cast_or_null<TemplateDecl>(asImpl().readDeclRef());
1049   }
1050   TemplateName readTemplateName() {
1051     auto &ctx = asImpl().getASTContext();
1052     auto &&subR = asImpl().readObject();
1053     TemplateName::NameKind kind = subR.find("kind").readTemplateNameKind();
1054     switch (kind) {
1055     case TemplateName::Template: {
1056     TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef();
1057     
1058     return TemplateName(declaration);
1059   
1060     }
1061 
1062     case TemplateName::UsingTemplate: {
1063     UsingShadowDecl* foundDecl = subR.find("foundDecl").readUsingShadowDeclRef();
1064     
1065     return TemplateName(foundDecl);
1066   
1067     }
1068 
1069     case TemplateName::OverloadedTemplate: {
1070     llvm::SmallVector<NamedDecl*, 8> overloads_buffer_0;
1071     llvm::ArrayRef<NamedDecl*> overloads = subR.find("overloads").template readArray<NamedDecl*>(overloads_buffer_0);
1072     
1073     // Copy into an UnresolvedSet to satisfy the interface.
1074     UnresolvedSet<8> overloadSet;
1075     for (auto overload : overloads) {
1076       overloadSet.addDecl(overload);
1077     }
1078 
1079     return ctx.getOverloadedTemplateName(overloadSet.begin(),
1080                                          overloadSet.end());
1081   
1082     }
1083 
1084     case TemplateName::AssumedTemplate: {
1085     DeclarationName name = subR.find("name").readDeclarationName();
1086     
1087     return ctx.getAssumedTemplateName(name);
1088   
1089     }
1090 
1091     case TemplateName::QualifiedTemplate: {
1092     NestedNameSpecifier * qualifier = subR.find("qualifier").readNestedNameSpecifier();
1093     bool hasTemplateKeyword = subR.find("hasTemplateKeyword").readBool();
1094     TemplateName underlyingTemplateName = subR.find("underlyingTemplateName").readTemplateName();
1095     
1096     return ctx.getQualifiedTemplateName(qualifier, hasTemplateKeyword,
1097                                         underlyingTemplateName);
1098   
1099     }
1100 
1101     case TemplateName::DependentTemplate: {
1102     NestedNameSpecifier * qualifier = subR.find("qualifier").readNestedNameSpecifier();
1103     std::optional<IdentifierInfo*> identifier = subR.find("identifier").template readOptional<IdentifierInfo*>();
1104     std::optional<OverloadedOperatorKind> operatorKind;
1105     if ( !identifier ) {
1106       operatorKind.emplace(subR.find("operatorKind").readOverloadedOperatorKind());
1107     }
1108     
1109     if (identifier) {
1110       return ctx.getDependentTemplateName(qualifier, *identifier);
1111     } else {
1112       return ctx.getDependentTemplateName(qualifier, *operatorKind);
1113     }
1114   
1115     }
1116 
1117     case TemplateName::SubstTemplateTemplateParm: {
1118     TemplateName replacement = subR.find("replacement").readTemplateName();
1119     Decl* associatedDecl = subR.find("associatedDecl").readDeclRef();
1120     uint32_t index = subR.find("index").readUInt32();
1121     std::optional<uint32_t> packIndex = subR.find("packIndex").template readOptional<uint32_t>();
1122     
1123     return ctx.getSubstTemplateTemplateParm(replacement, associatedDecl, index, packIndex);
1124   
1125     }
1126 
1127     case TemplateName::SubstTemplateTemplateParmPack: {
1128     TemplateArgument argumentPack = subR.find("argumentPack").readTemplateArgument();
1129     Decl* associatedDecl = subR.find("associatedDecl").readDeclRef();
1130     uint32_t index = subR.find("index").readUInt32();
1131     bool final = subR.find("final").readBool();
1132     
1133     return ctx.getSubstTemplateTemplateParmPack(argumentPack, associatedDecl, index, final);
1134   
1135     }
1136 
1137     case TemplateName::DeducedTemplate: {
1138     TemplateName underlying = subR.find("underlying").readTemplateName();
1139     uint32_t startPos = subR.find("startPos").readUInt32();
1140     llvm::SmallVector<TemplateArgument, 8> defaultArgs_buffer_0;
1141     llvm::ArrayRef<TemplateArgument> defaultArgs = subR.find("defaultArgs").template readArray<TemplateArgument>(defaultArgs_buffer_0);
1142     
1143     return ctx.getDeducedTemplateName(underlying, {startPos, defaultArgs});
1144   
1145     }
1146 
1147     }
1148     llvm_unreachable("bad TemplateName::NameKind");
1149   }
1150   TemplateName::NameKind readTemplateNameKind() {
1151     return asImpl().template readEnum<TemplateName::NameKind>();
1152   }
1153   TemplateTemplateParmDecl* readTemplateTemplateParmDeclRef() {
1154     return cast_or_null<TemplateTemplateParmDecl>(asImpl().readDeclRef());
1155   }
1156   TemplateTypeParmDecl* readTemplateTypeParmDeclRef() {
1157     return cast_or_null<TemplateTypeParmDecl>(asImpl().readDeclRef());
1158   }
1159   TypeOfKind readTypeOfKind() {
1160     return asImpl().template readEnum<TypeOfKind>();
1161   }
1162   UnaryTransformType::UTTKind readUnaryTypeTransformKind() {
1163     return asImpl().template readEnum<UnaryTransformType::UTTKind>();
1164   }
1165   UsingShadowDecl* readUsingShadowDeclRef() {
1166     return cast_or_null<UsingShadowDecl>(asImpl().readDeclRef());
1167   }
1168   ValueDecl* readValueDeclRef() {
1169     return cast_or_null<ValueDecl>(asImpl().readDeclRef());
1170   }
1171   VectorKind readVectorKind() {
1172     return asImpl().template readEnum<VectorKind>();
1173   }
1174 };
1175