clang 20.0.0git
Classes | Namespaces | Macros | Typedefs | Functions
Type.cpp File Reference
#include "clang/AST/Type.h"
#include "Linkage.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Attr.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclFriend.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/DependenceFlags.h"
#include "clang/AST/Expr.h"
#include "clang/AST/NestedNameSpecifier.h"
#include "clang/AST/NonTrivialTypeVisitor.h"
#include "clang/AST/PrettyPrinter.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/TypeVisitor.h"
#include "clang/Basic/AddressSpaces.h"
#include "clang/Basic/ExceptionSpecificationType.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/Linkage.h"
#include "clang/Basic/Specifiers.h"
#include "clang/Basic/TargetCXXABI.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/Visibility.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/TargetParser/RISCVTargetParser.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstring>
#include <optional>
#include <type_traits>
#include "clang/AST/TypeNodes.inc"
#include "clang/Basic/WebAssemblyReferenceTypes.def"
#include "clang/Basic/HLSLIntangibleTypes.def"
#include "clang/Basic/AArch64SVEACLETypes.def"
#include "clang/Basic/RISCVVTypes.def"
#include "clang/Basic/OpenCLImageTypes.def"
#include "clang/Basic/OpenCLExtensionTypes.def"
#include "clang/Basic/PPCTypes.def"
#include "clang/Basic/AMDGPUTypes.def"
#include "clang/AST/BuiltinTypes.def"

Go to the source code of this file.

Classes

class  clang::TypePropertyCache< Private >
 The type-property cache. More...
 

Namespaces

namespace  clang
 The JSON file list parser is used to communicate input to InstallAPI.
 

Macros

#define TYPE(CLASS, BASE)
 
#define TYPE(CLASS, BASE)
 
#define ABSTRACT_TYPE(Class, Parent)
 
#define TYPE(Class, Parent)
 
#define ABSTRACT_TYPE(Class, Parent)
 
#define TYPE(Class, Parent)
 
#define ABSTRACT_TYPE(Class, Parent)
 
#define TYPE(Class, Parent)
 
#define ABSTRACT_TYPE(Class, Parent)
 
#define TYPE(Class, Parent)
 
#define ABSTRACT_TYPE(Class, Parent)
 
#define TYPE(Class, Parent)
 
#define TYPE(Class, Base)
 
#define DEPENDENT_TYPE(Class, Base)    QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
 
#define TRIVIAL_TYPE_CLASS(Class)    QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }
 
#define SUGARED_TYPE_CLASS(Class)
 
#define WASM_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define SVE_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define RVV_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, IsFP, IsBF)
 
#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls)
 
#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls)
 
#define ABSTRACT_TYPE(Derived, Base)
 
#define TYPE(Derived, Base)   case Derived: return #Derived;
 
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)
 
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext)
 
#define SVE_TYPE(Name, Id, SingletonId)
 
#define PPC_VECTOR_TYPE(Name, Id, Size)
 
#define RVV_TYPE(Name, Id, SingletonId)
 
#define WASM_TYPE(Name, Id, SingletonId)
 
#define AMDGPU_TYPE(Name, Id, SingletonId)
 
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)
 
#define TYPE(Class, Base)
 
#define NON_CANONICAL_TYPE(Class, Base)   case Type::Class:
 
#define TYPE(Class, Base)
 
#define DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define TYPE(Class, Base)
 
#define NON_CANONICAL_TYPE(Class, Base)   case Type::Class:
 
#define TYPE(Class, Base)
 
#define DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)   case Type::Class:
 
#define NON_CANONICAL_TYPE(Class, Parent)
 
#define TYPE(Class, Parent)
 
#define SIGNED_TYPE(Id, SingletonId)   case BuiltinType::Id:
 
#define UNSIGNED_TYPE(Id, SingletonId)   case BuiltinType::Id:
 
#define FLOATING_TYPE(Id, SingletonId)   case BuiltinType::Id:
 
#define BUILTIN_TYPE(Id, SingletonId)
 
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)    case BuiltinType::Id:
 
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext)    case BuiltinType::Id:
 
