File indexing completed on 2026-05-10 08:36:38
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_CLANG_AST_NONTRIVIALTYPEVISITOR_H
0015 #define LLVM_CLANG_AST_NONTRIVIALTYPEVISITOR_H
0016
0017 #include "clang/AST/Type.h"
0018
0019 namespace clang {
0020
0021 template <class Derived, class RetTy = void> struct DestructedTypeVisitor {
0022 template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
0023 return asDerived().visitWithKind(FT.isDestructedType(), FT,
0024 std::forward<Ts>(Args)...);
0025 }
0026
0027 template <class... Ts>
0028 RetTy visitWithKind(QualType::DestructionKind DK, QualType FT,
0029 Ts &&... Args) {
0030 switch (DK) {
0031 case QualType::DK_objc_strong_lifetime:
0032 return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
0033 case QualType::DK_nontrivial_c_struct:
0034 return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
0035 case QualType::DK_none:
0036 return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
0037 case QualType::DK_cxx_destructor:
0038 return asDerived().visitCXXDestructor(FT, std::forward<Ts>(Args)...);
0039 case QualType::DK_objc_weak_lifetime:
0040 return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
0041 }
0042
0043 llvm_unreachable("unknown destruction kind");
0044 }
0045
0046 Derived &asDerived() { return static_cast<Derived &>(*this); }
0047 };
0048
0049 template <class Derived, class RetTy = void>
0050 struct DefaultInitializedTypeVisitor {
0051 template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
0052 return asDerived().visitWithKind(
0053 FT.isNonTrivialToPrimitiveDefaultInitialize(), FT,
0054 std::forward<Ts>(Args)...);
0055 }
0056
0057 template <class... Ts>
0058 RetTy visitWithKind(QualType::PrimitiveDefaultInitializeKind PDIK,
0059 QualType FT, Ts &&... Args) {
0060 switch (PDIK) {
0061 case QualType::PDIK_ARCStrong:
0062 return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
0063 case QualType::PDIK_ARCWeak:
0064 return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
0065 case QualType::PDIK_Struct:
0066 return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
0067 case QualType::PDIK_Trivial:
0068 return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
0069 }
0070
0071 llvm_unreachable("unknown default-initialize kind");
0072 }
0073
0074 Derived &asDerived() { return static_cast<Derived &>(*this); }
0075 };
0076
0077 template <class Derived, bool IsMove, class RetTy = void>
0078 struct CopiedTypeVisitor {
0079 template <class... Ts> RetTy visit(QualType FT, Ts &&... Args) {
0080 QualType::PrimitiveCopyKind PCK =
0081 IsMove ? FT.isNonTrivialToPrimitiveDestructiveMove()
0082 : FT.isNonTrivialToPrimitiveCopy();
0083 return asDerived().visitWithKind(PCK, FT, std::forward<Ts>(Args)...);
0084 }
0085
0086 template <class... Ts>
0087 RetTy visitWithKind(QualType::PrimitiveCopyKind PCK, QualType FT,
0088 Ts &&... Args) {
0089 asDerived().preVisit(PCK, FT, std::forward<Ts>(Args)...);
0090
0091 switch (PCK) {
0092 case QualType::PCK_ARCStrong:
0093 return asDerived().visitARCStrong(FT, std::forward<Ts>(Args)...);
0094 case QualType::PCK_ARCWeak:
0095 return asDerived().visitARCWeak(FT, std::forward<Ts>(Args)...);
0096 case QualType::PCK_Struct:
0097 return asDerived().visitStruct(FT, std::forward<Ts>(Args)...);
0098 case QualType::PCK_Trivial:
0099 return asDerived().visitTrivial(FT, std::forward<Ts>(Args)...);
0100 case QualType::PCK_VolatileTrivial:
0101 return asDerived().visitVolatileTrivial(FT, std::forward<Ts>(Args)...);
0102 }
0103
0104 llvm_unreachable("unknown primitive copy kind");
0105 }
0106
0107 Derived &asDerived() { return static_cast<Derived &>(*this); }
0108 };
0109
0110 }
0111
0112 #endif