#ifndef LLVM_CLANG_AST_CANONICALTYPE_H
#define LLVM_CLANG_AST_CANONICALTYPE_H
#include "clang/AST/Type.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/iterator.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/PointerLikeTypeTraits.h"
#include <cassert>
#include <iterator>
#include <type_traits>
namespace clang {
template<typename T> class CanProxy;
template<typename T> struct CanProxyAdaptor;
class CXXRecordDecl;
class EnumDecl;
class Expr;
class IdentifierInfo;
class ObjCInterfaceDecl;
class RecordDecl;
class TagDecl;
class TemplateTypeParmDecl;
template<typename T = Type>
class CanQual { … };
template<typename T, typename U>
inline bool operator==(CanQual<T> x, CanQual<U> y) { … }
template<typename T, typename U>
inline bool operator!=(CanQual<T> x, CanQual<U> y) { … }
CanQualType;
inline CanQualType Type::getCanonicalTypeUnqualified() const { … }
inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &DB,
CanQualType T) { … }
#define LLVM_CLANG_CANPROXY_TYPE_ACCESSOR(Accessor) …
#define LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(Type, Accessor) …
template<typename T>
class CanProxyBase { … } … };
template<typename T>
struct CanProxyAdaptor : CanProxyBase<T> { … };
template<typename T>
class CanProxy : public CanProxyAdaptor<T> { … };
}
namespace llvm {
simplify_type< ::clang::CanQual<T>>;
PointerLikeTypeTraits<clang::CanQual<T>>;
}
namespace clang {
template <typename InputIterator>
struct CanTypeIterator
: llvm::iterator_adaptor_base<
CanTypeIterator<InputIterator>, InputIterator,
typename std::iterator_traits<InputIterator>::iterator_category,
CanQualType,
typename std::iterator_traits<InputIterator>::difference_type,
CanProxy<Type>, CanQualType> { … };
template<>
struct CanProxyAdaptor<ComplexType> : public CanProxyBase<ComplexType> { … };
template<>
struct CanProxyAdaptor<PointerType> : public CanProxyBase<PointerType> { … };
template<>
struct CanProxyAdaptor<BlockPointerType>
: public CanProxyBase<BlockPointerType> { … };
template<>
struct CanProxyAdaptor<ReferenceType> : public CanProxyBase<ReferenceType> { … };
template<>
struct CanProxyAdaptor<LValueReferenceType>
: public CanProxyBase<LValueReferenceType> { … };
template<>
struct CanProxyAdaptor<RValueReferenceType>
: public CanProxyBase<RValueReferenceType> { … };
template<>
struct CanProxyAdaptor<MemberPointerType>
: public CanProxyBase<MemberPointerType> { … };
template<> struct CanProxyAdaptor<ArrayType>;
template<> struct CanProxyAdaptor<ConstantArrayType>;
template<> struct CanProxyAdaptor<IncompleteArrayType>;
template<> struct CanProxyAdaptor<VariableArrayType>;
template<> struct CanProxyAdaptor<DependentSizedArrayType>;
template<>
struct CanProxyAdaptor<DependentSizedExtVectorType>
: public CanProxyBase<DependentSizedExtVectorType> { … };
template<>
struct CanProxyAdaptor<VectorType> : public CanProxyBase<VectorType> { … };
template<>
struct CanProxyAdaptor<ExtVectorType> : public CanProxyBase<ExtVectorType> { … };
template<>
struct CanProxyAdaptor<FunctionType> : public CanProxyBase<FunctionType> { … };
template<>
struct CanProxyAdaptor<FunctionNoProtoType>
: public CanProxyBase<FunctionNoProtoType> { … };
template<>
struct CanProxyAdaptor<FunctionProtoType>
: public CanProxyBase<FunctionProtoType> { … };
template<>
struct CanProxyAdaptor<TypeOfType> : public CanProxyBase<TypeOfType> { … };
template<>
struct CanProxyAdaptor<DecltypeType> : public CanProxyBase<DecltypeType> { … };
template <>
struct CanProxyAdaptor<UnaryTransformType>
: public CanProxyBase<UnaryTransformType> { … };
template<>
struct CanProxyAdaptor<TagType> : public CanProxyBase<TagType> { … };
template<>
struct CanProxyAdaptor<RecordType> : public CanProxyBase<RecordType> { … };
template<>
struct CanProxyAdaptor<EnumType> : public CanProxyBase<EnumType> { … };
template<>
struct CanProxyAdaptor<TemplateTypeParmType>
: public CanProxyBase<TemplateTypeParmType> { … };
template<>
struct CanProxyAdaptor<ObjCObjectType>
: public CanProxyBase<ObjCObjectType> { … };
template<>
struct CanProxyAdaptor<ObjCObjectPointerType>
: public CanProxyBase<ObjCObjectPointerType> { … };
template<typename T>
inline CanQual<T> CanQual<T>::getUnqualifiedType() const { … }
template<typename T>
inline CanQual<Type> CanQual<T>::getNonReferenceType() const { … }
template<typename T>
CanQual<T> CanQual<T>::getFromOpaquePtr(void *Ptr) { … }
template<typename T>
CanQual<T> CanQual<T>::CreateUnsafe(QualType Other) { … }
template<typename T>
template<typename U>
CanProxy<U> CanQual<T>::getAs() const { … }
template<typename T>
template<typename U>
CanProxy<U> CanQual<T>::castAs() const { … }
template<typename T>
CanProxy<T> CanQual<T>::operator->() const { … }
template <typename InputIterator>
CanProxy<Type> CanTypeIterator<InputIterator>::operator->() const { … }
}
#endif