#define SVE_TYPE(Name, Id, SingletonId)    case BuiltinType::Id:
 
#define PPC_VECTOR_TYPE(Name, Id, Size)    case BuiltinType::Id:
 
#define RVV_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define WASM_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define AMDGPU_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 

Typedefs

using Cache = TypePropertyCache< Private >
 

Functions

template<typename T >
static const T * getAsSugar (const Type *Cur)
 This will check for a T (which should be a Type which can act as sugar, such as a TypedefType) by removing any existing sugar until it reaches a T or a non-sugared type.
 
static bool isTriviallyCopyableTypeImpl (const QualType &type, const ASTContext &Context, bool IsCopyConstructible)
 
static TagDeclgetInterestingTagDecl (TagDecl *decl)
 
static const TemplateTypeParmDeclgetReplacedParameter (Decl *D, unsigned Index)
 
static CachedProperties computeCachedProperties (const Type *T)
 

Macro Definition Documentation

◆ ABSTRACT_TYPE [1/6]

#define ABSTRACT_TYPE (   Class,
  Parent 
)

◆ ABSTRACT_TYPE [2/6]

#define ABSTRACT_TYPE (   Class,
  Parent 
)

◆ ABSTRACT_TYPE [3/6]

#define ABSTRACT_TYPE (   Class,
  Parent 
)

◆ ABSTRACT_TYPE [4/6]

#define ABSTRACT_TYPE (   Class,
  Parent 
)

◆ ABSTRACT_TYPE [5/6]

#define ABSTRACT_TYPE (   Class,
  Parent 
)

◆ ABSTRACT_TYPE [6/6]

#define ABSTRACT_TYPE (   Derived,
  Base 
)

◆ AMDGPU_TYPE [1/2]

#define AMDGPU_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case Id: \
return Name;
uint32_t Id
Definition: SemaARM.cpp:1144

◆ AMDGPU_TYPE [2/2]

#define AMDGPU_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ BUILTIN_TYPE

#define BUILTIN_TYPE (   Id,
  SingletonId 
)

◆ DEPENDENT_TYPE [1/3]

#define DEPENDENT_TYPE (   Class,
  Base 
)     QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }

Definition at line 947 of file Type.cpp.

◆ DEPENDENT_TYPE [2/3]

#define DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:

Definition at line 947 of file Type.cpp.

◆ DEPENDENT_TYPE [3/3]

#define DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:

Definition at line 947 of file Type.cpp.

◆ EXT_OPAQUE_TYPE [1/2]

#define EXT_OPAQUE_TYPE (   ExtType,
  Id,
  Ext 
)
Value:
case Id: \
return #ExtType;

◆ EXT_OPAQUE_TYPE [2/2]

#define EXT_OPAQUE_TYPE (   ExtType,
  Id,
  Ext 
)     case BuiltinType::Id:

◆ FLOATING_TYPE

#define FLOATING_TYPE (   Id,
  SingletonId 
)    case BuiltinType::Id:

◆ HLSL_INTANGIBLE_TYPE [1/3]

#define HLSL_INTANGIBLE_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ HLSL_INTANGIBLE_TYPE [2/3]

#define HLSL_INTANGIBLE_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case Id: \
return #Name;

◆ HLSL_INTANGIBLE_TYPE [3/3]

#define HLSL_INTANGIBLE_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ IMAGE_TYPE [1/2]

#define IMAGE_TYPE (   ImgType,
  Id,
  SingletonId,
  Access,
  Suffix 
)
Value:
case Id: \
return "__" #Access " " #ImgType "_t";

◆ IMAGE_TYPE [2/2]

#define IMAGE_TYPE (   ImgType,
  Id,
  SingletonId,
  Access,
  Suffix 
)     case BuiltinType::Id:

◆ NON_CANONICAL_TYPE [1/3]

#define NON_CANONICAL_TYPE (   Class,
  Base 
)    case Type::Class:

◆ NON_CANONICAL_TYPE [2/3]

#define NON_CANONICAL_TYPE (   Class,
  Base 
)    case Type::Class:

◆ NON_CANONICAL_TYPE [3/3]

