clang 8.0.0

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/DeclObjC.h"`
`#include "clang/AST/DeclTemplate.h"`
`#include "clang/AST/Expr.h"`
`#include "clang/AST/NestedNameSpecifier.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/None.h"`
`#include "llvm/ADT/SmallVector.h"`
`#include "llvm/Support/Casting.h"`
`#include "llvm/Support/ErrorHandling.h"`
`#include "llvm/Support/MathExtras.h"`
`#include <algorithm>`
`#include <cassert>`
`#include <cstdint>`
`#include <cstring>`
`#include "clang/AST/TypeNodes.def"`
`#include "clang/Basic/OpenCLImageTypes.def"`
`#include "clang/Basic/OpenCLExtensionTypes.def"`
`#include "clang/AST/BuiltinTypes.def"`
Include dependency graph for Type.cpp:

Go to the source code of this file.

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

## Namespaces
| clang
| Dataflow Directional Tag Classes.

## Macros
#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 | 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 | 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:

## 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. More...
template<typename F >
static QualType | simpleTransform (ASTContext &ctx, QualType type, F &&f)
| Perform a simple type transformation that does not change the semantics of the type. More...
static TagDecl * | getInterestingTagDecl (TagDecl *decl)
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
| ) |  |

## ◆ 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 749 of file Type.cpp.

## ◆ DEPENDENT_TYPE [2/3]

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

Definition at line 749 of file Type.cpp.

## ◆ DEPENDENT_TYPE [3/3]

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

Definition at line 749 of file Type.cpp.

## ◆ EXT_OPAQUE_TYPE [1/2]

#define EXT_OPAQUE_TYPE | ( |  | ExtType,
|  |  | Id,
|  |  | Ext
| ) |  |

Value:
case Id: \
return #ExtType;
Id
int Id
Definition: ASTDiff.cpp:191

## ◆ 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:

## ◆ IMAGE_TYPE [1/2]

#define IMAGE_TYPE | ( |  | ImgType,
|  |  | Id,
|  |  | SingletonId,
|  |  | Access,
|  |  | Suffix
| ) |  |

Value:
case Id: \
return "__" #Access " " #ImgType "_t";
Id
int Id
Definition: ASTDiff.cpp:191

## ◆ 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:

## ◆ SIGNED_TYPE

#define SIGNED_TYPE | ( |  | 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 753 of file Type.cpp.

## ◆ TYPE [1/13]

#define TYPE | ( |  | CLASS,
|  |  | BASE
| ) |  |

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

Definition at line 748 of file Type.cpp.

## ◆ TYPE [2/13]

#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(); \
}
clang::QualType
A (possibly-)qualified type.
Definition: Type.h:638

Definition at line 748 of file Type.cpp.

## ◆ TYPE [3/13]

#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; \
}
clang::SplitQualType
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition: Type.h:577

Definition at line 748 of file Type.cpp.

## ◆ TYPE [4/13]

#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 748 of file Type.cpp.

## ◆ TYPE [5/13]

#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 748 of file Type.cpp.

## ◆ TYPE [6/13]

#define TYPE | ( |  | Class,
|  |  | Parent
| ) |  |

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

Definition at line 748 of file Type.cpp.

## ◆ TYPE [7/13]

#define TYPE | ( |  | Class,
|  |  | Base
| ) |  |

Definition at line 748 of file Type.cpp.

## ◆ TYPE [8/13]

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

Definition at line 748 of file Type.cpp.

## ◆ TYPE [9/13]

#define TYPE | ( |  | Class,
|  |  | Base
| ) |  |

Definition at line 748 of file Type.cpp.

## ◆ TYPE [10/13]

#define TYPE | ( |  | Class,
|  |  | Base
| ) |  |

Definition at line 748 of file Type.cpp.

## ◆ TYPE [11/13]

#define TYPE | ( |  | Class,
|  |  | Base
| ) |  |

Definition at line 748 of file Type.cpp.

## ◆ TYPE [12/13]

#define TYPE | ( |  | Class,
|  |  | Base
| ) |  |

Definition at line 748 of file Type.cpp.

## ◆ TYPE [13/13]

#define TYPE | ( |  | Class,
|  |  | Parent
| ) |  |

Definition at line 748 of file Type.cpp.

## ◆ UNSIGNED_TYPE

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

## Typedef Documentation

## ◆ Cache

using Cache = TypePropertyCache<Private>

Definition at line 3494 of file Type.cpp.

## Function Documentation

## ◆ computeCachedProperties()

static CachedProperties computeCachedProperties | ( | const Type * | T | ) |
| static

Definition at line 3496 of file Type.cpp.

References clang::Auto, clang::ExternalLinkage, clang::TypePropertyCache< Private >::get(), clang::TagType::getDecl(), clang::Decl::getDeclContext(), clang::NamedDecl::getLinkageInternal(), clang::Type::getPointeeType(), clang::Type::getTypeClass(), clang::TagDecl::hasNameForLinkage(), clang::DeclContext::isFunctionOrMethod(), and clang::Type::isInstantiationDependentType().

Referenced by clang::TypePropertyCache< Private >::ensure(), and clang::ObjCTypeParamType::Profile().

## ◆ 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 386 of file Type.cpp.

References clang::Type::getTypeClass().

## ◆ getInterestingTagDecl()

static TagDecl* getInterestingTagDecl | ( | TagDecl * | decl | ) |
| static

Definition at line 3157 of file Type.cpp.

References clang::Redeclarable< decl_type >::redecls().

Referenced by clang::TagType::getDecl(), and clang::InjectedClassNameType::getDecl().

## ◆ simpleTransform()

template<typename F >

static QualType simpleTransform | ( | ASTContext & | ctx,
|  | QualType | type,
|  | F && | f
| ) |  |
| static

Perform a simple type transformation that does not change the semantics of the type.

Definition at line 1117 of file Type.cpp.

References clang::QualType::getAsOpaquePtr(), clang::ASTContext::getQualifiedType(), clang::QualType::isNull(), clang::SplitQualType::Quals, clang::QualType::split(), and clang::SplitQualType::Ty.

Referenced by clang::QualType::stripObjCKindOfType(), clang::ObjCObjectPointerType::stripObjCKindOfTypeAndQuals(), and clang::QualType::substObjCTypeArgs().