#define NON_CANONICAL_TYPE (   Class,
  Parent 
)
Value:
case Type::Class: \
llvm_unreachable("non-canonical type");

◆ NON_CANONICAL_UNLESS_DEPENDENT_TYPE [1/2]

#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:

◆ NON_CANONICAL_UNLESS_DEPENDENT_TYPE [2/2]

#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE (   Class,
  Base 
)    case Type::Class:

◆ PPC_VECTOR_TYPE [1/2]

#define PPC_VECTOR_TYPE (   Name,
  Id,
  Size 
)
Value:
case Id: \
return #Name;

◆ PPC_VECTOR_TYPE [2/2]

#define PPC_VECTOR_TYPE (   Name,
  Id,
  Size 
)     case BuiltinType::Id:

◆ RVV_PREDICATE_TYPE [1/2]

#define RVV_PREDICATE_TYPE (   Name,
  Id,
  SingletonId,
  NumEls 
)
Value:
case BuiltinType::Id: \
return true;

◆ RVV_PREDICATE_TYPE [2/2]

#define RVV_PREDICATE_TYPE (   Name,
  Id,
  SingletonId,
  NumEls 
)
Value:
case BuiltinType::Id: \
return Ctx.UnsignedCharTy;

◆ RVV_TYPE [1/3]

#define RVV_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ RVV_TYPE [2/3]

#define RVV_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case Id: \
return Name;

◆ RVV_TYPE [3/3]

#define RVV_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ RVV_VECTOR_TYPE

#define RVV_VECTOR_TYPE (   Name,
  Id,
  SingletonId,
  NumEls,
  ElBits,
  NF,
  IsSigned,
  IsFP,
  IsBF 
)
Value:
case BuiltinType::Id: \
return NF == 1;

◆ SIGNED_TYPE

#define SIGNED_TYPE (   Id,
  SingletonId 
)    case BuiltinType::Id:

◆ SUGARED_TYPE_CLASS

#define SUGARED_TYPE_CLASS (   Class)
Value:
QualType Visit##Class##Type(const Class##Type *T) { \
if (!T->isSugared()) \
return QualType(T, 0); \
QualType desugaredType = recurse(T->desugar()); \
if (desugaredType.isNull()) \
return {}; \
if (desugaredType.getAsOpaquePtr() == T->desugar().getAsOpaquePtr()) \
return QualType(T, 0); \
return desugaredType; \
}
QualType desugar() const
Definition: Type.h:5551
bool isSugared() const
Definition: Type.h:5550
A (possibly-)qualified type.
Definition: Type.h:941
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: Type.h:1008
void * getAsOpaquePtr() const
Definition: Type.h:988
The base class of the type hierarchy.
Definition: Type.h:1829
const FunctionProtoType * T
@ Class
The "class" keyword introduces the elaborated-type-specifier.

Definition at line 953 of file Type.cpp.

◆ SVE_TYPE [1/3]

#define SVE_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ SVE_TYPE [2/3]

#define SVE_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case Id: \
return Name;

◆ SVE_TYPE [3/3]

#define SVE_TYPE (   Name,
  Id,
  SingletonId 
)     case BuiltinType::Id:

◆ TRIVIAL_TYPE_CLASS

#define TRIVIAL_TYPE_CLASS (   Class)     QualType Visit##Class##Type(const Class##Type *T) { return QualType(T, 0); }

Definition at line 951 of file Type.cpp.

◆ TYPE [1/14]

#define TYPE (   CLASS,
  BASE 
)
Value:
static_assert(!std::is_polymorphic<CLASS##Type>::value, \
#CLASS "Type should not be polymorphic!");

Definition at line 946 of file Type.cpp.

◆ TYPE [2/14]

#define TYPE (   CLASS,
  BASE 
)
Value:
static_assert(std::is_trivially_destructible<CLASS##Type>::value, \
#CLASS "Type should be trivially destructible!");

Definition at line 946 of file Type.cpp.

◆ TYPE [3/14]

#define TYPE (   Class,
  Base 
)

Definition at line 946 of file Type.cpp.

◆ TYPE [4/14]

#define TYPE (   Class,
  Base 
)

Definition at line 946 of file Type.cpp.

◆ TYPE [5/14]

#define TYPE (   Class,
  Base 
)

Definition at line 946 of file Type.cpp.

◆ TYPE [6/14]

#define TYPE (   Class,
  Base 
)

Definition at line 946 of file Type.cpp.

◆ TYPE [7/14]

#define TYPE (   Class,
  Base 
)

Definition at line 946 of file Type.cpp.

◆ TYPE [8/14]

#define TYPE (   Class,
  Parent 
)
Value:
case Type::Class: { \
const auto *ty = cast<Class##Type>(this); \
if (!ty->isSugared()) return QualType(ty, 0); \
return ty->desugar(); \
}
return(__x > > __y)|(__x<<(32 - __y))

Definition at line 946 of file Type.cpp.

◆ TYPE [9/14]

#define TYPE (   Class,
  Parent 
)
Value:
case Type::Class: { \
const auto *Ty = cast<Class##Type>(CurTy); \
if (!Ty->isSugared()) \
return SplitQualType(Ty, Qs); \
Cur = Ty->desugar(); \
break; \
}
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition: Type.h:874

Definition at line 946 of file Type.cpp.

◆ TYPE [10/14]

#define TYPE (   Class,
  Parent 
)
Value:
case Type::Class: { \
const auto *ty = cast<Class##Type>(split.Ty); \
if (!ty->isSugared()) goto done; \
next = ty->desugar(); \
break; \
}

Definition at line 946 of file Type.cpp.

◆ TYPE [11/14]

#define TYPE (   Class,
  Parent 
)
Value:
case Type::Class: { \
const auto *Ty = cast<Class##Type>(Cur); \
if (!Ty->isSugared()) return 0; \
Cur = Ty->desugar().getTypePtr(); \
break; \
}

Definition at line 946 of file Type.cpp.

◆ TYPE [12/14]

#define TYPE (   Class,
  Parent 
)
Value:
case Class: { \
const auto *Ty = cast<Class##Type>(Cur); \
if (!Ty->isSugared()) return Cur; \
Cur = Ty->desugar().getTypePtr(); \
break; \
}

Definition at line 946 of file Type.cpp.

◆ TYPE [13/14]

#define TYPE (   Class,
  Parent 
)

Definition at line 946 of file Type.cpp.

◆ TYPE [14/14]

#define TYPE (   Derived,
  Base 
)    case Derived: return #Derived;

Definition at line 946 of file Type.cpp.

◆ UNSIGNED_TYPE

#define UNSIGNED_TYPE (   Id,
  SingletonId 
)    case BuiltinType::Id:

◆ WASM_TYPE [1/3]

#define WASM_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ WASM_TYPE [2/3]

#define WASM_TYPE (   Name,
  Id,
  SingletonId 
)
Value:
case Id: \
return Name;

◆ WASM_TYPE [3/3]

#define WASM_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

Typedef Documentation

◆ Cache

using Cache = TypePropertyCache<Private>

Definition at line 4483 of file Type.cpp.

Function Documentation

◆ computeCachedProperties()

static CachedProperties computeCachedProperties ( const Type T)
static

◆ getAsSugar()

template<typename T >
static const T * getAsSugar ( const Type Cur)
static

This will check for a T (which should be a Type which can act as sugar, such as a TypedefType) by removing any existing sugar until it reaches a T or a non-sugared type.

Definition at line 560 of file Type.cpp.

References clang::Type::getTypeClass().

◆ getInterestingTagDecl()

static TagDecl * getInterestingTagDecl ( TagDecl decl)
static

◆ getReplacedParameter()

static const TemplateTypeParmDecl * getReplacedParameter ( Decl D,
unsigned  Index 
)
static

Definition at line 4185 of file Type.cpp.

References D, and clang::getReplacedTemplateParameterList().

◆ isTriviallyCopyableTypeImpl()

static bool isTriviallyCopyableTypeImpl ( const QualType type,
const ASTContext Context,
bool  IsCopyConstructible 
)
static