A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://clang.llvm.org/doxygen/ASTContext_8cpp_source.html below:

clang: lib/AST/ASTContext.cpp Source File

67#include "llvm/ADT/APFixedPoint.h" 68#include "llvm/ADT/APInt.h" 69#include "llvm/ADT/APSInt.h" 70#include "llvm/ADT/ArrayRef.h" 71#include "llvm/ADT/DenseMap.h" 72#include "llvm/ADT/DenseSet.h" 73#include "llvm/ADT/FoldingSet.h" 74#include "llvm/ADT/PointerUnion.h" 75#include "llvm/ADT/STLExtras.h" 76#include "llvm/ADT/SmallPtrSet.h" 77#include "llvm/ADT/SmallVector.h" 78#include "llvm/ADT/StringExtras.h" 79#include "llvm/ADT/StringRef.h" 80#include "llvm/Frontend/OpenMP/OMPIRBuilder.h" 81#include "llvm/Support/Capacity.h" 82#include "llvm/Support/Compiler.h" 83#include "llvm/Support/ErrorHandling.h" 84#include "llvm/Support/MD5.h" 85#include "llvm/Support/MathExtras.h" 86#include "llvm/Support/SipHash.h" 87#include "llvm/Support/raw_ostream.h" 88#include "llvm/TargetParser/AArch64TargetParser.h" 89#include "llvm/TargetParser/Triple.h" 102using namespace clang

;

115template

<>

struct

llvm::DenseMapInfo<

llvm

::FoldingSetNodeID> {

116 static

FoldingSetNodeID

getEmptyKey

() {

return

FoldingSetNodeID{}; }

120 for

(

size_t

i = 0; i <

sizeof

(id) /

sizeof

(

unsigned

); ++i) {

121 id

.AddInteger(std::numeric_limits<unsigned>::max());

127 return

Val.ComputeHash();

130 static bool isEqual

(

const

FoldingSetNodeID &LHS,

131 const

FoldingSetNodeID &RHS) {

147 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

152 if

(

const auto

*VD = dyn_cast<VarDecl>(

D

)) {

153 if

(VD->isStaticDataMember() &&

158 if

(

const auto

*CRD = dyn_cast<CXXRecordDecl>(

D

)) {

163 if

(

const auto

*CTSD = dyn_cast<ClassTemplateSpecializationDecl>(

D

)) {

170 if

(

const auto

*ED = dyn_cast<EnumDecl>(

D

)) {

174 if

(

const auto

*TD = dyn_cast<TagDecl>(

D

)) {

177 if

(TD->isEmbeddedInDeclarator() && !TD->isCompleteDefinition())

181 if

(isa<ParmVarDecl>(

D

))

186 if

(isa<TemplateTypeParmDecl>(

D

) ||

187

isa<NonTypeTemplateParmDecl>(

D

) ||

188

isa<TemplateTemplateParmDecl>(

D

))

199 if

(isa<ObjCMethodDecl>(

D

) || isa<ObjCContainerDecl>(

D

) ||

200

isa<ObjCPropertyDecl>(

D

) || isa<RedeclarableTemplateDecl>(

D

) ||

201

isa<ClassTemplateSpecializationDecl>(

D

) ||

203

isa<TypedefDecl>(

D

))

209

Locations.emplace_back(BaseLocation);

237 const

std::map<unsigned, RawComment *> &CommentsInTheFile)

const

{

240 if

(RepresentativeLocForDecl.

isInvalid

() ||

241

!RepresentativeLocForDecl.

isFileID

())

245 if

(CommentsInTheFile.empty())

250 const

std::pair<FileID, unsigned> DeclLocDecomp =

254 auto

OffsetCommentBehindDecl =

255

CommentsInTheFile.lower_bound(DeclLocDecomp.second);

258 if

(OffsetCommentBehindDecl != CommentsInTheFile.end()) {

259 RawComment

*CommentBehindDecl = OffsetCommentBehindDecl->second;

263

(isa<FieldDecl>(

D

) || isa<EnumConstantDecl>(

D

) || isa<VarDecl>(

D

) ||

264

isa<ObjCMethodDecl>(

D

) || isa<ObjCPropertyDecl>(

D

))) {

268 if

(SourceMgr.

getLineNumber

(DeclLocDecomp.first, DeclLocDecomp.second) ==

270

OffsetCommentBehindDecl->first)) {

271 return

CommentBehindDecl;

278 if

(OffsetCommentBehindDecl == CommentsInTheFile.begin())

281 auto

OffsetCommentBeforeDecl = --OffsetCommentBehindDecl;

282 RawComment

*CommentBeforeDecl = OffsetCommentBeforeDecl->second;

291 const unsigned

CommentEndOffset =

296 const char

*Buffer = SourceMgr.

getBufferData

(DeclLocDecomp.first,

302

StringRef

Text

(Buffer + CommentEndOffset,

303

DeclLocDecomp.second - CommentEndOffset);

307 if

(

Text

.find_last_of(

";{}#@"

) != StringRef::npos)

310 return

CommentBeforeDecl;

316 for

(

const auto

DeclLoc : DeclLocs) {

319 if

(DeclLoc.isInvalid() || !DeclLoc.isFileID())

331 if

(!

File

.isValid())

335 if

(!CommentsInThisFile || CommentsInThisFile->empty())

347

assert(LangOpts.RetainCommentsFromSystemHeaders ||

356 if

(

const auto

*FD = dyn_cast<FunctionDecl>(&

D

)) {

376 if

(

const auto

*VD = dyn_cast<VarDecl>(&

D

)) {

379 if

(VD->isStaticDataMember())

385 if

(

const auto

*CRD = dyn_cast<CXXRecordDecl>(&

D

)) {

392 if

(

const auto

*CTSD = dyn_cast<ClassTemplateSpecializationDecl>(CRD)) {

398 return

isa<ClassTemplateDecl *>(PU)

399

? *

static_cast<const Decl

*

>

(cast<ClassTemplateDecl *>(PU))

400

: *

static_cast<const Decl

*

>

(

401

cast<ClassTemplatePartialSpecializationDecl *>(PU));

406

CRD->getMemberSpecializationInfo())

407 return

*Info->getInstantiatedFrom();

411 if

(

const auto

*ED = dyn_cast<EnumDecl>(&

D

)) {

424 const Decl

**OriginalDecl)

const

{

427

OriginalDecl =

nullptr

;

439 return

DeclComment->second;

452

*OriginalDecl = RedeclComment->second;

455 "This decl is supposed to have comment attached."

);

456 return

CommentAtRedecl->second;

461 const Decl

*LastCheckedRedecl = [&]() {

463 bool

CanUseCommentlessCache =

false

;

465 for

(

auto

*Redecl : CanonicalD->

redecls

()) {

467

CanUseCommentlessCache =

true

;

470 if

(Redecl == LastChecked)

477 return

CanUseCommentlessCache ? LastChecked :

nullptr

;

483 if

(LastCheckedRedecl) {

484 if

(LastCheckedRedecl == Redecl) {

485

LastCheckedRedecl =

nullptr

;

493

*OriginalDecl = Redecl;

494 return

RedeclComment;

500

*OriginalDecl =

nullptr

;

516 if

(

const auto

*IMD = dyn_cast<ObjCImplDecl>(DC)) {

521 for

(

const auto

*Ext : ID->known_extensions()) {

525

Redeclared.push_back(RedeclaredMethod);

536 for

(

const Decl

*

D

: Decls) {

550 if

(

File

.isInvalid())

554 if

(!CommentsInThisFile || CommentsInThisFile->empty() ||

555

CommentsInThisFile->rbegin()->second->isAttached())

565 for

(

const Decl

*

D

: Decls) {

577 for

(

const auto

DeclLoc : DeclLocs) {

578 if

(DeclLoc.isInvalid() || !DeclLoc.isFileID())

582 D

, DeclLoc, *CommentsInThisFile)) {

593 const Decl

*

D

)

const

{

596

ThisDeclInfo->IsFilled =

false

;

597

ThisDeclInfo->fill();

598

ThisDeclInfo->CommentDecl = FC->

getDecl

();

599 if

(!ThisDeclInfo->TemplateParameters)

609 return

RC ? RC->

parse

(*

this

,

nullptr

,

D

) :

nullptr

;

620

llvm::DenseMap<const Decl *, comments::FullComment *>::iterator Pos =

624 if

(Canonical !=

D

) {

632 const Decl

*OriginalDecl =

nullptr

;

636 if

(isa<ObjCMethodDecl>(

D

) || isa<FunctionDecl>(

D

)) {

638 const auto

*OMD = dyn_cast<ObjCMethodDecl>(

D

);

639 if

(OMD && OMD->isPropertyAccessor())

646 for

(

unsigned

i = 0, e = Overridden.size(); i < e; i++)

650 else if

(

const auto

*TD = dyn_cast<TypedefNameDecl>(

D

)) {

653 QualType

QT = TD->getUnderlyingType();

655 if

(

const Decl

*TD = TT->getDecl())

659 else if

(

const auto

*IC = dyn_cast<ObjCInterfaceDecl>(

D

)) {

660 while

(IC->getSuperClass()) {

661

IC = IC->getSuperClass();

666 else if

(

const auto

*CD = dyn_cast<ObjCCategoryDecl>(

D

)) {

671 else if

(

const auto

*RD = dyn_cast<CXXRecordDecl>(

D

)) {

672 if

(!(RD = RD->getDefinition()))

675 for

(

const auto

&I : RD->bases()) {

676 if

(I.isVirtual() || (I.getAccessSpecifier() !=

AS_public

))

690 for

(

const auto

&I : RD->vbases()) {

691 if

(I.getAccessSpecifier() !=

AS_public

)

711 if

(

D

!= OriginalDecl && OriginalDecl)

720

ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,

728

ID.AddInteger(Params->

size

());

730

PEnd = Params->

end

();

732 if

(

const auto

*TTP = dyn_cast<TemplateTypeParmDecl>(*

P

)) {

734

ID.AddBoolean(TTP->isParameterPack());

735 if

(TTP->isExpandedParameterPack()) {

736

ID.AddBoolean(

true

);

737

ID.AddInteger(TTP->getNumExpansionParameters());

739

ID.AddBoolean(

false

);

743 if

(

const auto

*NTTP = dyn_cast<NonTypeTemplateParmDecl>(*

P

)) {

745 ID

.AddBoolean(NTTP->isParameterPack());

746 ID

.AddPointer(

C

.getUnconstrainedType(

C

.getCanonicalType(NTTP->getType()))

748 if

(NTTP->isExpandedParameterPack()) {

749 ID

.AddBoolean(

true

);

750 ID

.AddInteger(NTTP->getNumExpansionTypes());

751 for

(

unsigned

I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {

753 ID

.AddPointer(

T

.getCanonicalType().getAsOpaquePtr());

756 ID

.AddBoolean(

false

);

760 auto

*TTP = cast<TemplateTemplateParmDecl>(*

P

);

762

Profile(ID,

C

, TTP);

767

ASTContext::getCanonicalTemplateTemplateParmDecl(

770

llvm::FoldingSetNodeID

ID

;

771

CanonicalTemplateTemplateParm::Profile(ID, *

this

, TTP);

772 void

*InsertPos =

nullptr

;

773

CanonicalTemplateTemplateParm *Canonical

774

= CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);

776 return

Canonical->getParam();

781

CanonParams.reserve(Params->

size

());

783

PEnd = Params->

end

();

787 if

(

const auto

*TTP = dyn_cast<TemplateTypeParmDecl>(*

P

)) {

793

? std::optional<unsigned>(TTP->getNumExpansionParameters())

795

CanonParams.push_back(NewTTP);

796

}

else if

(

const auto

*NTTP = dyn_cast<NonTypeTemplateParmDecl>(*

P

)) {

800 if

(NTTP->isExpandedParameterPack()) {

803 for

(

unsigned

I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) {

805

ExpandedTInfos.push_back(

813

NTTP->getPosition(),

nullptr

,

823

NTTP->getPosition(),

nullptr

,

825

NTTP->isParameterPack(),

828

CanonParams.push_back(Param);

830

CanonParams.push_back(getCanonicalTemplateTemplateParmDecl(

831

cast<TemplateTemplateParmDecl>(*

P

)));

842

Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos);

843

assert(!Canonical &&

"Shouldn't be in the map!"

);

847

Canonical =

new

(*this) CanonicalTemplateTemplateParm(CanonTTP);

848

CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos);

857 return

NoSanitizeL->containsType(Mask, TyName) &&

858

!NoSanitizeL->containsType(Mask, TyName,

"sanitize"

);

867 if

(!LangOpts.CPlusPlus)

return nullptr

;

870 case

TargetCXXABI::AppleARM64:

871 case

TargetCXXABI::Fuchsia:

872 case

TargetCXXABI::GenericARM:

873 case

TargetCXXABI::iOS:

874 case

TargetCXXABI::WatchOS:

875 case

TargetCXXABI::GenericAArch64:

876 case

TargetCXXABI::GenericMIPS:

877 case

TargetCXXABI::GenericItanium:

878 case

TargetCXXABI::WebAssembly:

879 case

TargetCXXABI::XL:

881 case

TargetCXXABI::Microsoft:

884

llvm_unreachable(

"Invalid CXXABI type!"

);

888 if

(!InterpContext) {

891 return

*InterpContext.get();

897 return

*ParentMapCtx.get();

902 switch

(LangOpts.getAddressSpaceMapMangling()) {

910

llvm_unreachable(

"getAddressSpaceMapMangling() doesn't cover anything."

);

916

: ConstantArrayTypes(this_(), ConstantArrayTypesLog2InitSize),

917

DependentSizedArrayTypes(this_()), DependentSizedExtVectorTypes(this_()),

918

DependentAddressSpaceTypes(this_()), DependentVectorTypes(this_()),

919

DependentSizedMatrixTypes(this_()),

920

FunctionProtoTypes(this_(), FunctionProtoTypesLog2InitSize),

921

DependentTypeOfExprTypes(this_()), DependentDecltypeTypes(this_()),

922

TemplateSpecializationTypes(this_()),

923

DependentTemplateSpecializationTypes(this_()),

924

DependentBitIntTypes(this_()), SubstTemplateTemplateParmPacks(this_()),

925

DeducedTemplates(this_()), ArrayParameterTypes(this_()),

926

CanonTemplateTemplateParms(this_()), SourceMgr(

SM

), LangOpts(LOpts),

929

LangOpts.XRayNeverInstrumentFiles,

930

LangOpts.XRayAttrListFiles,

SM

)),

933 BuiltinInfo

(builtins), TUKind(TUKind), DeclarationNames(*this),

934

Comments(

SM

), CommentCommandTraits(BumpAlloc, LOpts.CommentOpts),

935

CompCategories(this_()), LastSDM(nullptr, 0) {

942

ReleaseDeclContextMaps();

945 for

(

auto

&Pair : Deallocations)

946

(Pair.first)(Pair.second);

947

Deallocations.clear();

953

I = ObjCLayouts.begin(),

E

= ObjCLayouts.end(); I !=

E

; )

959 for

(llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator

960

I = ASTRecordLayouts.begin(),

E

= ASTRecordLayouts.end(); I !=

E

; ) {

965

ASTRecordLayouts.clear();

967 for

(llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(),

968

AEnd = DeclAttrs.end();

970

A->second->~AttrVec();

973 for

(

const auto

&

Value

: ModuleInitializers)

974 Value

.second->~PerModuleInitializers();

975

ModuleInitializers.

clear

();

981

TraversalScope = TopLevelDecls;

986

Deallocations.push_back({Callback,

Data

});

995

llvm::errs() <<

"\n*** AST Context Stats:\n"

;

996

llvm::errs() <<

" "

<< Types.size() <<

" types total.\n"

;

998 unsigned

counts[] = {

999#define TYPE(Name, Parent) 0, 1000#define ABSTRACT_TYPE(Name, Parent) 1001#include "clang/AST/TypeNodes.inc" 1005 for

(

unsigned

i = 0, e = Types.size(); i != e; ++i) {

1006 Type

*

T

= Types[i];

1011 unsigned

TotalBytes = 0;

1012#define TYPE(Name, Parent) \ 1014 llvm::errs() << " "

<< counts[Idx] << " " << #Name \

1015

<< " types, " << sizeof(Name##Type) << " each " \

1016

<< "(" << counts[Idx] * sizeof(Name##Type) \

1018

TotalBytes += counts[Idx] * sizeof(Name##Type); \

1020#define ABSTRACT_TYPE(Name, Parent) 1021#include "clang/AST/TypeNodes.inc" 1023

llvm::errs() <<

"Total bytes = "

<< TotalBytes <<

"\n"

;

1028

<<

" implicit default constructors created\n"

;

1031

<<

" implicit copy constructors created\n"

;

1035

<<

" implicit move constructors created\n"

;

1038

<<

" implicit copy assignment operators created\n"

;

1042

<<

" implicit move assignment operators created\n"

;

1045

<<

" implicit destructors created\n"

;

1048

llvm::errs() <<

"\n"

;

1052

BumpAlloc.PrintStats();

1056 bool

NotifyListeners) {

1057 if

(NotifyListeners)

1065 auto

It = MergedDefModules.find(cast<NamedDecl>(ND->

getCanonicalDecl

()));

1066 if

(It == MergedDefModules.end())

1069 auto

&Merged = It->second;

1070

llvm::DenseSet<Module*>

Found

;

1071 for

(

Module

*&M : Merged)

1072 if

(!

Found

.insert(M).second)

1074

llvm::erase(Merged,

nullptr

);

1081 if

(MergedIt == MergedDefModules.end())

1083 return

MergedIt->second;

1086void

ASTContext::PerModuleInitializers::resolve(

ASTContext

&Ctx) {

1087 if

(LazyInitializers.empty())

1091

assert(Source &&

"lazy initializers but no external source"

);

1093 auto

LazyInits = std::move(LazyInitializers);

1094

LazyInitializers.clear();

1096 for

(

auto

ID : LazyInits)

1097

Initializers.push_back(Source->GetExternalDecl(ID));

1099

assert(LazyInitializers.empty() &&

1100 "GetExternalDecl for lazy module initializer added more inits"

);

1106 if

(

const auto

*ID = dyn_cast<ImportDecl>(

D

)) {

1107 auto

It = ModuleInitializers.find(ID->getImportedModule());

1110 if

(It == ModuleInitializers.end())

1114 auto

&Imported = *It->second;

1115 if

(Imported.Initializers.size() + Imported.LazyInitializers.size() == 1) {

1116

Imported.resolve(*

this

);

1117 auto

*OnlyDecl = Imported.Initializers.front();

1118 if

(isa<ImportDecl>(OnlyDecl))

1123 auto

*&Inits = ModuleInitializers[M];

1125

Inits =

new

(*this) PerModuleInitializers;

1126

Inits->Initializers.push_back(

D

);

1131 auto

*&Inits = ModuleInitializers[M];

1133

Inits =

new

(*this) PerModuleInitializers;

1134

Inits->LazyInitializers.insert(Inits->LazyInitializers.end(),

1135

IDs.begin(), IDs.end());

1139 auto

It = ModuleInitializers.find(M);

1140 if

(It == ModuleInitializers.end())

1143 auto

*Inits = It->second;

1144

Inits->resolve(*

this

);

1145 return

Inits->Initializers;

1150

assert(!CurrentCXXNamedModule &&

1151 "We should set named module for ASTContext for only once"

);

1152

CurrentCXXNamedModule = M;

1164 auto

GetRepresentativeModule = [

this

](

const Module

*M) {

1165 auto Iter

= SameModuleLookupSet.find(M);

1166 if

(

Iter

!= SameModuleLookupSet.end())

1167 return Iter

->second;

1169 const Module

*RepresentativeModule =

1170

PrimaryModuleNameMap.try_emplace(M->getPrimaryModuleInterfaceName(), M)

1172

SameModuleLookupSet[M] = RepresentativeModule;

1173 return

RepresentativeModule;

1176

assert(M1 &&

"Shouldn't call `isInSameModule` if both M1 and M2 are none."

);

1177 return

GetRepresentativeModule(M1) == GetRepresentativeModule(M2);

1181 if

(!ExternCContext)

1184 return

ExternCContext;

1190 auto

*BuiltinTemplate =

1192

BuiltinTemplate->setImplicit();

1195 return

BuiltinTemplate;

1200 if

(!MakeIntegerSeqDecl)

1203 return

MakeIntegerSeqDecl;

1208 if

(!TypePackElementDecl)

1211 return

TypePackElementDecl;

1215 if

(!BuiltinCommonTypeDecl)

1218 return

BuiltinCommonTypeDecl;

1232

NewDecl->

addAttr

(TypeVisibilityAttr::CreateImplicit(

1233 const_cast<ASTContext

&

>

(*

this

), TypeVisibilityAttr::Default));

1238

StringRef Name)

const

{

1262

Types.push_back(Ty);

1267

assert((!this->Target || this->Target == &

Target

) &&

1268 "Incorrect target reinitialization"

);

1269

assert(

VoidTy

.

isNull

() &&

"Context reinitialized?"

);

1271

this->Target = &

Target

;

1272

this->AuxTarget = AuxTarget;

1274

ABI.reset(createCXXABI(

Target

));

1278

InitBuiltinType(

VoidTy

, BuiltinType::Void);

1281

InitBuiltinType(

BoolTy

, BuiltinType::Bool);

1283 if

(LangOpts.CharIsSigned)

1284

InitBuiltinType(

CharTy

, BuiltinType::Char_S);

1286

InitBuiltinType(

CharTy

, BuiltinType::Char_U);

1289

InitBuiltinType(

ShortTy

, BuiltinType::Short);

1290

InitBuiltinType(

IntTy

, BuiltinType::Int);

1291

InitBuiltinType(

LongTy

, BuiltinType::Long);

1292

InitBuiltinType(

LongLongTy

, BuiltinType::LongLong);

1302

InitBuiltinType(

FloatTy

, BuiltinType::Float);

1303

InitBuiltinType(

DoubleTy

, BuiltinType::Double);

1304

InitBuiltinType(

LongDoubleTy

, BuiltinType::LongDouble);

1307

InitBuiltinType(

Float128Ty

, BuiltinType::Float128);

1310

InitBuiltinType(

Ibm128Ty

, BuiltinType::Ibm128);

1313

InitBuiltinType(

Float16Ty

, BuiltinType::Float16);

1316

InitBuiltinType(

ShortAccumTy

, BuiltinType::ShortAccum);

1317

InitBuiltinType(

AccumTy

, BuiltinType::Accum);

1318

InitBuiltinType(

LongAccumTy

, BuiltinType::LongAccum);

1322

InitBuiltinType(

ShortFractTy

, BuiltinType::ShortFract);

1323

InitBuiltinType(

FractTy

, BuiltinType::Fract);

1324

InitBuiltinType(

LongFractTy

, BuiltinType::LongFract);

1329

InitBuiltinType(

SatAccumTy

, BuiltinType::SatAccum);

1335

InitBuiltinType(

SatFractTy

, BuiltinType::SatFract);

1342

InitBuiltinType(

Int128Ty

, BuiltinType::Int128);

1347

InitBuiltinType(

WCharTy

, BuiltinType::WChar_S);

1349

InitBuiltinType(

WCharTy

, BuiltinType::WChar_U);

1350 if

(LangOpts.CPlusPlus && LangOpts.WChar)

1360

InitBuiltinType(

Char8Ty

, BuiltinType::Char8);

1362 if

(LangOpts.CPlusPlus)

1363

InitBuiltinType(

Char16Ty

, BuiltinType::Char16);

1367 if

(LangOpts.CPlusPlus)

1368

InitBuiltinType(

Char32Ty

, BuiltinType::Char32);

1377

InitBuiltinType(

DependentTy

, BuiltinType::Dependent);

1380

InitBuiltinType(

OverloadTy

, BuiltinType::Overload);

1392

InitBuiltinType(

UnknownAnyTy

, BuiltinType::UnknownAny);

1398

InitBuiltinType(

BuiltinFnTy

, BuiltinType::BuiltinFn);

1401 if

(LangOpts.OpenMP) {

1408 if

(LangOpts.OpenACC && !LangOpts.OpenMP) {

1411 if

(LangOpts.MatrixTypes)

1419 if

(LangOpts.OpenCL) {

1420#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 1421 InitBuiltinType(SingletonId, BuiltinType::Id); 1422#include "clang/Basic/OpenCLImageTypes.def" 1424

InitBuiltinType(

OCLSamplerTy

, BuiltinType::OCLSampler);

1425

InitBuiltinType(

OCLEventTy

, BuiltinType::OCLEvent);

1427

InitBuiltinType(

OCLQueueTy

, BuiltinType::OCLQueue);

1430#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 1431 InitBuiltinType(Id##Ty, BuiltinType::Id); 1432#include "clang/Basic/OpenCLExtensionTypes.def" 1435 if

(LangOpts.HLSL) {

1436#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ 1437 InitBuiltinType(SingletonId, BuiltinType::Id); 1438#include "clang/Basic/HLSLIntangibleTypes.def" 1441 if

(

Target

.hasAArch64SVETypes() ||

1443#define SVE_TYPE(Name, Id, SingletonId) \ 1444 InitBuiltinType(SingletonId, BuiltinType::Id); 1445#include "clang/Basic/AArch64SVEACLETypes.def" 1448 if

(

Target

.getTriple().isPPC64()) {

1449#define PPC_VECTOR_MMA_TYPE(Name, Id, Size) \ 1450 InitBuiltinType(Id##Ty, BuiltinType::Id); 1451#include "clang/Basic/PPCTypes.def" 1452#define PPC_VECTOR_VSX_TYPE(Name, Id, Size) \ 1453 InitBuiltinType(Id##Ty, BuiltinType::Id); 1454#include "clang/Basic/PPCTypes.def" 1457 if

(

Target

.hasRISCVVTypes()) {

1458#define RVV_TYPE(Name, Id, SingletonId) \ 1459 InitBuiltinType(SingletonId, BuiltinType::Id); 1460#include "clang/Basic/RISCVVTypes.def" 1463 if

(

Target

.getTriple().isWasm() &&

Target

.hasFeature(

"reference-types"

)) {

1464#define WASM_TYPE(Name, Id, SingletonId) \ 1465 InitBuiltinType(SingletonId, BuiltinType::Id); 1466#include "clang/Basic/WebAssemblyReferenceTypes.def" 1469 if

(

Target

.getTriple().isAMDGPU() ||

1470

(AuxTarget && AuxTarget->

getTriple

().isAMDGPU())) {

1471#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \ 1472 InitBuiltinType(SingletonId, BuiltinType::Id); 1473#include "clang/Basic/AMDGPUTypes.def" 1480

ObjCConstantStringType =

QualType

();

1485 if

(LangOpts.OpenCLGenericAddressSpace) {

1495

InitBuiltinType(

NullPtrTy

, BuiltinType::NullPtr);

1498

InitBuiltinType(

HalfTy

, BuiltinType::Half);

1500

InitBuiltinType(

BFloat16Ty

, BuiltinType::BFloat16);

1506 if

(LangOpts.MicrosoftExt || LangOpts.Borland) {

1528

llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(

D

);

1529 if

(Pos != DeclAttrs.end()) {

1530

Pos->second->~AttrVec();

1531

DeclAttrs.erase(Pos);

1545

llvm::DenseMap<const VarDecl *, TemplateOrSpecializationInfo>::iterator Pos =

1546

TemplateOrInstantiation.find(Var);

1547 if

(Pos == TemplateOrInstantiation.end())

1560

Tmpl, TSK, PointOfInstantiation));

1566

assert(!TemplateOrInstantiation[Inst] &&

1567 "Already noted what the variable was instantiated from"

);

1568

TemplateOrInstantiation[Inst] = TSI;

1573 return

InstantiatedFromUsingDecl.lookup(UUD);

1578

assert((isa<UsingDecl>(Pattern) ||

1579

isa<UnresolvedUsingValueDecl>(Pattern) ||

1580

isa<UnresolvedUsingTypenameDecl>(Pattern)) &&

1581 "pattern decl is not a using decl"

);

1582

assert((isa<UsingDecl>(Inst) ||

1583

isa<UnresolvedUsingValueDecl>(Inst) ||

1584

isa<UnresolvedUsingTypenameDecl>(Inst)) &&

1585 "instantiation did not produce a using decl"

);

1586

assert(!InstantiatedFromUsingDecl[Inst] &&

"pattern already exists"

);

1587

InstantiatedFromUsingDecl[Inst] = Pattern;

1592 return

InstantiatedFromUsingEnumDecl.lookup(UUD);

1597

assert(!InstantiatedFromUsingEnumDecl[Inst] &&

"pattern already exists"

);

1598

InstantiatedFromUsingEnumDecl[Inst] = Pattern;

1603 return

InstantiatedFromUsingShadowDecl.lookup(Inst);

1609

assert(!InstantiatedFromUsingShadowDecl[Inst] &&

"pattern already exists"

);

1610

InstantiatedFromUsingShadowDecl[Inst] = Pattern;

1615 return

InstantiatedFromUnnamedFieldDecl.lookup(Field);

1621 "Instantiated field decl is not unnamed"

);

1623 "Template field decl is not unnamed"

);

1624

assert(!InstantiatedFromUnnamedFieldDecl[Inst] &&

1625 "Already noted what unnamed field was instantiated from"

);

1627

InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl;

1648

llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos =

1650 if

(Pos == OverriddenMethods.end())

1658

OverriddenMethods[Method].push_back(Overridden);

1666 if

(

const auto

*CXXMethod = dyn_cast<CXXMethodDecl>(

D

)) {

1672 const auto

*Method = dyn_cast<ObjCMethodDecl>(

D

);

1677

Method->getOverriddenMethods(OverDecls);

1678

Overridden.append(OverDecls.begin(), OverDecls.end());

1682

assert(!Import->getNextLocalImport() &&

1683 "Import declaration already in the chain"

);

1684

assert(!Import->isFromASTFile() &&

"Non-local import declaration"

);

1685 if

(!FirstLocalImport) {

1686

FirstLocalImport = Import;

1687

LastLocalImport = Import;

1691

LastLocalImport->setNextLocalImport(Import);

1692

LastLocalImport = Import;

1704

llvm_unreachable(

"Not a floating point type!"

);

1705 case

BuiltinType::BFloat16:

1706 return Target

->getBFloat16Format();

1707 case

BuiltinType::Float16:

1708 return Target

->getHalfFormat();

1709 case

BuiltinType::Half:

1710 return Target

->getHalfFormat();

1711 case

BuiltinType::Float:

return Target

->getFloatFormat();

1712 case

BuiltinType::Double:

return Target

->getDoubleFormat();

1713 case

BuiltinType::Ibm128:

1714 return Target

->getIbm128Format();

1715 case

BuiltinType::LongDouble:

1718 return Target

->getLongDoubleFormat();

1719 case

BuiltinType::Float128:

1722 return Target

->getFloat128Format();

1727 unsigned

Align =

Target

->getCharWidth();

1731

Align = AlignFromAttr;

1739 bool

UseAlignAttrOnly;

1740 if

(

const FieldDecl

*FD = dyn_cast<FieldDecl>(

D

))

1742

FD->hasAttr<PackedAttr>() || FD->getParent()->hasAttr<PackedAttr>();

1744

UseAlignAttrOnly = AlignFromAttr != 0;

1747 if

(UseAlignAttrOnly) {

1749

}

else if

(

const auto

*VD = dyn_cast<ValueDecl>(

D

)) {

1759

Align = getTypeInfoImpl(

T

.getTypePtr()).

Align

;

1764 unsigned

MinWidth =

Target

->getLargeArrayMinWidth();

1765 if

(!ForAlignof && MinWidth) {

1766 if

(isa<VariableArrayType>(

arrayType

))

1767

Align = std::max(Align,

Target

->getLargeArrayAlign());

1768 else if

(isa<ConstantArrayType>(

arrayType

) &&

1770

Align = std::max(Align,

Target

->getLargeArrayAlign());

1775

Align =

Target

->getCharWidth();

1779 if

(

const auto

*VD = dyn_cast<VarDecl>(

D

))

1780 if

(VD->hasGlobalStorage() && !ForAlignof) {

1791 if

(

const auto

*Field = dyn_cast<FieldDecl>(VD)) {

1794 if

(!

Parent

->isInvalidDecl()) {

1801

uint64_t Offset = Layout.

getFieldOffset

(Field->getFieldIndex());

1805

uint64_t LowBitOfOffset = Offset & (~Offset + 1);

1806 if

(LowBitOfOffset < FieldAlign)

1807

FieldAlign =

static_cast<unsigned>

(LowBitOfOffset);

1810

Align = std::min(Align, FieldAlign);

1818 const auto

*VD = dyn_cast<VarDecl>(

D

);

1819 if

(MaxAlignedAttr && VD && VD->getStorageClass() ==

SC_Static

)

1820

Align = std::min(Align, MaxAlignedAttr);

1857

assert((Size == 0 ||

static_cast<

uint64_t

>

(EltInfo.

Width

.

getQuantity

()) <=

1858

(uint64_t)(-1)/Size) &&

1859 "Overflow in array type char size evaluation"

);

1864

Width = llvm::alignTo(Width, Align);

1871 if

(

const auto

*CAT = dyn_cast<ConstantArrayType>(

T

))

1889 switch

(BT->getKind()) {

1890 case

BuiltinType::Bool:

1891 case

BuiltinType::Char_S:

1892 case

BuiltinType::Char_U:

1893 case

BuiltinType::SChar:

1894 case

BuiltinType::UChar:

1895 case

BuiltinType::Short:

1896 case

BuiltinType::UShort:

1897 case

BuiltinType::WChar_S:

1898 case

BuiltinType::WChar_U:

1899 case

BuiltinType::Char8:

1900 case

BuiltinType::Char16:

1901 case

BuiltinType::Char32:

1910 if

(

T

->

isDependentType

() || ET->getDecl()->getPromotionType().isNull() ||

1911

ET->getDecl()->isScoped())

1929 bool

NeedsPreferredAlignment)

const

{

1932 if

(

unsigned

Align = TT->getDecl()->getMaxAlignment())

1943 if

(

unsigned

Align = TT->getDecl()->getMaxAlignment())

1948 return

TT->getDecl()->getMaxAlignment();

1954

TypeInfoMap::iterator I = MemoizedTypeInfo.find(

T

);

1955 if

(I != MemoizedTypeInfo.end())

1960

MemoizedTypeInfo[

T

] = TI;

1970TypeInfo

ASTContext::getTypeInfoImpl(

const Type

*

T

)

const

{

1976#define TYPE(Class, Base) 1977#define ABSTRACT_TYPE(Class, Base) 1978#define NON_CANONICAL_TYPE(Class, Base) 1979#define DEPENDENT_TYPE(Class, Base) case Type::Class: 1980#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) \ 1982 assert(!T->isDependentType() && "should not see dependent types here"

); \

1983

return getTypeInfo(cast<Class##Type>(T)->desugar().getTypePtr());

1984#include "clang/AST/TypeNodes.inc" 1985

llvm_unreachable(

"Should not see dependent types"

);

1987 case

Type::FunctionNoProto:

1988 case

Type::FunctionProto:

1994 case

Type::IncompleteArray:

1995 case

Type::VariableArray:

1996 case

Type::ConstantArray:

1997 case

Type::ArrayParameter: {

2000 if

(

const auto

*CAT = dyn_cast<ConstantArrayType>(

T

))

2001

Size = CAT->getZExtSize();

2004

assert((Size == 0 || EltInfo.

Width

<= (uint64_t)(-1) / Size) &&

2005 "Overflow in array type bit size evaluation"

);

2006

Width = EltInfo.

Width

* Size;

2007

Align = EltInfo.

Align

;

2011

Width = llvm::alignTo(Width, Align);

2015 case

Type::ExtVector:

2016 case

Type::Vector: {

2017 const auto

*VT = cast<VectorType>(

T

);

2019

Width = VT->isExtVectorBoolType() ? VT->getNumElements()

2020

: EltInfo.

Width

* VT->getNumElements();

2022

Width = std::max<unsigned>(8, Width);

2023

Align = std::max<unsigned>(8, Width);

2027 if

(Align & (Align-1)) {

2028

Align = llvm::bit_ceil(Align);

2029

Width = llvm::alignTo(Width, Align);

2033 if

(TargetVectorAlign && TargetVectorAlign < Align)

2034

Align = TargetVectorAlign;

2048

Align = std::min<unsigned>(64, Width);

2052 case

Type::ConstantMatrix: {

2053 const auto

*MT = cast<ConstantMatrixType>(

T

);

2058

Width = ElementInfo.

Width

* MT->getNumRows() * MT->getNumColumns();

2059

Align = ElementInfo.

Align

;

2064 switch

(cast<BuiltinType>(

T

)->

getKind

()) {

2065 default

: llvm_unreachable(

"Unknown builtin type!"

);

2066 case

BuiltinType::Void:

2071 case

BuiltinType::Bool:

2072

Width =

Target

->getBoolWidth();

2073

Align =

Target

->getBoolAlign();

2075 case

BuiltinType::Char_S:

2076 case

BuiltinType::Char_U:

2077 case

BuiltinType::UChar:

2078 case

BuiltinType::SChar:

2079 case

BuiltinType::Char8:

2080

Width =

Target

->getCharWidth();

2081

Align =

Target

->getCharAlign();

2083 case

BuiltinType::WChar_S:

2084 case

BuiltinType::WChar_U:

2085

Width =

Target

->getWCharWidth();

2086

Align =

Target

->getWCharAlign();

2088 case

BuiltinType::Char16:

2089

Width =

Target

->getChar16Width();

2090

Align =

Target

->getChar16Align();

2092 case

BuiltinType::Char32:

2093

Width =

Target

->getChar32Width();

2094

Align =

Target

->getChar32Align();

2096 case

BuiltinType::UShort:

2097 case

BuiltinType::Short:

2098

Width =

Target

->getShortWidth();

2099

Align =

Target

->getShortAlign();

2101 case

BuiltinType::UInt:

2102 case

BuiltinType::Int:

2103

Width =

Target

->getIntWidth();

2104

Align =

Target

->getIntAlign();

2106 case

BuiltinType::ULong:

2107 case

BuiltinType::Long:

2108

Width =

Target

->getLongWidth();

2109

Align =

Target

->getLongAlign();

2111 case

BuiltinType::ULongLong:

2112 case

BuiltinType::LongLong:

2113

Width =

Target

->getLongLongWidth();

2114

Align =

Target

->getLongLongAlign();

2116 case

BuiltinType::Int128:

2117 case

BuiltinType::UInt128:

2119

Align =

Target

->getInt128Align();

2121 case

BuiltinType::ShortAccum:

2122 case

BuiltinType::UShortAccum:

2123 case

BuiltinType::SatShortAccum:

2124 case

BuiltinType::SatUShortAccum:

2125

Width =

Target

->getShortAccumWidth();

2126

Align =

Target

->getShortAccumAlign();

2128 case

BuiltinType::Accum:

2129 case

BuiltinType::UAccum:

2130 case

BuiltinType::SatAccum:

2131 case

BuiltinType::SatUAccum:

2132

Width =

Target

->getAccumWidth();

2133

Align =

Target

->getAccumAlign();

2135 case

BuiltinType::LongAccum:

2136 case

BuiltinType::ULongAccum:

2137 case

BuiltinType::SatLongAccum:

2138 case

BuiltinType::SatULongAccum:

2139

Width =

Target

->getLongAccumWidth();

2140

Align =

Target

->getLongAccumAlign();

2142 case

BuiltinType::ShortFract:

2143 case

BuiltinType::UShortFract:

2144 case

BuiltinType::SatShortFract:

2145 case

BuiltinType::SatUShortFract:

2146

Width =

Target

->getShortFractWidth();

2147

Align =

Target

->getShortFractAlign();

2149 case

BuiltinType::Fract:

2150 case

BuiltinType::UFract:

2151 case

BuiltinType::SatFract:

2152 case

BuiltinType::SatUFract:

2153

Width =

Target

->getFractWidth();

2154

Align =

Target

->getFractAlign();

2156 case

BuiltinType::LongFract:

2157 case

BuiltinType::ULongFract:

2158 case

BuiltinType::SatLongFract:

2159 case

BuiltinType::SatULongFract:

2160

Width =

Target

->getLongFractWidth();

2161

Align =

Target

->getLongFractAlign();

2163 case

BuiltinType::BFloat16:

2164 if

(

Target

->hasBFloat16Type()) {

2165

Width =

Target

->getBFloat16Width();

2166

Align =

Target

->getBFloat16Align();

2175 case

BuiltinType::Float16:

2176 case

BuiltinType::Half:

2179

Width =

Target

->getHalfWidth();

2180

Align =

Target

->getHalfAlign();

2183 "Expected OpenMP device compilation."

);

2188 case

BuiltinType::Float:

2189

Width =

Target

->getFloatWidth();

2190

Align =

Target

->getFloatAlign();

2192 case

BuiltinType::Double:

2193

Width =

Target

->getDoubleWidth();

2194

Align =

Target

->getDoubleAlign();

2196 case

BuiltinType::Ibm128:

2197

Width =

Target

->getIbm128Width();

2198

Align =

Target

->getIbm128Align();

2200 case

BuiltinType::LongDouble:

2207

Width =

Target

->getLongDoubleWidth();

2208

Align =

Target

->getLongDoubleAlign();

2211 case

BuiltinType::Float128:

2214

Width =

Target

->getFloat128Width();

2215

Align =

Target

->getFloat128Align();

2218 "Expected OpenMP device compilation."

);

2223 case

BuiltinType::NullPtr:

2228 case

BuiltinType::ObjCId:

2229 case

BuiltinType::ObjCClass:

2230 case

BuiltinType::ObjCSel:

2234 case

BuiltinType::OCLSampler:

2235 case

BuiltinType::OCLEvent:

2236 case

BuiltinType::OCLClkEvent:

2237 case

BuiltinType::OCLQueue:

2238 case

BuiltinType::OCLReserveID:

2239#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 2240 case BuiltinType::Id: 2241#include "clang/Basic/OpenCLImageTypes.def" 2242#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 2243 case BuiltinType::Id: 2244#include "clang/Basic/OpenCLExtensionTypes.def" 2246

Width =

Target

->getPointerWidth(AS);

2247

Align =

Target

->getPointerAlign(AS);

2257#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ 2258 case BuiltinType::Id: \ 2262#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \ 2263 case BuiltinType::Id: \ 2267#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \ 2268 case BuiltinType::Id: \ 2272#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \ 2273 case BuiltinType::Id: \ 2277#include "clang/Basic/AArch64SVEACLETypes.def" 2278#define PPC_VECTOR_TYPE(Name, Id, Size) \ 2279 case BuiltinType::Id: \ 2283#include "clang/Basic/PPCTypes.def" 2284#define RVV_VECTOR_TYPE(Name, Id, SingletonId, ElKind, ElBits, NF, IsSigned, \ 2286 case BuiltinType::Id: \ 2290#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, ElKind) \ 2291 case BuiltinType::Id: \ 2295#include "clang/Basic/RISCVVTypes.def" 2296#define WASM_TYPE(Name, Id, SingletonId) \ 2297 case BuiltinType::Id: \ 2301#include "clang/Basic/WebAssemblyReferenceTypes.def" 2302#define AMDGPU_TYPE(NAME, ID, SINGLETONID, WIDTH, ALIGN) \ 2303 case BuiltinType::ID: \ 2307#include "clang/Basic/AMDGPUTypes.def" 2308#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 2309#include "clang/Basic/HLSLIntangibleTypes.def" 2315 case

Type::ObjCObjectPointer:

2319 case

Type::BlockPointer:

2320

AS = cast<BlockPointerType>(

T

)->getPointeeType().getAddressSpace();

2321

Width =

Target

->getPointerWidth(AS);

2322

Align =

Target

->getPointerAlign(AS);

2324 case

Type::LValueReference:

2325 case

Type::RValueReference:

2328

AS = cast<ReferenceType>(

T

)->getPointeeType().getAddressSpace();

2329

Width =

Target

->getPointerWidth(AS);

2330

Align =

Target

->getPointerAlign(AS);

2333

AS = cast<PointerType>(

T

)->getPointeeType().getAddressSpace();

2334

Width =

Target

->getPointerWidth(AS);

2335

Align =

Target

->getPointerAlign(AS);

2337 case

Type::MemberPointer: {

2338 const auto

*MPT = cast<MemberPointerType>(

T

);

2340

Width = MPI.

Width

;

2341

Align = MPI.

Align

;

2344 case

Type::Complex: {

2348

Width = EltInfo.

Width

* 2;

2349

Align = EltInfo.

Align

;

2352 case

Type::ObjCObject:

2353 return getTypeInfo

(cast<ObjCObjectType>(

T

)->getBaseType().getTypePtr());

2354 case

Type::Adjusted:

2357 case

Type::ObjCInterface: {

2358 const auto

*ObjCI = cast<ObjCInterfaceType>(

T

);

2359 if

(ObjCI->getDecl()->isInvalidDecl()) {

2369 case

Type::BitInt: {

2370 const auto

*EIT = cast<BitIntType>(

T

);

2371

Align =

Target

->getBitIntAlign(EIT->getNumBits());

2372

Width =

Target

->getBitIntWidth(EIT->getNumBits());

2377 const auto

*TT = cast<TagType>(

T

);

2379 if

(TT->getDecl()->isInvalidDecl()) {

2385 if

(

const auto

*ET = dyn_cast<EnumType>(TT)) {

2386 const EnumDecl

*ED = ET->getDecl();

2390

Info.

Align

= AttrAlign;

2396 const auto

*RT = cast<RecordType>(TT);

2401

AlignRequirement = RD->

hasAttr

<AlignedAttr>()

2407 case

Type::SubstTemplateTypeParm:

2408 return getTypeInfo

(cast<SubstTemplateTypeParmType>(

T

)->

2409

getReplacementType().getTypePtr());

2412 case

Type::DeducedTemplateSpecialization: {

2413 const auto

*A = cast<DeducedType>(

T

);

2414

assert(!A->getDeducedType().isNull() &&

2415 "cannot request the size of an undeduced or dependent auto type"

);

2416 return getTypeInfo

(A->getDeducedType().getTypePtr());

2420 return getTypeInfo

(cast<ParenType>(

T

)->getInnerType().getTypePtr());

2422 case

Type::MacroQualified:

2426 case

Type::ObjCTypeParam:

2427 return getTypeInfo

(cast<ObjCTypeParamType>(

T

)->desugar().getTypePtr());

2430 return getTypeInfo

(cast<UsingType>(

T

)->desugar().getTypePtr());

2432 case

Type::Typedef: {

2433 const auto

*TT = cast<TypedefType>(

T

);

2438 if

(

unsigned

AttrAlign = TT->getDecl()->getMaxAlignment()) {

2442

Align = Info.

Align

;

2445

Width = Info.

Width

;

2449 case

Type::Elaborated:

2450 return getTypeInfo

(cast<ElaboratedType>(

T

)->getNamedType().getTypePtr());

2452 case

Type::Attributed:

2454

cast<AttributedType>(

T

)->getEquivalentType().getTypePtr());

2456 case

Type::CountAttributed:

2457 return getTypeInfo

(cast<CountAttributedType>(

T

)->desugar().getTypePtr());

2459 case

Type::BTFTagAttributed:

2461

cast<BTFTagAttributedType>(

T

)->getWrappedType().getTypePtr());

2463 case

Type::HLSLAttributedResource:

2465

cast<HLSLAttributedResourceType>(

T

)->getWrappedType().getTypePtr());

2467 case

Type::Atomic: {

2470

Width = Info.

Width

;

2471

Align = Info.

Align

;

2476

Width =

Target

->getCharWidth();

2478

}

else if

(Width <= Target->getMaxAtomicPromoteWidth()) {

2484

Width = llvm::bit_ceil(Width);

2487

Align =

static_cast<unsigned>

(Width);

2498

assert(llvm::isPowerOf2_32(Align) &&

"Alignment must be power of 2"

);

2499 return TypeInfo

(Width, Align, AlignRequirement);

2503

UnadjustedAlignMap::iterator I = MemoizedUnadjustedAlign.find(

T

);

2504 if

(I != MemoizedUnadjustedAlign.end())

2507 unsigned

UnadjustedAlign;

2519

MemoizedUnadjustedAlign[

T

] = UnadjustedAlign;

2520 return

UnadjustedAlign;

2524 unsigned

SimdAlign = llvm::OpenMPIRBuilder::getOpenMPDefaultSimdAlign(

2574 unsigned

ABIAlign = TI.

Align

;

2582 if

(!

Target

->allowsLargerPreferedTypeAlignment())

2596 unsigned

PreferredAlign =

static_cast<unsigned>

(

2598

assert(PreferredAlign >= ABIAlign &&

2599 "PreferredAlign should be at least as large as ABIAlign."

);

2600 return

PreferredAlign;

2607 T

= CT->getElementType().getTypePtr();

2609 T

= ET->getDecl()->getIntegerType().getTypePtr();

2614 Target

->defaultsToAIXPowerAlignment()))

2618 return

std::max(ABIAlign, (

unsigned

)

getTypeSize

(

T

));

2669 for

(

unsigned

I = 0, N =

Path

.size(); I != N; ++I) {

2673

std::swap(

Base

, Derived);

2693

llvm::append_range(Ivars, OI->

ivars

());

2696 for

(

const ObjCIvarDecl

*Iv = IDecl->all_declared_ivar_begin(); Iv;

2698

Ivars.push_back(Iv);

2706 if

(

const auto

*OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) {

2709 for

(

auto

*Proto : OI->all_referenced_protocols()) {

2714 for

(

const auto

*Cat : OI->visible_categories())

2720

SD = SD->getSuperClass();

2722

}

else if

(

const auto

*OC = dyn_cast<ObjCCategoryDecl>(CDecl)) {

2723 for

(

auto

*Proto : OC->protocols()) {

2726

}

else if

(

const auto

*OP = dyn_cast<ObjCProtocolDecl>(CDecl)) {

2728 if

(!Protocols.insert(

2732 for

(

auto

*Proto : OP->protocols())

2739 bool

CheckIfTriviallyCopyable) {

2740

assert(RD->

isUnion

() &&

"Must be union type"

);

2743 for

(

const auto

*Field : RD->

fields

()) {

2745

CheckIfTriviallyCopyable))

2748 if

(FieldSize != UnionSize)

2766static

std::optional<int64_t>

2769 bool

CheckIfTriviallyCopyable);

2771static

std::optional<int64_t>

2773 bool

CheckIfTriviallyCopyable) {

2774 if

(Field->getType()->isRecordType()) {

2775 const RecordDecl

*RD = Field->getType()->getAsRecordDecl();

2778

CheckIfTriviallyCopyable);

2783 bool

IsBitIntType = Field->getType()->isBitIntType();

2784 if

(!Field->getType()->isReferenceType() && !IsBitIntType &&

2786

CheckIfTriviallyCopyable))

2787 return

std::nullopt;

2789

int64_t FieldSizeInBits =

2791 if

(Field->isBitField()) {

2794 if

(Field->isUnnamedBitField())

2797

int64_t BitfieldSize = Field->getBitWidthValue();

2799 if

((

unsigned

)BitfieldSize >

2800

cast<BitIntType>(Field->getType())->getNumBits())

2801 return

std::nullopt;

2802

}

else if

(BitfieldSize > FieldSizeInBits) {

2803 return

std::nullopt;

2805

FieldSizeInBits = BitfieldSize;

2807

Field->getType(), CheckIfTriviallyCopyable)) {

2808 return

std::nullopt;

2810 return

FieldSizeInBits;

2813static

std::optional<int64_t>

2815 bool

CheckIfTriviallyCopyable) {

2817

CheckIfTriviallyCopyable);

2820template

<

typename

RangeT>

2822 const

RangeT &Subobjects, int64_t CurOffsetInBits,

2824 bool

CheckIfTriviallyCopyable) {

2825 for

(

const auto

*Subobject : Subobjects) {

2826

std::optional<int64_t> SizeInBits =

2829 return

std::nullopt;

2830 if

(*SizeInBits != 0) {

2832 if

(Offset != CurOffsetInBits)

2833 return

std::nullopt;

2834

CurOffsetInBits += *SizeInBits;

2837 return

CurOffsetInBits;

2840static

std::optional<int64_t>

2843 bool

CheckIfTriviallyCopyable) {

2844

assert(!RD->

isUnion

() &&

"Must be struct/class type"

);

2847

int64_t CurOffsetInBits = 0;

2848 if

(

const auto

*ClassDecl = dyn_cast<CXXRecordDecl>(RD)) {

2849 if

(ClassDecl->isDynamicClass())

2850 return

std::nullopt;

2853 for

(

const auto

&

Base

: ClassDecl->bases()) {

2856

Bases.emplace_back(

Base

.getType()->getAsCXXRecordDecl());

2860 return

Layout.getBaseClassOffset(L) < Layout.getBaseClassOffset(R);

2863

std::optional<int64_t> OffsetAfterBases =

2865

Bases, CurOffsetInBits, Context, Layout, CheckIfTriviallyCopyable);

2866 if

(!OffsetAfterBases)

2867 return

std::nullopt;

2868

CurOffsetInBits = *OffsetAfterBases;

2871

std::optional<int64_t> OffsetAfterFields =

2873

RD->

fields

(), CurOffsetInBits, Context, Layout,

2874

CheckIfTriviallyCopyable);

2875 if

(!OffsetAfterFields)

2876 return

std::nullopt;

2877

CurOffsetInBits = *OffsetAfterFields;

2879 return

CurOffsetInBits;

2883 QualType

Ty,

bool

CheckIfTriviallyCopyable)

const

{

2900

assert(!Ty.

isNull

() &&

"Null QualType sent to unique object rep check"

);

2905

CheckIfTriviallyCopyable);

2908 "hasUniqueObjectRepresentations should not be called with an " 2909 "incomplete type"

);

2929 return

!ABI->getMemberPointerInfo(MPT).HasPadding;

2934 if

(

Record

->isInvalidDecl())

2939

CheckIfTriviallyCopyable);

2942

*

this

,

Record

, CheckIfTriviallyCopyable);

2944 return

StructSize && *StructSize ==

static_cast<

int64_t

>

(

getTypeSize

(Ty));

2965

count += Ext->ivar_size();

2970

count += ImplDecl->ivar_size();

2988 if

(isa<GNUNullExpr>(

E

))

return true

;

2996

llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator

2997

I = ObjCImpls.find(

D

);

2998 if

(I != ObjCImpls.end())

2999 return

cast<ObjCImplementationDecl>(I->second);

3006

llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator

3007

I = ObjCImpls.find(

D

);

3008 if

(I != ObjCImpls.end())

3009 return

cast<ObjCCategoryImplDecl>(I->second);

3016

assert(IFaceD && ImplD &&

"Passed null params"

);

3017

ObjCImpls[IFaceD] = ImplD;

3023

assert(CatD && ImplD &&

"Passed null params"

);

3024

ObjCImpls[CatD] = ImplD;

3029 return

ObjCMethodRedecls.lookup(MD);

3035

ObjCMethodRedecls[MD] = Redecl;

3040 if

(

const auto

*ID = dyn_cast<ObjCInterfaceDecl>(ND->

getDeclContext

()))

3042 if

(

const auto

*CD = dyn_cast<ObjCCategoryDecl>(ND->

getDeclContext

()))

3043 return

CD->getClassInterface();

3044 if

(

const auto

*IMD = dyn_cast<ObjCImplDecl>(ND->

getDeclContext

()))

3045 return

IMD->getClassInterface();

3053

assert(VD &&

"Passed null params"

);

3054

assert(VD->

hasAttr

<BlocksAttr>() &&

3055 "getBlockVarCopyInits - not __block var"

);

3056 auto

I = BlockVarCopyInits.find(VD);

3057 if

(I != BlockVarCopyInits.end())

3059 return

{

nullptr

,

false

};

3065

assert(VD && CopyExpr &&

"Passed null params"

);

3066

assert(VD->

hasAttr

<BlocksAttr>() &&

3067 "setBlockVarCopyInits - not __block var"

);

3068

BlockVarCopyInits[VD].setExprAndFlag(CopyExpr,

CanThrow

);

3072 unsigned

DataSize)

const

{

3077 "incorrect data size provided to CreateTypeSourceInfo!"

);

3094 return

getObjCLayout(

D

,

nullptr

);

3100 return

getObjCLayout(

D

->getClassInterface(),

D

);

3105 bool

&AnyNonCanonArgs) {

3107 for

(

auto

&Arg : CanonArgs) {

3109

Arg =

C

.getCanonicalTemplateArgument(Arg);

3110

AnyNonCanonArgs |= !Arg.structurallyEquals(OrigArg);

3120

ASTContext::getExtQualType(

const Type

*baseType,

Qualifiers

quals)

const

{

3125

llvm::FoldingSetNodeID

ID

;

3127 void

*insertPos =

nullptr

;

3128 if

(

ExtQuals

*eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) {

3129

assert(eq->getQualifiers() == quals);

3138

canon = getExtQualType(canonSplit.

Ty

, canonSplit.

Quals

);

3141

(void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos);

3144 auto

*eq =

new

(*

this

,

alignof

(

ExtQuals

))

ExtQuals

(baseType, canon, quals);

3145

ExtQualNodes.InsertNode(eq, insertPos);

3150 LangAS

AddressSpace)

const

{

3163 "Type cannot be in multiple addr spaces!"

);

3166 return

getExtQualType(TypeNode, Quals);

3172 if

(!

T

.hasAddressSpace())

3176 const Type

*TypeNode;

3181

TypeNode =

T

.getTypePtr();

3185 while

(

T

.hasAddressSpace()) {

3186

TypeNode = Quals.

strip

(

T

);

3190 if

(!

QualType

(TypeNode, 0).hasAddressSpace())

3194 T

=

T

.getSingleStepDesugaredType(*

this

);

3204 return

getExtQualType(TypeNode, Quals);

3212 "Attempted to get vtable pointer discriminator on a monomorphic type"

);

3215

llvm::raw_svector_ostream Out(Str);

3216

MC->mangleCXXVTable(RD, Out);

3217 return

llvm::getPointerAuthStableSipHash(Str);

3246

Ctx, OS, cast<AtomicType>(

T

)->getValueType());

3248 case

Type::LValueReference:

3253 case

Type::RValueReference:

3267 case

Type::ObjCObjectPointer:

3268 case

Type::BlockPointer:

3275

Ctx, OS, cast<ComplexType>(

T

)->getElementType());

3277 case

Type::VariableArray:

3278 case

Type::ConstantArray:

3279 case

Type::IncompleteArray:

3280 case

Type::ArrayParameter:

3291

Ctx, OS, cast<ArrayType>(

T

)->getElementType());

3293 case

Type::ObjCInterface:

3294 case

Type::ObjCObject:

3295

OS <<

"<objc_object>"

;

3304 QualType

UnderlyingType = cast<EnumType>(

T

)->getDecl()->getIntegerType();

3306

Ctx, OS, UnderlyingType.

isNull

() ? Ctx.

IntTy

: UnderlyingType);

3309 case

Type::FunctionNoProto:

3310 case

Type::FunctionProto: {

3324 const auto

*FuncType = cast<FunctionType>(

T

);

3326 if

(

const auto

*FPT = dyn_cast<FunctionProtoType>(FuncType)) {

3327 for

(

QualType

Param : FPT->param_types()) {

3331 if

(FPT->isVariadic())

3338 case

Type::MemberPointer: {

3345 case

Type::ExtVector:

3353 case

Type::ConstantMatrix:

3357 case

Type::Builtin: {

3359 switch

(BTy->getKind()) {

3360#define SIGNED_TYPE(Id, SingletonId) \ 3361 case BuiltinType::Id: \ 3364#define UNSIGNED_TYPE(Id, SingletonId) \ 3365 case BuiltinType::Id: \ 3368#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 3369#define BUILTIN_TYPE(Id, SingletonId) 3370#include "clang/AST/BuiltinTypes.def" 3371

llvm_unreachable(

"placeholder types should not appear here."

);

3373 case

BuiltinType::Half:

3376 case

BuiltinType::Float:

3379 case

BuiltinType::Double:

3382 case

BuiltinType::LongDouble:

3385 case

BuiltinType::Float16:

3388 case

BuiltinType::Float128:

3392 case

BuiltinType::Void:

3396 case

BuiltinType::ObjCId:

3397 case

BuiltinType::ObjCClass:

3398 case

BuiltinType::ObjCSel:

3399 case

BuiltinType::NullPtr:

3404 case

BuiltinType::OCLSampler:

3405 case

BuiltinType::OCLEvent:

3406 case

BuiltinType::OCLClkEvent:

3407 case

BuiltinType::OCLQueue:

3408 case

BuiltinType::OCLReserveID:

3409 case

BuiltinType::BFloat16:

3410 case

BuiltinType::VectorQuad:

3411 case

BuiltinType::VectorPair:

3416 case

BuiltinType::Ibm128:

3418#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 3419 case BuiltinType::Id: \ 3421#include "clang/Basic/OpenCLImageTypes.def" 3422#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 3423 case BuiltinType::Id: \ 3425#include "clang/Basic/OpenCLExtensionTypes.def" 3426#define SVE_TYPE(Name, Id, SingletonId) \ 3427 case BuiltinType::Id: \ 3429#include "clang/Basic/AArch64SVEACLETypes.def" 3430#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \ 3431 case BuiltinType::Id: \ 3433#include "clang/Basic/HLSLIntangibleTypes.def" 3434 case

BuiltinType::Dependent:

3435

llvm_unreachable(

"should never get here"

);

3436#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id: 3437#include "clang/Basic/AMDGPUTypes.def" 3438 case

BuiltinType::WasmExternRef:

3439#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 3440#include "clang/Basic/RISCVVTypes.def" 3441

llvm_unreachable(

"not yet implemented"

);

3443

llvm_unreachable(

"should never get here"

);

3445 case

Type::Record: {

3466

II = Typedef->getDeclName().getAsIdentifierInfo();

3469

OS <<

"<anonymous_record>"

;

3475 case

Type::HLSLAttributedResource:

3476

llvm_unreachable(

"should never get here"

);

3478 case

Type::DeducedTemplateSpecialization:

3480#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 3481#define DEPENDENT_TYPE(Class, Base) case Type::Class: 3482#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 3483#define ABSTRACT_TYPE(Class, Base) 3484#define TYPE(Class, Base) 3485#include "clang/AST/TypeNodes.inc" 3486

llvm_unreachable(

"unexpected non-canonical or dependent type!"

);

3493 "cannot compute type discriminator of a dependent type"

);

3496

llvm::raw_svector_ostream Out(Str);

3504 T

=

T

.getUnqualifiedType();

3525 if

(MPT->isMemberFunctionPointer()) {

3534

MC->mangleCanonicalTypeName(

T

, Out);

3537 return

llvm::getPointerAuthStableSipHash(Str);

3562 "Type cannot have multiple ObjCGCs!"

);

3565 return

getExtQualType(TypeNode, Quals);

3579 QualType

WrappedTy,

Expr

*CountExpr,

bool

CountInBytes,

bool

OrNull,

3583

llvm::FoldingSetNodeID ID;

3586 void

*InsertPos =

nullptr

;

3588

CountAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);

3593 size_t

Size = CountAttributedType::totalSizeToAlloc<TypeCoupledDeclRefInfo>(

3594

DependentDecls.size());

3597

OrNull, DependentDecls);

3598

Types.push_back(CATy);

3599

CountAttributedTypes.InsertNode(CATy, InsertPos);

3608 case

Type::Attributed: {

3609 const auto

*AT = cast<AttributedType>(Orig);

3612 adjustType

(AT->getEquivalentType(), Adjust),

3616 case

Type::BTFTagAttributed: {

3617 const auto

*BTFT = dyn_cast<BTFTagAttributedType>(Orig);

3619 adjustType

(BTFT->getWrappedType(), Adjust));

3622 case

Type::Elaborated: {

3623 const auto

*ET = cast<ElaboratedType>(Orig);

3630 adjustType

(cast<ParenType>(Orig)->getInnerType(), Adjust));

3632 case

Type::Adjusted: {

3633 const auto

*AT = cast<AdjustedType>(Orig);

3638 case

Type::MacroQualified: {

3639 const auto

*MQT = cast<MacroQualifiedType>(Orig);

3641

MQT->getMacroIdentifier());

3645 return

Adjust(Orig);

3655 if

(

const auto

*FNPT = dyn_cast<FunctionNoProtoType>(

T

)) {

3658 const auto

*FPT = cast<FunctionProtoType>(

T

);

3664 return

cast<FunctionType>(

Result

.getTypePtr());

3675

FPT->getExtProtoInfo());

3690

L->DeducedReturnType(FD, ResultType);

3701 return getFunctionType

(Proto->getReturnType(), Proto->getParamTypes(),

3702

Proto->getExtProtoInfo().withExceptionSpec(ESI));

3718 for

(

unsigned

i = 0, n = Args.size(); i != n; ++i)

3741 return getFunctionType

(Proto->getReturnType(), Proto->param_types(), EPI);

3767 if

(TSInfo->getType() != FD->

getType

())

3775 "TypeLoc size mismatch from updating exception specification"

);

3776

TSInfo->overrideType(Updated);

3785

llvm::FoldingSetNodeID ID;

3788 void

*InsertPos =

nullptr

;

3789 if

(

ComplexType

*CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos))

3795 if

(!

T

.isCanonical()) {

3799 ComplexType

*NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos);

3800

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

3803

Types.push_back(New);

3804

ComplexTypes.InsertNode(New, InsertPos);

3813

llvm::FoldingSetNodeID ID;

3816 void

*InsertPos =

nullptr

;

3817 if

(

PointerType

*PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos))

3823 if

(!

T

.isCanonical()) {

3827 PointerType

*NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos);

3828

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

3831

Types.push_back(New);

3832

PointerTypes.InsertNode(New, InsertPos);

3837

llvm::FoldingSetNodeID ID;

3839 void

*InsertPos =

nullptr

;

3840 AdjustedType

*AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);

3847

AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);

3848

assert(!AT &&

"Shouldn't be in the map!"

);

3852

Types.push_back(AT);

3853

AdjustedTypes.InsertNode(AT, InsertPos);

3858

llvm::FoldingSetNodeID ID;

3860 void

*InsertPos =

nullptr

;

3861 AdjustedType

*AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);

3868

AT = AdjustedTypes.FindNodeOrInsertPos(ID, InsertPos);

3869

assert(!AT &&

"Shouldn't be in the map!"

);

3872

Types.push_back(AT);

3873

AdjustedTypes.InsertNode(AT, InsertPos);

3904 const auto

*ATy = cast<ConstantArrayType>(Ty);

3905

llvm::FoldingSetNodeID ID;

3906

ATy->Profile(ID, *

this

, ATy->getElementType(), ATy->getZExtSize(),

3907

ATy->getSizeExpr(), ATy->getSizeModifier(),

3908

ATy->getIndexTypeQualifiers().getAsOpaqueValue());

3909 void

*InsertPos =

nullptr

;

3911

ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);

3920

AT = ArrayParameterTypes.FindNodeOrInsertPos(ID, InsertPos);

3921

assert(!AT &&

"Shouldn't be in the map!"

);

3926

Types.push_back(AT);

3927

ArrayParameterTypes.InsertNode(AT, InsertPos);

3937

llvm::FoldingSetNodeID ID;

3940 void

*InsertPos =

nullptr

;

3942

BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos))

3948 if

(!

T

.isCanonical()) {

3953

BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos);

3954

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

3958

Types.push_back(New);

3959

BlockPointerTypes.InsertNode(New, InsertPos);

3969 "Unresolved placeholder type"

);

3973

llvm::FoldingSetNodeID ID;

3976 void

*InsertPos =

nullptr

;

3978

LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))

3986 if

(!SpelledAsLValue || InnerRef || !

T

.isCanonical()) {

3987 QualType

PointeeType = (InnerRef ? InnerRef->getPointeeType() :

T

);

3992

LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);

3993

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

3998

Types.push_back(New);

3999

LValueReferenceTypes.InsertNode(New, InsertPos);

4009 "Unresolved placeholder type"

);

4013

llvm::FoldingSetNodeID ID;

4016 void

*InsertPos =

nullptr

;

4018

RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos))

4026 if

(InnerRef || !

T

.isCanonical()) {

4027 QualType

PointeeType = (InnerRef ? InnerRef->getPointeeType() :

T

);

4032

RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos);

4033

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4038

Types.push_back(New);

4039

RValueReferenceTypes.InsertNode(New, InsertPos);

4048

llvm::FoldingSetNodeID ID;

4051 void

*InsertPos =

nullptr

;

4053

MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos))

4064

MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos);

4065

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4069

Types.push_back(New);

4070

MemberPointerTypes.InsertNode(New, InsertPos);

4077 const

llvm::APInt &ArySizeIn,

4078 const Expr

*SizeExpr,

4080 unsigned

IndexTypeQuals)

const

{

4083 "Constant array of VLAs is illegal!"

);

4087

SizeExpr =

nullptr

;

4091

llvm::APInt ArySize(ArySizeIn);

4092

ArySize = ArySize.zextOrTrunc(

Target

->getMaxPointerWidth());

4094

llvm::FoldingSetNodeID ID;

4096

ASM, IndexTypeQuals);

4098 void

*InsertPos =

nullptr

;

4100

ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos))

4111

ASM, IndexTypeQuals);

4116

ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos);

4117

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4120 auto

*New = ConstantArrayType::Create(*

this

, EltTy, Canon, ArySize, SizeExpr,

4121

ASM, IndexTypeQuals);

4122

ConstantArrayTypes.InsertNode(New, InsertPos);

4123

Types.push_back(New);

4132 if

(!

type

->isVariablyModifiedType())

return type

;

4137 const Type

*ty = split.

Ty

;

4139#define TYPE(Class, Base) 4140#define ABSTRACT_TYPE(Class, Base) 4141#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 4142#include "clang/AST/TypeNodes.inc" 4143

llvm_unreachable(

"didn't desugar past all non-canonical types?"

);

4149 case

Type::DependentVector:

4150 case

Type::ExtVector:

4151 case

Type::DependentSizedExtVector:

4152 case

Type::ConstantMatrix:

4153 case

Type::DependentSizedMatrix:

4154 case

Type::DependentAddressSpace:

4155 case

Type::ObjCObject:

4156 case

Type::ObjCInterface:

4157 case

Type::ObjCObjectPointer:

4160 case

Type::UnresolvedUsing:

4161 case

Type::TypeOfExpr:

4163 case

Type::Decltype:

4164 case

Type::UnaryTransform:

4165 case

Type::DependentName:

4166 case

Type::InjectedClassName:

4167 case

Type::TemplateSpecialization:

4168 case

Type::DependentTemplateSpecialization:

4169 case

Type::TemplateTypeParm:

4170 case

Type::SubstTemplateTypeParmPack:

4172 case

Type::DeducedTemplateSpecialization:

4173 case

Type::PackExpansion:

4174 case

Type::PackIndexing:

4176 case

Type::DependentBitInt:

4177 case

Type::ArrayParameter:

4178 case

Type::HLSLAttributedResource:

4179

llvm_unreachable(

"type should never be variably-modified"

);

4183 case

Type::FunctionNoProto:

4184 case

Type::FunctionProto:

4185 case

Type::BlockPointer:

4186 case

Type::MemberPointer:

4199 case

Type::LValueReference: {

4200 const auto

*lv = cast<LValueReferenceType>(ty);

4203

lv->isSpelledAsLValue());

4207 case

Type::RValueReference: {

4208 const auto

*lv = cast<RValueReferenceType>(ty);

4214 case

Type::Atomic: {

4215 const auto

*at = cast<AtomicType>(ty);

4220 case

Type::ConstantArray: {

4221 const auto

*cat = cast<ConstantArrayType>(ty);

4226

cat->getSizeModifier(),

4227

cat->getIndexTypeCVRQualifiers());

4231 case

Type::DependentSizedArray: {

4232 const auto

*dat = cast<DependentSizedArrayType>(ty);

4236

dat->getSizeModifier(),

4237

dat->getIndexTypeCVRQualifiers(),

4238

dat->getBracketsRange());

4243 case

Type::IncompleteArray: {

4244 const auto

*iat = cast<IncompleteArrayType>(ty);

4248

iat->getIndexTypeCVRQualifiers(),

SourceRange

());

4253 case

Type::VariableArray: {

4254 const auto

*vat = cast<VariableArrayType>(ty);

4258

vat->getIndexTypeCVRQualifiers(), vat->getBracketsRange());

4271 unsigned

IndexTypeQuals,

4282

IndexTypeQuals, Brackets);

4289

VariableArrayTypes.push_back(New);

4290

Types.push_back(New);

4300 unsigned

elementTypeQuals,

4304 "Size must be type- or value-dependent!"

);

4308 void

*insertPos =

nullptr

;

4309

llvm::FoldingSetNodeID ID;

4311

ID, *

this

, numElements ?

QualType

(canonElementType.

Ty

, 0) : elementType,

4312

ASM, elementTypeQuals, numElements);

4316

DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos);

4327

elementTypeQuals, brackets);

4328

DependentSizedArrayTypes.InsertNode(newType, insertPos);

4329

Types.push_back(newType);

4337

numElements, ASM, elementTypeQuals, brackets);

4338

DependentSizedArrayTypes.InsertNode(canonTy, insertPos);

4339

Types.push_back(canonTy);

4344

canonElementType.

Quals

);

4348 if

(

QualType

(canonElementType.

Ty

, 0) == elementType &&

4356

elementTypeQuals, brackets);

4357

Types.push_back(sugaredType);

4363 unsigned

elementTypeQuals)

const

{

4364

llvm::FoldingSetNodeID ID;

4367 void

*insertPos =

nullptr

;

4369

IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos))

4381

ASM, elementTypeQuals);

4386

IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos);

4387

assert(!existing &&

"Shouldn't be in the map!"

); (void) existing;

4393

IncompleteArrayTypes.InsertNode(newType, insertPos);

4394

Types.push_back(newType);

4400#define SVE_INT_ELTTY(BITS, ELTS, SIGNED, NUMVECTORS) \ 4401 {getIntTypeForBitwidth(BITS, SIGNED), llvm::ElementCount::getScalable(ELTS), \ 4404#define SVE_ELTTY(ELTTY, ELTS, NUMVECTORS) \ 4405 {ELTTY, llvm::ElementCount::getScalable(ELTS), NUMVECTORS}; 4409

llvm_unreachable(

"Unsupported builtin vector type"

);

4411#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \ 4412 ElBits, NF, IsSigned) \ 4413 case BuiltinType::Id: \ 4414 return {getIntTypeForBitwidth(ElBits, IsSigned), \ 4415 llvm::ElementCount::getScalable(NumEls), NF}; 4416#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \ 4418 case BuiltinType::Id: \ 4419 return {ElBits == 16 ? HalfTy : (ElBits == 32 ? FloatTy : DoubleTy), \ 4420 llvm::ElementCount::getScalable(NumEls), NF}; 4421#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \ 4423 case BuiltinType::Id: \ 4424 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF}; 4425#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \ 4427 case BuiltinType::Id: \ 4428 return {MFloat8Ty, llvm::ElementCount::getScalable(NumEls), NF}; 4429#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ 4430 case BuiltinType::Id: \ 4431 return {BoolTy, llvm::ElementCount::getScalable(NumEls), NF}; 4432#define SVE_TYPE(Name, Id, SingletonId) 4433#include "clang/Basic/AArch64SVEACLETypes.def" 4435#define RVV_VECTOR_TYPE_INT(Name, Id, SingletonId, NumEls, ElBits, NF, \ 4437 case BuiltinType::Id: \ 4438 return {getIntTypeForBitwidth(ElBits, IsSigned), \ 4439 llvm::ElementCount::getScalable(NumEls), NF}; 4440#define RVV_VECTOR_TYPE_FLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \ 4441 case BuiltinType::Id: \ 4442 return {ElBits == 16 ? Float16Ty : (ElBits == 32 ? FloatTy : DoubleTy), \ 4443 llvm::ElementCount::getScalable(NumEls), NF}; 4444#define RVV_VECTOR_TYPE_BFLOAT(Name, Id, SingletonId, NumEls, ElBits, NF) \ 4445 case BuiltinType::Id: \ 4446 return {BFloat16Ty, llvm::ElementCount::getScalable(NumEls), NF}; 4447#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \ 4448 case BuiltinType::Id: \ 4449 return {BoolTy, llvm::ElementCount::getScalable(NumEls), 1}; 4450#include "clang/Basic/RISCVVTypes.def" 4457 if

(

Target

->getTriple().isWasm() &&

Target

->hasFeature(

"reference-types"

)) {

4458#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \ 4459 if (BuiltinType::Id == BuiltinType::WasmExternRef) \ 4461#include "clang/Basic/WebAssemblyReferenceTypes.def" 4464 "shouldn't try to generate type externref outside WebAssembly target"

);

4471 unsigned

NumFields)

const

{

4472 if

(

Target

->hasAArch64SVETypes()) {

4475#define SVE_VECTOR_TYPE_INT(Name, MangledName, Id, SingletonId, NumEls, \ 4476 ElBits, NF, IsSigned) \ 4477 if (EltTy->hasIntegerRepresentation() && !EltTy->isBooleanType() && \ 4478 EltTy->hasSignedIntegerRepresentation() == IsSigned && \ 4479 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \ 4480 return SingletonId; \ 4482#define SVE_VECTOR_TYPE_FLOAT(Name, MangledName, Id, SingletonId, NumEls, \ 4484 if (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \ 4485 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \ 4486 return SingletonId; \ 4488#define SVE_VECTOR_TYPE_BFLOAT(Name, MangledName, Id, SingletonId, NumEls, \ 4490 if (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \ 4491 EltTySize == ElBits && NumElts == (NumEls * NF) && NumFields == 1) { \ 4492 return SingletonId; \ 4494#define SVE_VECTOR_TYPE_MFLOAT(Name, MangledName, Id, SingletonId, NumEls, \ 4496 if (EltTy->isMFloat8Type() && EltTySize == ElBits && \ 4497 NumElts == (NumEls * NF) && NumFields == 1) { \ 4498 return SingletonId; \ 4500#define SVE_PREDICATE_TYPE_ALL(Name, MangledName, Id, SingletonId, NumEls, NF) \ 4501 if (EltTy->isBooleanType() && NumElts == (NumEls * NF) && NumFields == 1) \ 4503#define SVE_TYPE(Name, Id, SingletonId) 4504#include "clang/Basic/AArch64SVEACLETypes.def" 4505

}

else if

(

Target

->hasRISCVVTypes()) {

4507#define RVV_VECTOR_TYPE(Name, Id, SingletonId, NumEls, ElBits, NF, IsSigned, \ 4509 if (!EltTy->isBooleanType() && \ 4510 ((EltTy->hasIntegerRepresentation() && \ 4511 EltTy->hasSignedIntegerRepresentation() == IsSigned) || \ 4512 (EltTy->hasFloatingRepresentation() && !EltTy->isBFloat16Type() && \ 4514 (EltTy->hasFloatingRepresentation() && EltTy->isBFloat16Type() && \ 4515 IsBF && !IsFP)) && \ 4516 EltTySize == ElBits && NumElts == NumEls && NumFields == NF) \ 4518#define RVV_PREDICATE_TYPE(Name, Id, SingletonId, NumEls) \ 4519 if (EltTy->isBooleanType() && NumElts == NumEls) \ 4521#include "clang/Basic/RISCVVTypes.def" 4537

llvm::FoldingSetNodeID ID;

4540 void

*InsertPos =

nullptr

;

4541 if

(

VectorType

*VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))

4551 VectorType

*NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);

4552

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4554 auto

*New =

new

(*

this

,

alignof

(

VectorType

))

4555 VectorType

(vecType, NumElts, Canonical, VecKind);

4556

VectorTypes.InsertNode(New, InsertPos);

4557

Types.push_back(New);

4564

llvm::FoldingSetNodeID ID;

4567 void

*InsertPos =

nullptr

;

4569

DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);

4574

VecType,

QualType

(Canon, 0), SizeExpr, AttrLoc, VecKind);

4577 if

(CanonVecTy == VecType) {

4582

DependentVectorTypes.FindNodeOrInsertPos(ID, InsertPos);

4583

assert(!CanonCheck &&

4584 "Dependent-sized vector_size canonical type broken"

);

4586

DependentVectorTypes.InsertNode(New, InsertPos);

4595

Types.push_back(New);

4602 unsigned

NumElts)

const

{

4610

llvm::FoldingSetNodeID ID;

4613 void

*InsertPos =

nullptr

;

4614 if

(

VectorType

*VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos))

4624 VectorType

*NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos);

4625

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4629

VectorTypes.InsertNode(New, InsertPos);

4630

Types.push_back(New);

4638

llvm::FoldingSetNodeID ID;

4642 void

*InsertPos =

nullptr

;

4644

= DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);

4654 if

(CanonVecTy == vecType) {

4659

= DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos);

4660

assert(!CanonCheck &&

"Dependent-sized ext_vector canonical type broken"

);

4662

DependentSizedExtVectorTypes.InsertNode(New, InsertPos);

4671

Types.push_back(New);

4676 unsigned

NumColumns)

const

{

4677

llvm::FoldingSetNodeID ID;

4679

Type::ConstantMatrix);

4682 "need a valid element type"

);

4685 "need valid matrix dimensions"

);

4686 void

*InsertPos =

nullptr

;

4696

assert(!NewIP &&

"Matrix type shouldn't already exist in the map"

);

4702

MatrixTypes.InsertNode(New, InsertPos);

4703

Types.push_back(New);

4712

llvm::FoldingSetNodeID ID;

4716 void

*InsertPos =

nullptr

;

4718

DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);

4723

ColumnExpr, AttrLoc);

4726

DependentSizedMatrixTypes.FindNodeOrInsertPos(ID, InsertPos);

4727

assert(!CanonCheck &&

"Dependent-sized matrix canonical type broken"

);

4729

DependentSizedMatrixTypes.InsertNode(Canon, InsertPos);

4730

Types.push_back(Canon);

4743

ColumnExpr, AttrLoc);

4744

Types.push_back(New);

4749 Expr

*AddrSpaceExpr,

4755 void

*insertPos =

nullptr

;

4756

llvm::FoldingSetNodeID ID;

4761

DependentAddressSpaceTypes.FindNodeOrInsertPos(ID, insertPos);

4767

DependentAddressSpaceTypes.InsertNode(canonTy, insertPos);

4768

Types.push_back(canonTy);

4771 if

(canonPointeeType == PointeeType &&

4777

AddrSpaceExpr, AttrLoc);

4778

Types.push_back(sugaredType);

4784 return T

.isCanonical() &&

4802

llvm::FoldingSetNodeID ID;

4805 void

*InsertPos =

nullptr

;

4807

FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos))

4817

FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos);

4818

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4823

Types.push_back(New);

4824

FunctionNoProtoTypes.InsertNode(New, InsertPos);

4840 return

CanResultType;

4847 if

(!NoexceptInType)

4864 bool

AnyPackExpansions =

false

;

4869

AnyPackExpansions =

true

;

4871 return

AnyPackExpansions;

4877QualType

ASTContext::getFunctionTypeInternal(

4880 size_t

NumArgs = ArgArray.size();

4884

llvm::FoldingSetNodeID

ID

;

4889 bool

Unique =

false

;

4891 void

*InsertPos =

nullptr

;

4893

FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) {

4913 bool

IsCanonicalExceptionSpec =

4917 bool

isCanonical = !Unique && IsCanonicalExceptionSpec &&

4919 for

(

unsigned

i = 0; i != NumArgs && isCanonical; ++i)

4920 if

(!ArgArray[i].isCanonicalAsParam())

4921

isCanonical =

false

;

4923 if

(OnlyWantCanonical)

4924

assert(isCanonical &&

4925 "given non-canonical parameters constructing canonical type"

);

4930 if

(!isCanonical && Canonical.

isNull

()) {

4932

CanonicalArgs.reserve(NumArgs);

4933 for

(

unsigned

i = 0; i != NumArgs; ++i)

4940 if

(IsCanonicalExceptionSpec) {

4942

}

else if

(NoexceptInType) {

4955 bool

AnyPacks =

false

;

4978

llvm_unreachable(

"dependent noexcept is already canonical"

);

4987

getFunctionTypeInternal(CanResultTy, CanonicalArgs, CanonicalEPI,

true

);

4991

FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos);

4992

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

4997 auto

ESH = FunctionProtoType::getExceptionSpecSize(

4999 size_t Size

= FunctionProtoType::totalSizeToAlloc<

5006

ESH.NumExprPtr, ESH.NumFunctionDeclPtr,

5014

Types.push_back(FTP);

5016

FunctionProtoTypes.InsertNode(FTP, InsertPos);

5018

AnyFunctionEffects =

true

;

5023

llvm::FoldingSetNodeID

ID

;

5026 void

*InsertPos =

nullptr

;

5027 if

(

PipeType

*PT = PipeTypes.FindNodeOrInsertPos(ID, InsertPos))

5033 if

(!

T

.isCanonical()) {

5037 PipeType

*NewIP = PipeTypes.FindNodeOrInsertPos(ID, InsertPos);

5038

assert(!NewIP &&

"Shouldn't be in the map!"

);

5041 auto

*New =

new

(*

this

,

alignof

(

PipeType

))

PipeType

(

T

, Canonical, ReadOnly);

5042

Types.push_back(New);

5043

PipeTypes.InsertNode(New, InsertPos);

5054 return

getPipeType(

T

,

true

);

5058 return

getPipeType(

T

,

false

);

5062

llvm::FoldingSetNodeID ID;

5065 void

*InsertPos =

nullptr

;

5066 if

(

BitIntType

*EIT = BitIntTypes.FindNodeOrInsertPos(ID, InsertPos))

5070

BitIntTypes.InsertNode(New, InsertPos);

5071

Types.push_back(New);

5076 Expr

*NumBitsExpr)

const

{

5078

llvm::FoldingSetNodeID ID;

5081 void

*InsertPos =

nullptr

;

5083

DependentBitIntTypes.FindNodeOrInsertPos(ID, InsertPos))

5088

DependentBitIntTypes.InsertNode(New, InsertPos);

5090

Types.push_back(New);

5096 if

(!isa<CXXRecordDecl>(

D

))

return false

;

5097 const auto

*RD = cast<CXXRecordDecl>(

D

);

5098 if

(isa<ClassTemplatePartialSpecializationDecl>(RD))

5100 if

(RD->getDescribedClassTemplate() &&

5101

!isa<ClassTemplateSpecializationDecl>(RD))

5112 if

(

Decl

->TypeForDecl) {

5113

assert(isa<InjectedClassNameType>(

Decl

->TypeForDecl));

5115

assert(PrevDecl->TypeForDecl &&

"previous declaration has no type"

);

5116 Decl

->TypeForDecl = PrevDecl->TypeForDecl;

5117

assert(isa<InjectedClassNameType>(

Decl

->TypeForDecl));

5121 Decl

->TypeForDecl = newType;

5122

Types.push_back(newType);

5130

assert(

Decl

&&

"Passed null for Decl param"

);

5131

assert(!

Decl

->TypeForDecl &&

"TypeForDecl present in slow case"

);

5133 if

(

const auto

*Typedef = dyn_cast<TypedefNameDecl>(

Decl

))

5136

assert(!isa<TemplateTypeParmDecl>(

Decl

) &&

5137 "Template type parameter types are always available."

);

5139 if

(

const auto

*

Record

= dyn_cast<RecordDecl>(

Decl

)) {

5140

assert(

Record

->isFirstDecl() &&

"struct/union has previous declaration"

);

5143

}

else if

(

const auto

*

Enum

= dyn_cast<EnumDecl>(

Decl

)) {

5144

assert(

Enum

->isFirstDecl() &&

"enum has previous declaration"

);

5146

}

else if

(

const auto

*Using = dyn_cast<UnresolvedUsingTypenameDecl>(

Decl

)) {

5149

llvm_unreachable(

"TypeDecl without a type?"

);

5158 if

(!

Decl

->TypeForDecl) {

5159 if

(Underlying.

isNull

())

5160

Underlying =

Decl

->getUnderlyingType();

5163 Decl

->TypeForDecl = NewType;

5164

Types.push_back(NewType);

5167 if

(Underlying.

isNull

() ||

Decl

->getUnderlyingType() == Underlying)

5171

llvm::FoldingSetNodeID ID;

5174 void

*InsertPos =

nullptr

;

5175 if

(

TypedefType

*

T

= TypedefTypes.FindNodeOrInsertPos(ID, InsertPos)) {

5176

assert(!

T

->typeMatchesDecl() &&

5177 "non-divergent case should be handled with TypeDecl"

);

5181 void

*Mem =

Allocate

(TypedefType::totalSizeToAlloc<QualType>(

true

),

5183 auto

*NewType =

new

(Mem)

TypedefType

(Type::Typedef,

Decl

, Underlying,

5185

TypedefTypes.InsertNode(NewType, InsertPos);

5186

Types.push_back(NewType);

5192

llvm::FoldingSetNodeID ID;

5195 void

*InsertPos =

nullptr

;

5196 if

(

UsingType

*

T

= UsingTypes.FindNodeOrInsertPos(ID, InsertPos))

5199 const Type

*TypeForDecl =

5200

cast<TypeDecl>(

Found

->getTargetDecl())->getTypeForDecl();

5206 if

(Underlying.

getTypePtr

() == TypeForDecl)

5209 Allocate

(UsingType::totalSizeToAlloc<QualType>(!Underlying.

isNull

()),

5212

Types.push_back(NewType);

5213

UsingTypes.InsertNode(NewType, InsertPos);

5221 if

(PrevDecl->TypeForDecl)

5222 return QualType

(

Decl

->TypeForDecl = PrevDecl->TypeForDecl, 0);

5225 Decl

->TypeForDecl = newType;

5226

Types.push_back(newType);

5234 if

(PrevDecl->TypeForDecl)

5235 return QualType

(

Decl

->TypeForDecl = PrevDecl->TypeForDecl, 0);

5238 Decl

->TypeForDecl = newType;

5239

Types.push_back(newType);

5244 unsigned

NumPositiveBits,

5247 unsigned

IntWidth =

Target

->getIntWidth();

5248 unsigned

CharWidth =

Target

->getCharWidth();

5249 unsigned

ShortWidth =

Target

->getShortWidth();

5250 bool

EnumTooLarge =

false

;

5252 if

(NumNegativeBits) {

5256 if

(IsPacked && NumNegativeBits <= CharWidth &&

5257

NumPositiveBits < CharWidth) {

5259

BestWidth = CharWidth;

5260

}

else if

(IsPacked && NumNegativeBits <= ShortWidth &&

5261

NumPositiveBits < ShortWidth) {

5263

BestWidth = ShortWidth;

5264

}

else if

(NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {

5266

BestWidth = IntWidth;

5268

BestWidth =

Target

->getLongWidth();

5270 if

(NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {

5273

BestWidth =

Target

->getLongLongWidth();

5275 if

(NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)

5276

EnumTooLarge =

true

;

5280

BestPromotionType = (BestWidth <= IntWidth ?

IntTy

: BestType);

5285 if

(IsPacked && NumPositiveBits <= CharWidth) {

5287

BestPromotionType =

IntTy

;

5288

BestWidth = CharWidth;

5289

}

else if

(IsPacked && NumPositiveBits <= ShortWidth) {

5291

BestPromotionType =

IntTy

;

5292

BestWidth = ShortWidth;

5293

}

else if

(NumPositiveBits <= IntWidth) {

5295

BestWidth = IntWidth;

5296

BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)

5299

}

else if

(NumPositiveBits <= (BestWidth =

Target

->getLongWidth())) {

5301

BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)

5305

BestWidth =

Target

->getLongLongWidth();

5306 if

(NumPositiveBits > BestWidth) {

5311

EnumTooLarge =

true

;

5314

BestPromotionType = (NumPositiveBits == BestWidth || !LangOpts.CPlusPlus)

5319 return

EnumTooLarge;

5324 if

(

Decl

->TypeForDecl)

5329 if

(CanonicalDecl->TypeForDecl)

5330 return QualType

(

Decl

->TypeForDecl = CanonicalDecl->TypeForDecl, 0);

5334 Decl

->TypeForDecl = newType;

5335

Types.push_back(newType);

5342 const Attr

*attr)

const

{

5343

llvm::FoldingSetNodeID id;

5346 void

*insertPos =

nullptr

;

5350

assert(!

attr

||

attr

->getKind() == attrKind);

5356

Types.push_back(

type

);

5357

AttributedTypes.InsertNode(

type

, insertPos);

5370 switch

(nullability) {

5386

llvm_unreachable(

"Unknown nullability kind"

);

5391

llvm::FoldingSetNodeID ID;

5394 void

*InsertPos =

nullptr

;

5396

BTFTagAttributedTypes.FindNodeOrInsertPos(ID, InsertPos);

5404

Types.push_back(Ty);

5405

BTFTagAttributedTypes.InsertNode(Ty, InsertPos);

5414

llvm::FoldingSetNodeID ID;

5417 void

*InsertPos =

nullptr

;

5419

HLSLAttributedResourceTypes.FindNodeOrInsertPos(ID, InsertPos);

5426

Types.push_back(Ty);

5427

HLSLAttributedResourceTypes.InsertNode(Ty, InsertPos);

5433 QualType

Replacement,

Decl

*AssociatedDecl,

unsigned

Index,

5434

std::optional<unsigned> PackIndex,

5436

llvm::FoldingSetNodeID ID;

5439 void

*InsertPos =

nullptr

;

5441

SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);

5444 void

*Mem =

Allocate

(SubstTemplateTypeParmType::totalSizeToAlloc<QualType>(

5445

!Replacement.isCanonical()),

5448

Index, PackIndex, Flag);

5449

Types.push_back(SubstParm);

5450

SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos);

5459 unsigned

Index,

bool

Final,

5466

llvm::FoldingSetNodeID ID;

5469 void

*InsertPos =

nullptr

;

5471

SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos))

5481

[[maybe_unused]]

const auto

*Nothing =

5482

SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos);

5490

Types.push_back(SubstParm);

5491

SubstTemplateTypeParmPackTypes.InsertNode(SubstParm, InsertPos);

5501

llvm::FoldingSetNodeID ID;

5503 void

*InsertPos =

nullptr

;

5505

= TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);

5516

= TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);

5517

assert(!TypeCheck &&

"Template type parameter canonical type broken"

);

5521

Depth, Index, ParameterPack,

nullptr

,

QualType

());

5523

Types.push_back(TypeParm);

5524

TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos);

5534

assert(!Name.getAsDependentTemplateName() &&

5535 "No dependent template names here!"

);

5546 for

(

unsigned

i = 0, e = TL.

getNumArgs

(); i != e; ++i)

5556 "No dependent template names here!"

);

5559

ArgVec.reserve(Args.size());

5561

ArgVec.push_back(Arg.getArgument());

5569 if

(Arg.isPackExpansion())

5581 "No dependent template names here!"

);

5586 if

(!Underlying.

isNull

())

5592 "Caller must compute aliased type"

);

5593

IsTypeAlias =

false

;

5602

(IsTypeAlias ?

sizeof

(

QualType

) : 0),

5606

IsTypeAlias ? Underlying :

QualType

());

5608

Types.push_back(Spec);

5615 "No dependent template names here!"

);

5624 bool

AnyNonCanonArgs =

false

;

5630

llvm::FoldingSetNodeID ID;

5632

CanonArgs, *

this

);

5634 void

*InsertPos =

nullptr

;

5636

= TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);

5646

Types.push_back(Spec);

5647

TemplateSpecializationTypes.InsertNode(Spec, InsertPos);

5651 "Non-dependent template-id type must have a canonical type"

);

5658 TagDecl

*OwnedTagDecl)

const

{

5659

llvm::FoldingSetNodeID ID;

5662 void

*InsertPos =

nullptr

;

5663 ElaboratedType

*

T

= ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);

5670 ElaboratedType

*CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos);

5671

assert(!CheckT &&

"Elaborated canonical type broken"

);

5676 Allocate

(ElaboratedType::totalSizeToAlloc<TagDecl *>(!!OwnedTagDecl),

5678 T

=

new

(Mem)

ElaboratedType

(Keyword, NNS, NamedType, Canon, OwnedTagDecl);

5680

Types.push_back(

T

);

5681

ElaboratedTypes.InsertNode(

T

, InsertPos);

5687

llvm::FoldingSetNodeID ID;

5690 void

*InsertPos =

nullptr

;

5691 ParenType

*

T

= ParenTypes.FindNodeOrInsertPos(ID, InsertPos);

5698 ParenType

*CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos);

5699

assert(!CheckT &&

"Paren canonical type broken"

);

5704

Types.push_back(

T

);

5705

ParenTypes.InsertNode(

T

, InsertPos);

5718

Types.push_back(newType);

5728 if

(CanonNNS != NNS)

5732

llvm::FoldingSetNodeID ID;

5735 void

*InsertPos =

nullptr

;

5737

= DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos);

5743

Types.push_back(

T

);

5744

DependentNameTypes.InsertNode(

T

, InsertPos);

5753 for

(

unsigned

I = 0,

E

= Args.size(); I !=

E

; ++I)

5765 "nested-name-specifier must be dependent"

);

5767

llvm::FoldingSetNodeID ID;

5771 void

*InsertPos =

nullptr

;

5773

= DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);

5783 bool

AnyNonCanonArgs =

false

;

5788 if

(AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {

5794

[[maybe_unused]]

auto

*Nothing =

5795

DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);

5796

assert(!Nothing &&

"canonical type broken"

);

5804

Types.push_back(

T

);

5805

DependentTemplateSpecializationTypes.InsertNode(

T

, InsertPos);

5811 if

(

const auto

*TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {

5817

}

else if

(

auto

*NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {

5819

NTTP->getType().getNonPackExpansionType().getNonLValueExprType(*

this

);

5834 Expr

*

E

=

new

(*this)

5836 T

, VK, NTTP->getLocation());

5838 if

(NTTP->isParameterPack())

5843 auto

*TTP = cast<TemplateTemplateParmDecl>(Param);

5860

std::optional<unsigned> NumExpansions,

5861 bool

ExpectPackInType)

const

{

5863 "Pack expansions must expand one or more parameter packs"

);

5865

llvm::FoldingSetNodeID ID;

5868 void

*InsertPos =

nullptr

;

5880

PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos);

5885

Types.push_back(

T

);

5886

PackExpansionTypes.InsertNode(

T

, InsertPos);

5898 if

(Protocols.empty())

return true

;

5903 for

(

unsigned

i = 1; i != Protocols.size(); ++i)

5913

llvm::array_pod_sort(Protocols.begin(), Protocols.end(),

CmpProtocolNames

);

5917 P

=

P

->getCanonicalDecl();

5920 auto

ProtocolsEnd = std::unique(Protocols.begin(), Protocols.end());

5921

Protocols.erase(ProtocolsEnd, Protocols.end());

5926 unsigned

NumProtocols)

const

{

5936 bool

isKindOf)

const

{

5939 if

(typeArgs.empty() && protocols.empty() && !isKindOf &&

5940

isa<ObjCInterfaceType>(baseType))

5944

llvm::FoldingSetNodeID ID;

5946 void

*InsertPos =

nullptr

;

5947 if

(

ObjCObjectType

*QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos))

5954 if

(effectiveTypeArgs.empty()) {

5956

effectiveTypeArgs = baseObject->getTypeArgs();

5963 bool

typeArgsAreCanonical = llvm::all_of(

5966 if

(!typeArgsAreCanonical || !protocolsSorted || !baseType.

isCanonical

()) {

5970 if

(!typeArgsAreCanonical) {

5971

canonTypeArgsVec.reserve(effectiveTypeArgs.size());

5972 for

(

auto

typeArg : effectiveTypeArgs)

5974

canonTypeArgs = canonTypeArgsVec;

5976

canonTypeArgs = effectiveTypeArgs;

5981 if

(!protocolsSorted) {

5982

canonProtocolsVec.append(protocols.begin(), protocols.end());

5984

canonProtocols = canonProtocolsVec;

5986

canonProtocols = protocols;

5990

canonProtocols, isKindOf);

5993

ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos);

5997

size += typeArgs.size() *

sizeof

(

QualType

);

6004

Types.push_back(

T

);

6005

ObjCObjectTypes.InsertNode(

T

, InsertPos);

6015 bool

allowOnPointerType)

const

{

6018 if

(

const auto

*objT = dyn_cast<ObjCTypeParamType>(

type

.getTypePtr())) {

6023 if

(allowOnPointerType) {

6024 if

(

const auto

*objPtr =

6025

dyn_cast<ObjCObjectPointerType>(

type

.getTypePtr())) {

6031

protocolsVec.append(protocols.begin(), protocols.end());

6043 if

(

const auto

*objT = dyn_cast<ObjCObjectType>(

type

.getTypePtr())){

6048

objT->getTypeArgsAsWritten(),

6050

objT->isKindOfTypeAsWritten());

6054 if

(

type

->isObjCObjectType()) {

6064 if

(

type

->isObjCIdType()) {

6067

objPtr->isKindOfType());

6072 if

(

type

->isObjCClassType()) {

6075

objPtr->isKindOfType());

6087

llvm::FoldingSetNodeID ID;

6089 void

*InsertPos =

nullptr

;

6091

ObjCTypeParamTypes.FindNodeOrInsertPos(ID, InsertPos))

6096 if

(!protocols.empty()) {

6100

Canonical, protocols, hasError,

true

));

6101

assert(!hasError &&

"Error when apply protocol qualifier to bound type"

);

6109

Types.push_back(newType);

6110

ObjCTypeParamTypes.InsertNode(newType, InsertPos);

6118 auto

NewTypeParamTy = cast<ObjCTypeParamType>(New->

getTypeForDecl

());

6120

protocols.append(NewTypeParamTy->qual_begin(), NewTypeParamTy->qual_end());

6135 for

(

auto

*Proto : OPT->quals()) {

6158 if

(InheritedProtocols.empty())

6162 bool

Conforms =

false

;

6163 for

(

auto

*Proto : OPT->quals()) {

6165 for

(

auto

*PI : InheritedProtocols) {

6177 for

(

auto

*PI : InheritedProtocols) {

6179 bool

Adopts =

false

;

6180 for

(

auto

*Proto : OPT->quals()) {

6194

llvm::FoldingSetNodeID ID;

6197 void

*InsertPos =

nullptr

;

6199

ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos))

6208

ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos);

6217

Types.push_back(QType);

6218

ObjCObjectPointerTypes.InsertNode(QType, InsertPos);

6226 if

(

Decl

->TypeForDecl)

6230

assert(PrevDecl->TypeForDecl &&

"previous decl has no TypeForDecl"

);

6231 Decl

->TypeForDecl = PrevDecl->TypeForDecl;

6232 return QualType

(PrevDecl->TypeForDecl, 0);

6241 Decl

->TypeForDecl =

T

;

6242

Types.push_back(

T

);

6254

llvm::FoldingSetNodeID ID;

6258 void

*InsertPos =

nullptr

;

6260

DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos);

6270

DependentTypeOfExprTypes.InsertNode(Canon, InsertPos);

6278

Types.push_back(toe);

6289 auto

*tot =

new

(*

this

,

alignof

(

TypeOfType

))

6290 TypeOfType

(*

this

, tofType, Canonical, Kind);

6291

Types.push_back(tot);

6315

llvm_unreachable(

"Unknown value kind"

);

6330

llvm::FoldingSetNodeID ID;

6333 void

*InsertPos =

nullptr

;

6335

= DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos);

6340

DependentDecltypeTypes.InsertNode(Canon, InsertPos);

6348

Types.push_back(dt);

6353 bool

FullySubstituted,

6357 if

(FullySubstituted && Index != -1) {

6360

llvm::FoldingSetNodeID ID;

6363 void

*InsertPos =

nullptr

;

6365

DependentPackIndexingTypes.FindNodeOrInsertPos(ID, InsertPos);

6368

PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),

6372

IndexExpr, FullySubstituted, Expansions);

6373

DependentPackIndexingTypes.InsertNode(Canon, InsertPos);

6379 Allocate

(PackIndexingType::totalSizeToAlloc<QualType>(Expansions.size()),

6382

FullySubstituted, Expansions);

6383

Types.push_back(

T

);

6397

llvm::FoldingSetNodeID ID;

6400 void

*InsertPos =

nullptr

;

6402

= DependentUnaryTransformTypes.FindNodeOrInsertPos(ID, InsertPos);

6408

DependentUnaryTransformTypes.InsertNode(Canon, InsertPos);

6417

Types.push_back(ut);

6421QualType

ASTContext::getAutoTypeInternal(

6426

!TypeConstraintConcept && !IsDependent)

6430

llvm::FoldingSetNodeID ID;

6431 bool

IsDeducedDependent =

6434

IsDependent || IsDeducedDependent, TypeConstraintConcept,

6435

TypeConstraintArgs);

6436 if

(

auto const

AT_iter = AutoTypes.find(ID); AT_iter != AutoTypes.end())

6437 return QualType

(AT_iter->getSecond(), 0);

6443

}

else if

(TypeConstraintConcept) {

6444 bool

AnyNonCanonArgs =

false

;

6447

*

this

, TypeConstraintArgs, AnyNonCanonArgs);

6448 if

(CanonicalConcept != TypeConstraintConcept || AnyNonCanonArgs) {

6450

getAutoTypeInternal(

QualType

(), Keyword, IsDependent, IsPack,

6451

CanonicalConcept, CanonicalConceptArgs,

true

);

6461

(IsDependent ? TypeDependence::DependentInstantiation

6462

: TypeDependence::None) |

6463

(IsPack ? TypeDependence::UnexpandedPack : TypeDependence::None),

6464

Canon, TypeConstraintConcept, TypeConstraintArgs);

6466

llvm::FoldingSetNodeID InsertedID;

6467

AT->

Profile

(InsertedID, *

this

);

6468

assert(InsertedID == ID &&

"ID does not match"

);

6470

Types.push_back(AT);

6471

AutoTypes.try_emplace(ID, AT);

6480 bool

IsDependent,

bool

IsPack,

6483

assert((!IsPack || IsDependent) &&

"only use IsPack for a dependent pack"

);

6485 "A dependent auto should be undeduced"

);

6486 return

getAutoTypeInternal(

DeducedType

, Keyword, IsDependent, IsPack,

6487

TypeConstraintConcept, TypeConstraintArgs);

6491 QualType

CanonT =

T

.getNonPackExpansionType().getCanonicalType();

6495 if

(!AT->isConstrained())

6499

AT->containsUnexpandedParameterPack()),

6500 T

.getQualifiers());

6511QualType

ASTContext::getDeducedTemplateSpecializationTypeInternal(

6515 void

*InsertPos =

nullptr

;

6516

llvm::FoldingSetNodeID ID;

6520

DeducedTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos))

6526

llvm::FoldingSetNodeID TempID;

6527

DTST->Profile(TempID);

6528

assert(ID == TempID &&

"ID does not match"

);

6529

Types.push_back(DTST);

6530

DeducedTemplateSpecializationTypes.InsertNode(DTST, InsertPos);

6540

? getDeducedTemplateSpecializationTypeInternal(

6544 return

getDeducedTemplateSpecializationTypeInternal(Template,

DeducedType

,

6545

IsDependent, Canon);

6553

llvm::FoldingSetNodeID ID;

6556 void

*InsertPos =

nullptr

;

6557 if

(

AtomicType

*AT = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos))

6563 if

(!

T

.isCanonical()) {

6567 AtomicType

*NewIP = AtomicTypes.FindNodeOrInsertPos(ID, InsertPos);

6568

assert(!NewIP &&

"Shouldn't be in the map!"

); (void)NewIP;

6571

Types.push_back(New);

6572

AtomicTypes.InsertNode(New, InsertPos);

6608 return

getFromTargetType(

Target

->getSizeType());

6614 return

getFromTargetType(

Target

->getSignedSizeType());

6619 return

getFromTargetType(

Target

->getIntMaxType());

6624 return

getFromTargetType(

Target

->getUIntMaxType());

6642 return

getFromTargetType(

Target

->getIntPtrType());

6665 return

getFromTargetType(

Target

->getProcessIDType());

6677 const Type

*Ty =

T

.getTypePtr();

6681

}

else if

(isa<ArrayType>(Ty)) {

6683

}

else if

(isa<FunctionType>(Ty)) {

6705

quals = splitType.

Quals

;

6710 QualType

elementType = AT->getElementType();

6715 if

(elementType == unqualElementType) {

6716

assert(quals.

empty

());

6717

quals = splitType.

Quals

;

6725 if

(

const auto

*CAT = dyn_cast<ConstantArrayType>(AT)) {

6727

CAT->getSizeExpr(), CAT->getSizeModifier(), 0);

6730 if

(

const auto

*IAT = dyn_cast<IncompleteArrayType>(AT)) {

6734 if

(

const auto

*VAT = dyn_cast<VariableArrayType>(AT)) {

6737

VAT->getSizeModifier(),

6738

VAT->getIndexTypeCVRQualifiers(),

6739

VAT->getBracketsRange());

6742 const auto

*DSAT = cast<DependentSizedArrayType>(AT);

6744

DSAT->getSizeModifier(), 0,

6755 bool

AllowPiMismatch)

const

{

6770 if

(

auto

*CAT1 = dyn_cast<ConstantArrayType>(AT1)) {

6771 auto

*CAT2 = dyn_cast<ConstantArrayType>(AT2);

6772 if

(!((CAT2 && CAT1->getSize() == CAT2->getSize()) ||

6774

isa<IncompleteArrayType>(AT2))))

6776

}

else if

(isa<IncompleteArrayType>(AT1)) {

6777 if

(!(isa<IncompleteArrayType>(AT2) ||

6779

isa<ConstantArrayType>(AT2))))

6785

T1 = AT1->getElementType();

6786

T2 = AT2->getElementType();

6806 bool

AllowPiMismatch)

const

{

6811 if

(T1PtrType && T2PtrType) {

6819 if

(T1MPType && T2MPType &&

6830 if

(T1OPType && T2OPType) {

6862 if

(Quals1 != Quals2)

6876 switch

(Name.getKind()) {

6911

= Name.getAsSubstTemplateTemplateParm();

6918

= Name.getAsSubstTemplateTemplateParmPack();

6931

llvm_unreachable(

"bad template name kind!"

);

6937 if

(!TP->hasDefaultArgument())

6939 return

&TP->getDefaultArgument().getArgument();

6941 switch

(

P

->getKind()) {

6942 case

NamedDecl::TemplateTypeParm:

6943 return

handleParam(cast<TemplateTypeParmDecl>(

P

));

6944 case

NamedDecl::NonTypeTemplateParm:

6945 return

handleParam(cast<NonTypeTemplateParmDecl>(

P

));

6946 case

NamedDecl::TemplateTemplateParm:

6947 return

handleParam(cast<TemplateTemplateParmDecl>(

P

));

6949

llvm_unreachable(

"Unexpected template parameter kind"

);

6954 bool

IgnoreDeduced)

const

{

6955 while

(std::optional<TemplateName> UnderlyingOrNone =

6956

Name.desugar(IgnoreDeduced))

6957

Name = *UnderlyingOrNone;

6959 switch

(Name.getKind()) {

6962 if

(

auto

*TTP = dyn_cast<TemplateTemplateParmDecl>(Template))

6963

Template = getCanonicalTemplateTemplateParmDecl(TTP);

6971

llvm_unreachable(

"cannot canonicalize unresolved template"

);

6975

assert(DTN &&

"Non-dependent template names must refer to template decls."

);

6976 return

DTN->CanonicalTemplateName;

6981

Name.getAsSubstTemplateTemplateParmPack();

6989

assert(IgnoreDeduced ==

false

);

6996 bool

NonCanonical = CanonUnderlying != Underlying;

7002

assert(CanonArgs.size() <= Params.size());

7008 for

(

int

I = CanonArgs.size() - 1; I >= 0; --I) {

7017 if

(I ==

int

(CanonArgs.size() - 1))

7018

CanonArgs.pop_back();

7019

NonCanonical =

true

;

7029

llvm_unreachable(

"always sugar node"

);

7032

llvm_unreachable(

"bad template name!"

);

7037 bool

IgnoreDeduced)

const

{

7049

llvm::FoldingSetNodeID XCEID, YCEID;

7050

XCE->

Profile

(XCEID, *

this

,

true

,

true

);

7051

YCE->

Profile

(YCEID, *

this

,

true

,

true

);

7052 return

XCEID == YCEID;

7098 if

(

X

->getKind() != Y->

getKind

())

7101 if

(

auto

*TX = dyn_cast<TemplateTypeParmDecl>(

X

)) {

7102 auto

*TY = cast<TemplateTypeParmDecl>(Y);

7103 if

(TX->isParameterPack() != TY->isParameterPack())

7105 if

(TX->hasTypeConstraint() != TY->hasTypeConstraint())

7108

TY->getTypeConstraint());

7111 if

(

auto

*TX = dyn_cast<NonTypeTemplateParmDecl>(

X

)) {

7112 auto

*TY = cast<NonTypeTemplateParmDecl>(Y);

7113 return

TX->isParameterPack() == TY->isParameterPack() &&

7114

TX->getASTContext().hasSameType(TX->getType(), TY->getType()) &&

7116

TY->getPlaceholderTypeConstraint());

7119 auto

*TX = cast<TemplateTemplateParmDecl>(

X

);

7120 auto

*TY = cast<TemplateTemplateParmDecl>(Y);

7121 return

TX->isParameterPack() == TY->isParameterPack() &&

7123

TY->getTemplateParameters());

7128 if

(

X

->size() != Y->

size

())

7131 for

(

unsigned

I = 0, N =

X

->size(); I != N; ++I)

7145 if

(

auto

*TTPX = dyn_cast<TemplateTypeParmDecl>(

X

)) {

7146 auto

*TTPY = cast<TemplateTypeParmDecl>(Y);

7147 if

(!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())

7150 return hasSameType

(TTPX->getDefaultArgument().getArgument().getAsType(),

7151

TTPY->getDefaultArgument().getArgument().getAsType());

7154 if

(

auto

*NTTPX = dyn_cast<NonTypeTemplateParmDecl>(

X

)) {

7155 auto

*NTTPY = cast<NonTypeTemplateParmDecl>(Y);

7156 if

(!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())

7159 Expr

*DefaultArgumentX =

7160

NTTPX->getDefaultArgument().getArgument().getAsExpr()->

IgnoreImpCasts

();

7161 Expr

*DefaultArgumentY =

7162

NTTPY->getDefaultArgument().getArgument().getAsExpr()->

IgnoreImpCasts

();

7163

llvm::FoldingSetNodeID XID, YID;

7164

DefaultArgumentX->

Profile

(XID, *

this

,

true

);

7165

DefaultArgumentY->

Profile

(YID, *

this

,

true

);

7169 auto

*TTPX = cast<TemplateTemplateParmDecl>(

X

);

7170 auto

*TTPY = cast<TemplateTemplateParmDecl>(Y);

7172 if

(!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())

7181 if

(

auto

*NS =

X

->getAsNamespace())

7183 if

(

auto

*NAS =

X

->getAsNamespaceAlias())

7184 return

NAS->getNamespace();

7192 if

(!NSY || NSX->getCanonicalDecl() != NSY->getCanonicalDecl())

7194

}

else if

(

X

->getKind() != Y->

getKind

())

7199 switch

(

X

->getKind()) {

7210 if

(

X

->getAsType()->getCanonicalTypeInternal() !=

7220 auto

*PX =

X

->getPrefix();

7234

llvm::FoldingSetNodeID Cand1ID, Cand2ID;

7238 for

(

auto

Pair : zip_longest(AEnableIfAttrs, BEnableIfAttrs)) {

7239

std::optional<EnableIfAttr *> Cand1A = std::get<0>(Pair);

7240

std::optional<EnableIfAttr *> Cand2A = std::get<1>(Pair);

7243 if

(!Cand1A || !Cand2A)

7249

(*Cand1A)->getCond()->Profile(Cand1ID, A->

getASTContext

(),

true

);

7250

(*Cand2A)->getCond()->Profile(Cand2ID, B->

getASTContext

(),

true

);

7254 if

(Cand1ID != Cand2ID)

7282 if

(

const auto

*TypedefX = dyn_cast<TypedefNameDecl>(

X

))

7283 if

(

const auto

*TypedefY = dyn_cast<TypedefNameDecl>(Y))

7284 return hasSameType

(TypedefX->getUnderlyingType(),

7285

TypedefY->getUnderlyingType());

7288 if

(

X

->getKind() != Y->

getKind

())

7292 if

(isa<ObjCInterfaceDecl>(

X

) || isa<ObjCProtocolDecl>(

X

))

7295 if

(isa<ClassTemplateSpecializationDecl>(

X

)) {

7302 if

(

const auto

*TagX = dyn_cast<TagDecl>(

X

)) {

7303 const auto

*TagY = cast<TagDecl>(Y);

7304 return

(TagX->getTagKind() == TagY->getTagKind()) ||

7316 if

(

const auto

*FuncX = dyn_cast<FunctionDecl>(

X

)) {

7317 const auto

*FuncY = cast<FunctionDecl>(Y);

7318 if

(

const auto

*CtorX = dyn_cast<CXXConstructorDecl>(

X

)) {

7319 const auto

*CtorY = cast<CXXConstructorDecl>(Y);

7320 if

(CtorX->getInheritedConstructor() &&

7321

!

isSameEntity

(CtorX->getInheritedConstructor().getConstructor(),

7322

CtorY->getInheritedConstructor().getConstructor()))

7326 if

(FuncX->isMultiVersion() != FuncY->isMultiVersion())

7331 if

(FuncX->isMultiVersion()) {

7332 const auto

*TAX = FuncX->getAttr<TargetAttr>();

7333 const auto

*TAY = FuncY->getAttr<TargetAttr>();

7334

assert(TAX && TAY &&

"Multiversion Function without target attribute"

);

7336 if

(TAX->getFeaturesStr() != TAY->getFeaturesStr())

7342 if

((FuncX->isMemberLikeConstrainedFriend() ||

7343

FuncY->isMemberLikeConstrainedFriend()) &&

7344

!FuncX->getLexicalDeclContext()->Equals(

7345

FuncY->getLexicalDeclContext())) {

7350

FuncY->getTrailingRequiresClause()))

7358

FD = FD->getCanonicalDecl();

7359 return

FD->getTypeSourceInfo() ? FD->getTypeSourceInfo()->getType()

7362 QualType

XT = GetTypeAsWritten(FuncX), YT = GetTypeAsWritten(FuncY);

7369 if

(

getLangOpts

().CPlusPlus17 && XFPT && YFPT &&

7377 return

FuncX->getLinkageInternal() == FuncY->getLinkageInternal() &&

7382 if

(

const auto

*VarX = dyn_cast<VarDecl>(

X

)) {

7383 const auto

*VarY = cast<VarDecl>(Y);

7384 if

(VarX->getLinkageInternal() == VarY->getLinkageInternal()) {

7387 if

(VarX->getType().isNull() || VarY->getType().isNull())

7390 if

(

hasSameType

(VarX->getType(), VarY->getType()))

7400 if

(!VarXTy || !VarYTy)

7409 if

(

const auto

*NamespaceX = dyn_cast<NamespaceDecl>(

X

)) {

7410 const auto

*NamespaceY = cast<NamespaceDecl>(Y);

7411 return

NamespaceX->isInline() == NamespaceY->isInline();

7416 if

(

const auto

*TemplateX = dyn_cast<TemplateDecl>(

X

)) {

7417 const auto

*TemplateY = cast<TemplateDecl>(Y);

7420 if

(

const auto

*ConceptX = dyn_cast<ConceptDecl>(

X

)) {

7421 const auto

*ConceptY = cast<ConceptDecl>(Y);

7423

ConceptY->getConstraintExpr()))

7428

TemplateY->getTemplatedDecl()) &&

7430

TemplateY->getTemplateParameters());

7434 if

(

const auto

*FDX = dyn_cast<FieldDecl>(

X

)) {

7435 const auto

*FDY = cast<FieldDecl>(Y);

7437 return hasSameType

(FDX->getType(), FDY->getType());

7441 if

(

const auto

*IFDX = dyn_cast<IndirectFieldDecl>(

X

)) {

7442 const auto

*IFDY = cast<IndirectFieldDecl>(Y);

7443 return

IFDX->getAnonField()->getCanonicalDecl() ==

7444

IFDY->getAnonField()->getCanonicalDecl();

7448 if

(isa<EnumConstantDecl>(

X

))

7453 if

(

const auto

*USX = dyn_cast<UsingShadowDecl>(

X

)) {

7454 const auto

*USY = cast<UsingShadowDecl>(Y);

7460 if

(

const auto

*UX = dyn_cast<UsingDecl>(

X

)) {

7461 const auto

*UY = cast<UsingDecl>(Y);

7463

UX->hasTypename() == UY->hasTypename() &&

7464

UX->isAccessDeclaration() == UY->isAccessDeclaration();

7466 if

(

const auto

*UX = dyn_cast<UnresolvedUsingValueDecl>(

X

)) {

7467 const auto

*UY = cast<UnresolvedUsingValueDecl>(Y);

7469

UX->isAccessDeclaration() == UY->isAccessDeclaration();

7471 if

(

const auto

*UX = dyn_cast<UnresolvedUsingTypenameDecl>(

X

)) {

7474

cast<UnresolvedUsingTypenameDecl>(Y)->getQualifier());

7479 if

(

const auto

*UX = dyn_cast<UsingPackDecl>(

X

)) {

7481

UX->getInstantiatedFromUsingDecl(),

7482

cast<UsingPackDecl>(Y)->getInstantiatedFromUsingDecl());

7486 if

(

const auto

*NAX = dyn_cast<NamespaceAliasDecl>(

X

)) {

7487 const auto

*NAY = cast<NamespaceAliasDecl>(Y);

7488 return

NAX->getNamespace()->Equals(NAY->getNamespace());

7535 bool

AnyNonCanonArgs =

false

;

7538 if

(!AnyNonCanonArgs)

7541 const_cast<ASTContext

&

>

(*

this

), CanonArgs);

7548

llvm_unreachable(

"Unhandled template argument kind"

);

7591

DNT->getIdentifier());

7605

llvm_unreachable(

"Invalid NestedNameSpecifier::Kind!"

);

7610 if

(!

T

.hasLocalQualifiers()) {

7612 if

(

const auto

*AT = dyn_cast<ArrayType>(

T

))

7617 if

(!isa<ArrayType>(

T

.getCanonicalType()))

7632 const auto

*ATy = dyn_cast<ArrayType>(split.

Ty

);

7633 if

(!ATy || qs.

empty

())

7640 if

(

const auto

*CAT = dyn_cast<ConstantArrayType>(ATy))

7643

CAT->getSizeModifier(),

7644

CAT->getIndexTypeCVRQualifiers()));

7645 if

(

const auto

*IAT = dyn_cast<IncompleteArrayType>(ATy))

7647

IAT->getSizeModifier(),

7648

IAT->getIndexTypeCVRQualifiers()));

7650 if

(

const auto

*DSAT = dyn_cast<DependentSizedArrayType>(ATy))

7651 return

cast<ArrayType>(

7653

DSAT->getSizeExpr(),

7654

DSAT->getSizeModifier(),

7655

DSAT->getIndexTypeCVRQualifiers(),

7656

DSAT->getBracketsRange()));

7658 const auto

*VAT = cast<VariableArrayType>(ATy);

7661

VAT->getSizeModifier(),

7662

VAT->getIndexTypeCVRQualifiers(),

7663

VAT->getBracketsRange()));

7677 return T

.getUnqualifiedType();

7690 return T

.getUnqualifiedType();

7705

assert(PrettyArrayType &&

"Not an array type!"

);

7742

uint64_t ElementCount = 1;

7745

CA = dyn_cast_or_null<ConstantArrayType>(

7748 return

ElementCount;

7756

uint64_t ElementCount = 1;

7760

AILE = dyn_cast<ArrayInitLoopExpr>(AILE->

getSubExpr

());

7763 return

ElementCount;

7773 default

: llvm_unreachable(

"getFloatingRank(): not a floating type"

);

7775 case

BuiltinType::Half:

return HalfRank

;

7776 case

BuiltinType::Float:

return FloatRank

;

7777 case

BuiltinType::Double:

return DoubleRank

;

7781 case

BuiltinType::Ibm128:

return Ibm128Rank

;

7809unsigned

ASTContext::getIntegerRank(

const Type

*

T

)

const

{

7814 if

(

const auto

*EIT = dyn_cast<BitIntType>(

T

))

7815 return

0 + (EIT->getNumBits() << 3);

7817 switch

(cast<BuiltinType>(

T

)->getKind()) {

7818 default

: llvm_unreachable(

"getIntegerRank(): not a built-in integer"

);

7819 case

BuiltinType::Bool:

7821 case

BuiltinType::Char_S:

7822 case

BuiltinType::Char_U:

7823 case

BuiltinType::SChar:

7824 case

BuiltinType::UChar:

7826 case

BuiltinType::Short:

7827 case

BuiltinType::UShort:

7829 case

BuiltinType::Int:

7830 case

BuiltinType::UInt:

7832 case

BuiltinType::Long:

7833 case

BuiltinType::ULong:

7835 case

BuiltinType::LongLong:

7836 case

BuiltinType::ULongLong:

7838 case

BuiltinType::Int128:

7839 case

BuiltinType::UInt128:

7844 case

BuiltinType::Char8:

7846 case

BuiltinType::Char16:

7847 return

getIntegerRank(

7849 case

BuiltinType::Char32:

7850 return

getIntegerRank(

7852 case

BuiltinType::WChar_S:

7853 case

BuiltinType::WChar_U:

7854 return

getIntegerRank(

7884

uint64_t BitWidth = Field->getBitWidthValue();

7907 if

(

QualType

QT = Field->getType(); QT->isBitIntType())

7910 if

(BitWidth < IntSize)

7913 if

(BitWidth == IntSize)

7928

assert(!Promotable.

isNull

());

7931 return

ET->getDecl()->getPromotionType();

7940 if

(BT->getKind() == BuiltinType::WChar_S ||

7941

BT->getKind() == BuiltinType::WChar_U ||

7942

BT->getKind() == BuiltinType::Char8 ||

7943

BT->getKind() == BuiltinType::Char16 ||

7944

BT->getKind() == BuiltinType::Char32) {

7945 bool

FromIsSigned = BT->getKind() == BuiltinType::WChar_S;

7949 for

(

const auto

&PT : PromoteTypes) {

7951 if

(FromSize < ToSize ||

7952

(FromSize == ToSize && FromIsSigned == PT->isSignedIntegerType()))

7955

llvm_unreachable(

"char type should fit into long long"

);

7962

uint64_t PromotableSize =

getIntWidth

(Promotable);

7971 while

(!

T

.isNull()) {

7973 return T

.getObjCLifetime();

8003 if

(

const auto

*ET = dyn_cast<EnumType>(LHSC))

8005 if

(

const auto

*ET = dyn_cast<EnumType>(RHSC))

8008 if

(LHSC == RHSC)

return

0;

8013 unsigned

LHSRank = getIntegerRank(LHSC);

8014 unsigned

RHSRank = getIntegerRank(RHSC);

8016 if

(LHSUnsigned == RHSUnsigned) {

8017 if

(LHSRank == RHSRank)

return

0;

8018 return

LHSRank > RHSRank ? 1 : -1;

8024 if

(LHSRank >= RHSRank)

8034 if

(RHSRank >= LHSRank)

8044 if

(CFConstantStringTypeDecl)

8045 return

CFConstantStringTypeDecl;

8047

assert(!CFConstantStringTagDecl &&

8048 "tag and typedef should be initialized together"

);

8088 if

(

static_cast<unsigned>

(CFRuntime) <

8091

Fields[Count++] = {

IntTy

,

"flags"

};

8093

Fields[Count++] = {

LongTy

,

"length"

};

8097

Fields[Count++] = { getFromTargetType(

Target

->getUInt64Type()),

"_swift_rc"

};

8101

Fields[Count++] = {

IntTy

,

"_ptr"

};

8107 for

(

unsigned

i = 0; i < Count; ++i) {

8111

Fields[i].Type,

nullptr

,

8114

CFConstantStringTagDecl->

addDecl

(Field);

8121

CFConstantStringTypeDecl =

8124 return

CFConstantStringTypeDecl;

8128 if

(!CFConstantStringTagDecl)

8130 return

CFConstantStringTagDecl;

8139 if

(ObjCSuperType.

isNull

()) {

8144 return

ObjCSuperType;

8149

CFConstantStringTypeDecl = cast<TypedefDecl>(TD->getDecl());

8156 if

(BlockDescriptorType)

8169 static const char

*

const

FieldNames[] = {

8174 for

(

size_t

i = 0; i < 2; ++i) {

8177

&

Idents

.

get

(FieldNames[i]), FieldTypes[i],

nullptr

,

8185

BlockDescriptorType = RD;

8191 if

(BlockDescriptorExtendedType)

8206 static const char

*

const

FieldNames[] = {

8213 for

(

size_t

i = 0; i < 4; ++i) {

8216

&

Idents

.

get

(FieldNames[i]), FieldTypes[i],

nullptr

,

8225

BlockDescriptorExtendedType = RD;

8230 const auto

*BT = dyn_cast<BuiltinType>(

T

);

8233 if

(isa<PipeType>(

T

))

8239 switch

(BT->getKind()) {

8240#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 8241 case BuiltinType::Id: \ 8243#include "clang/Basic/OpenCLImageTypes.def" 8245 case

BuiltinType::OCLClkEvent:

8248 case

BuiltinType::OCLEvent:

8251 case

BuiltinType::OCLQueue:

8254 case

BuiltinType::OCLReserveID:

8257 case

BuiltinType::OCLSampler:

8276 if

(!copyExpr && record->hasTrivialDestructor())

return false

;

8304

llvm_unreachable(

"impossible"

);

8306

llvm_unreachable(

"fell out of lifetime switch!"

);

8314 bool

&HasByrefExtendedLayout)

const

{

8319

HasByrefExtendedLayout =

false

;

8321

HasByrefExtendedLayout =

true

;

8335

assert(

Target

&&

"Expected target to be initialized"

);

8336 const

llvm::Triple &

T

=

Target

->getTriple();

8338 if

(

T

.isOSWindows() &&

T

.isArch64Bit())

8344

assert(

Target

&&

"Expected target to be initialized"

);

8345 const

llvm::Triple &

T

=

Target

->getTriple();

8347 if

(

T

.isOSWindows() &&

T

.isArch64Bit())

8353 if

(!ObjCInstanceTypeDecl)

8354

ObjCInstanceTypeDecl =

8356 return

ObjCInstanceTypeDecl;

8362 if

(

const auto

*TT = dyn_cast<TypedefType>(

T

))

8364 return

II->isStr(

"BOOL"

);

8372 if

(!

type

->isIncompleteArrayType() &&

type

->isIncompleteType())

8381 else if

(

type

->isArrayType())

8400 if

(

First

->isInlineSpecified() || !

First

->isStaticDataMember())

8407

!

D

->isInlineSpecified() && (

D

->isConstexpr() ||

First

->isConstexpr()))

8438 for

(

auto

*PI :

Decl

->parameters()) {

8443

assert(sz.

isPositive

() &&

"BlockExpr - Incomplete param type"

);

8452

ParmOffset = PtrSize;

8453 for

(

auto

*PVDecl :

Decl

->parameters()) {

8454 QualType

PType = PVDecl->getOriginalType();

8455 if

(

const auto

*AT =

8459 if

(!isa<ConstantArrayType>(AT))

8460

PType = PVDecl->getType();

8462

PType = PVDecl->getType();

8482 for

(

auto

*PI :

Decl

->parameters()) {

8489 "getObjCEncodingForFunctionDecl - Incomplete param type"

);

8496 for

(

auto

*PVDecl :

Decl

->parameters()) {

8497 QualType

PType = PVDecl->getOriginalType();

8498 if

(

const auto

*AT =

8502 if

(!isa<ConstantArrayType>(AT))

8503

PType = PVDecl->getType();

8505

PType = PVDecl->getType();

8519 bool

Extended)

const

{

8523

ObjCEncOptions Options = ObjCEncOptions()

8524

.setExpandPointedToStructures()

8525

.setExpandStructures()

8526

.setIsOutermostType();

8528

Options.setEncodeBlockParameters().setEncodeClassNames();

8529

getObjCEncodingForTypeImpl(

T

, S, Options,

nullptr

);

8535 bool

Extended)

const

{

8540 Decl

->getReturnType(), S, Extended);

8549 E

=

Decl

->sel_param_end(); PI !=

E

; ++PI) {

8556 "getObjCEncodingForMethodDecl - Incomplete param type"

);

8564

ParmOffset = 2 * PtrSize;

8566 E

=

Decl

->sel_param_end(); PI !=

E

; ++PI) {

8569 if

(

const auto

*AT =

8573 if

(!isa<ConstantArrayType>(AT))

8578

PType, S, Extended);

8589 const Decl

*Container)

const

{

8592 if

(

const auto

*CID = dyn_cast<ObjCCategoryImplDecl>(Container)) {

8593 for

(

auto

*PID : CID->property_impls())

8594 if

(PID->getPropertyDecl() == PD)

8597 const auto

*OID = cast<ObjCImplementationDecl>(Container);

8598 for

(

auto

*PID : OID->property_impls())

8599 if

(PID->getPropertyDecl() == PD)

8633 const Decl

*Container)

const

{

8635 bool

Dynamic =

false

;

8643

SynthesizePID = PropertyImpDecl;

8647

std::string S =

"T"

;

8692 if

(SynthesizePID) {

8709 if

(BT->getKind() == BuiltinType::ULong &&

getIntWidth

(PointeeTy) == 32)

8712 if

(BT->getKind() == BuiltinType::Long &&

getIntWidth

(PointeeTy) == 32)

8725

getObjCEncodingForTypeImpl(

T

, S,

8727

.setExpandPointedToStructures()

8728

.setExpandStructures()

8729

.setIsOutermostType(),

8730

Field, NotEncodedT);

8734

std::string& S)

const

{

8738

getObjCEncodingForTypeImpl(

T

, S,

8740

.setExpandPointedToStructures()

8741

.setExpandStructures()

8742

.setIsOutermostType()

8743

.setEncodingProperty(),

8751 case

BuiltinType::Void:

return 'v'

;

8752 case

BuiltinType::Bool:

return 'B'

;

8753 case

BuiltinType::Char8:

8754 case

BuiltinType::Char_U:

8755 case

BuiltinType::UChar:

return 'C'

;

8756 case

BuiltinType::Char16:

8757 case

BuiltinType::UShort:

return 'S'

;

8758 case

BuiltinType::Char32:

8759 case

BuiltinType::UInt:

return 'I'

;

8760 case

BuiltinType::ULong:

8761 return C

->getTargetInfo().getLongWidth() == 32 ?

'L'

:

'Q'

;

8762 case

BuiltinType::UInt128:

return 'T'

;

8763 case

BuiltinType::ULongLong:

return 'Q'

;

8764 case

BuiltinType::Char_S:

8765 case

BuiltinType::SChar:

return 'c'

;

8766 case

BuiltinType::Short:

return 's'

;

8767 case

BuiltinType::WChar_S:

8768 case

BuiltinType::WChar_U:

8769 case

BuiltinType::Int:

return 'i'

;

8770 case

BuiltinType::Long:

8771 return C

->getTargetInfo().getLongWidth() == 32 ?

'l'

:

'q'

;

8772 case

BuiltinType::LongLong:

return 'q'

;

8773 case

BuiltinType::Int128:

return 't'

;

8774 case

BuiltinType::Float:

return 'f'

;

8775 case

BuiltinType::Double:

return 'd'

;

8776 case

BuiltinType::LongDouble:

return 'D'

;

8777 case

BuiltinType::NullPtr:

return '*'

;

8779 case

BuiltinType::BFloat16:

8780 case

BuiltinType::Float16:

8781 case

BuiltinType::Float128:

8782 case

BuiltinType::Ibm128:

8783 case

BuiltinType::Half:

8784 case

BuiltinType::ShortAccum:

8785 case

BuiltinType::Accum:

8786 case

BuiltinType::LongAccum:

8787 case

BuiltinType::UShortAccum:

8788 case

BuiltinType::UAccum:

8789 case

BuiltinType::ULongAccum:

8790 case

BuiltinType::ShortFract:

8791 case

BuiltinType::Fract:

8792 case

BuiltinType::LongFract:

8793 case

BuiltinType::UShortFract:

8794 case

BuiltinType::UFract:

8795 case

BuiltinType::ULongFract:

8796 case

BuiltinType::SatShortAccum:

8797 case

BuiltinType::SatAccum:

8798 case

BuiltinType::SatLongAccum:

8799 case

BuiltinType::SatUShortAccum:

8800 case

BuiltinType::SatUAccum:

8801 case

BuiltinType::SatULongAccum:

8802 case

BuiltinType::SatShortFract:

8803 case

BuiltinType::SatFract:

8804 case

BuiltinType::SatLongFract:

8805 case

BuiltinType::SatUShortFract:

8806 case

BuiltinType::SatUFract:

8807 case

BuiltinType::SatULongFract:

8811#define SVE_TYPE(Name, Id, SingletonId) \ 8812 case BuiltinType::Id: 8813#include "clang/Basic/AArch64SVEACLETypes.def" 8814#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 8815#include "clang/Basic/RISCVVTypes.def" 8816#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 8817#include "clang/Basic/WebAssemblyReferenceTypes.def" 8818#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id: 8819#include "clang/Basic/AMDGPUTypes.def" 8823 "cannot yet @encode type %0"

);

8824

Diags.

Report

(DiagID) << BT->

getName

(

C

->getPrintingPolicy());

8828 case

BuiltinType::ObjCId:

8829 case

BuiltinType::ObjCClass:

8830 case

BuiltinType::ObjCSel:

8831

llvm_unreachable(

"@encoding ObjC primitive type"

);

8834#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 8835 case BuiltinType::Id: 8836#include "clang/Basic/OpenCLImageTypes.def" 8837#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 8838 case BuiltinType::Id: 8839#include "clang/Basic/OpenCLExtensionTypes.def" 8840 case

BuiltinType::OCLEvent:

8841 case

BuiltinType::OCLClkEvent:

8842 case

BuiltinType::OCLQueue:

8843 case

BuiltinType::OCLReserveID:

8844 case

BuiltinType::OCLSampler:

8845 case

BuiltinType::Dependent:

8846#define PPC_VECTOR_TYPE(Name, Id, Size) \ 8847 case BuiltinType::Id: 8848#include "clang/Basic/PPCTypes.def" 8849#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 8850#include "clang/Basic/HLSLIntangibleTypes.def" 8851#define BUILTIN_TYPE(KIND, ID) 8852#define PLACEHOLDER_TYPE(KIND, ID) \ 8853 case BuiltinType::KIND: 8854#include "clang/AST/BuiltinTypes.def" 8855

llvm_unreachable(

"invalid builtin type for @encode"

);

8857

llvm_unreachable(

"invalid BuiltinType::Kind value"

);

8864 if

(!

Enum

->isFixed())

8874

assert(FD->

isBitField

() &&

"not a bitfield - getObjCEncodingForTypeImpl"

);

8894 if

(

const auto

*IVD = dyn_cast<ObjCIvarDecl>(FD)) {

8903

S += llvm::utostr(Offset);

8918 bool

VisitBasesAndFields) {

8923

PT->getPointeeType().getTypePtr(),

false

);

8930 if

(isa<ClassTemplateSpecializationDecl>(CXXRD))

8933 if

(!CXXRD->hasDefinition() || !VisitBasesAndFields)

8936 for

(

const auto

&B : CXXRD->bases())

8941 for

(

auto

*FD : CXXRD->fields())

8950void

ASTContext::getObjCEncodingForTypeImpl(

QualType T

, std::string &S,

8951 const

ObjCEncOptions Options,

8955 switch

(CT->getTypeClass()) {

8960 if

(

const auto

*BT = dyn_cast<BuiltinType>(CT))

8982 case

Type::LValueReference:

8983 case

Type::RValueReference: {

8985 if

(isa<PointerType>(CT)) {

8987 if

(PT->isObjCSelType()) {

8996 bool

isReadOnly =

false

;

9002 if

(Options.IsOutermostType() &&

T

.isConstQualified()) {

9006

}

else if

(Options.IsOutermostType()) {

9009 P

= PT->getPointeeType();

9010 if

(

P

.isConstQualified()) {

9019 if

(StringRef(S).ends_with(

"nr"

))

9020

S.replace(S.end()-2, S.end(),

"rn"

);

9032 if

(RTy->getDecl()->getIdentifier() == &

Idents

.

get

(

"objc_class"

)) {

9037 if

(RTy->getDecl()->getIdentifier() == &

Idents

.

get

(

"objc_object"

)) {

9046

RTy, Options.ExpandPointedToStructures()))) {

9055

ObjCEncOptions NewOptions;

9056 if

(Options.ExpandPointedToStructures())

9057

NewOptions.setExpandStructures();

9058

getObjCEncodingForTypeImpl(PointeeTy, S, NewOptions,

9059 nullptr

, NotEncodedT);

9063 case

Type::ConstantArray:

9064 case

Type::IncompleteArray:

9065 case

Type::VariableArray: {

9066 const auto

*AT = cast<ArrayType>(CT);

9068 if

(isa<IncompleteArrayType>(AT) && !Options.IsStructField()) {

9072

getObjCEncodingForTypeImpl(

9073

AT->getElementType(), S,

9074

Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD);

9078 if

(

const auto

*CAT = dyn_cast<ConstantArrayType>(AT))

9079

S += llvm::utostr(CAT->getZExtSize());

9082

assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) &&

9083 "Unknown array type!"

);

9087

getObjCEncodingForTypeImpl(

9088

AT->getElementType(), S,

9089

Options.keepingOnly(ObjCEncOptions().setExpandStructures()), FD,

9096 case

Type::FunctionNoProto:

9097 case

Type::FunctionProto:

9101 case

Type::Record: {

9102 RecordDecl

*RDecl = cast<RecordType>(CT)->getDecl();

9103

S += RDecl->

isUnion

() ?

'('

:

'{'

;

9107 if

(

const auto

*Spec = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) {

9109

llvm::raw_string_ostream OS(S);

9116 if

(Options.ExpandStructures()) {

9119

getObjCEncodingForStructureImpl(RDecl, S, FD,

true

, NotEncodedT);

9121 for

(

const auto

*Field : RDecl->

fields

()) {

9124

S +=

Field

->getNameAsString();

9129 if

(

Field

->isBitField()) {

9130

getObjCEncodingForTypeImpl(

Field

->getType(), S,

9131

ObjCEncOptions().setExpandStructures(),

9136

getObjCEncodingForTypeImpl(

9138

ObjCEncOptions().setExpandStructures().setIsStructField(), FD,

9144

S += RDecl->

isUnion

() ?

')'

:

'}'

;

9148 case

Type::BlockPointer: {

9151 if

(Options.EncodeBlockParameters()) {

9152 const auto

*FT = BT->getPointeeType()->castAs<

FunctionType

>();

9156

getObjCEncodingForTypeImpl(FT->getReturnType(), S,

9157

Options.forComponentType(), FD, NotEncodedT);

9161 if

(

const auto

*FPT = dyn_cast<FunctionProtoType>(FT)) {

9162 for

(

const auto

&I : FPT->param_types())

9163

getObjCEncodingForTypeImpl(I, S, Options.forComponentType(), FD,

9171 case

Type::ObjCObject: {

9175

S +=

"{objc_object=}"

;

9179

S +=

"{objc_class=}"

;

9186 case

Type::ObjCInterface: {

9192 if

(Options.ExpandStructures()) {

9196 for

(

unsigned

i = 0, e = Ivars.size(); i != e; ++i) {

9198 if

(

Field

->isBitField())

9199

getObjCEncodingForTypeImpl(

Field

->getType(), S,

9200

ObjCEncOptions().setExpandStructures(),

9203

getObjCEncodingForTypeImpl(

Field

->getType(), S,

9204

ObjCEncOptions().setExpandStructures(), FD,

9212 case

Type::ObjCObjectPointer: {

9214 if

(OPT->isObjCIdType()) {

9219 if

(OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) {

9227 if

(OPT->isObjCQualifiedIdType()) {

9228

getObjCEncodingForTypeImpl(

9230

Options.keepingOnly(ObjCEncOptions()

9231

.setExpandPointedToStructures()

9232

.setExpandStructures()),

9234 if

(FD || Options.EncodingProperty() || Options.EncodeClassNames()) {

9238 for

(

const auto

*I : OPT->quals()) {

9240

S += I->getObjCRuntimeNameAsString();

9249 if

(OPT->getInterfaceDecl() &&

9250

(FD || Options.EncodingProperty() || Options.EncodeClassNames())) {

9252

S += OPT->getInterfaceDecl()->getObjCRuntimeNameAsString();

9253 for

(

const auto

*I : OPT->quals()) {

9255

S += I->getObjCRuntimeNameAsString();

9265 case

Type::MemberPointer:

9269 case

Type::ExtVector:

9275 case

Type::ConstantMatrix:

9288 case

Type::DeducedTemplateSpecialization:

9291 case

Type::HLSLAttributedResource:

9292

llvm_unreachable(

"unexpected type"

);

9294 case

Type::ArrayParameter:

9296#define ABSTRACT_TYPE(KIND, BASE) 9297#define TYPE(KIND, BASE) 9298#define DEPENDENT_TYPE(KIND, BASE) \ 9300#define NON_CANONICAL_TYPE(KIND, BASE) \ 9302#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(KIND, BASE) \ 9304#include "clang/AST/TypeNodes.inc" 9305

llvm_unreachable(

"@encode for dependent type!"

);

9307

llvm_unreachable(

"bad type kind!"

);

9310void

ASTContext::getObjCEncodingForStructureImpl(

RecordDecl

*RDecl,

9315

assert(RDecl &&

"Expected non-null RecordDecl"

);

9316

assert(!RDecl->

isUnion

() &&

"Should not be called for unions"

);

9320 const auto

*CXXRec = dyn_cast<CXXRecordDecl>(RDecl);

9321

std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets;

9325 for

(

const auto

&BI : CXXRec->bases()) {

9326 if

(!BI.isVirtual()) {

9331

FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),

9332

std::make_pair(offs, base));

9338 if

(!

Field

->isZeroLengthBitField() &&

Field

->isZeroSize(*

this

))

9341

FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),

9342

std::make_pair(offs, Field));

9345 if

(CXXRec && includeVBases) {

9346 for

(

const auto

&BI : CXXRec->vbases()) {

9352

FieldOrBaseOffsets.find(offs) == FieldOrBaseOffsets.end())

9353

FieldOrBaseOffsets.insert(FieldOrBaseOffsets.end(),

9354

std::make_pair(offs, base));

9368

std::multimap<uint64_t, NamedDecl *>::iterator

9369

CurLayObj = FieldOrBaseOffsets.begin();

9371 if

(CXXRec && CXXRec->isDynamicClass() &&

9372

(CurLayObj == FieldOrBaseOffsets.end() || CurLayObj->first != 0)) {

9375

std::string recname = CXXRec->getNameAsString();

9376 if

(recname.empty()) recname =

"?"

;

9389

FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),

9390

std::make_pair(offs,

nullptr

));

9393 for

(; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) {

9395

assert(CurOffs <= CurLayObj->first);

9396 if

(CurOffs < CurLayObj->first) {

9397 uint64_t

padding = CurLayObj->first - CurOffs;

9413 if

(

auto

*base = dyn_cast<CXXRecordDecl>(dcl)) {

9418

getObjCEncodingForStructureImpl(base, S, FD,

false

,

9425 const auto

*field = cast<FieldDecl>(dcl);

9428

S += field->getNameAsString();

9432 if

(field->isBitField()) {

9435

CurOffs += field->getBitWidthValue();

9440

getObjCEncodingForTypeImpl(

9441

qt, S, ObjCEncOptions().setExpandStructures().setIsStructField(),

9452

std::string& S)

const

{

9485 if

(!ObjCClassDecl) {

9490 return

ObjCClassDecl;

9494 if

(!ObjCProtocolClassDecl) {

9495

ObjCProtocolClassDecl

9504 return

ObjCProtocolClassDecl;

9549 const size_t

NumFields = 5;

9551 const char

*FieldNames[NumFields];

9555

FieldNames[0] =

"__stack"

;

9559

FieldNames[1] =

"__gr_top"

;

9563

FieldNames[2] =

"__vr_top"

;

9566

FieldTypes[3] = Context->

IntTy

;

9567

FieldNames[3] =

"__gr_offs"

;

9570

FieldTypes[4] = Context->

IntTy

;

9571

FieldNames[4] =

"__vr_offs"

;

9574 for

(

unsigned

i = 0; i < NumFields; ++i) {

9579

&Context->

Idents

.

get

(FieldNames[i]),

9580

FieldTypes[i],

nullptr

,

9585

VaListTagDecl->

addDecl

(Field);

9602 const size_t

NumFields = 5;

9604 const char

*FieldNames[NumFields];

9608

FieldNames[0] =

"gpr"

;

9612

FieldNames[1] =

"fpr"

;

9616

FieldNames[2] =

"reserved"

;

9620

FieldNames[3] =

"overflow_arg_area"

;

9624

FieldNames[4] =

"reg_save_area"

;

9627 for

(

unsigned

i = 0; i < NumFields; ++i) {

9631

&Context->

Idents

.

get

(FieldNames[i]),

9632

FieldTypes[i],

nullptr

,

9637

VaListTagDecl->

addDecl

(Field);

9664 const size_t

NumFields = 4;

9666 const char

*FieldNames[NumFields];

9670

FieldNames[0] =

"gp_offset"

;

9674

FieldNames[1] =

"fp_offset"

;

9678

FieldNames[2] =

"overflow_arg_area"

;

9682

FieldNames[3] =

"reg_save_area"

;

9685 for

(

unsigned

i = 0; i < NumFields; ++i) {

9690

&Context->

Idents

.

get

(FieldNames[i]),

9691

FieldTypes[i],

nullptr

,

9696

VaListTagDecl->

addDecl

(Field);

9767 const size_t

NumFields = 4;

9769 const char

*FieldNames[NumFields];

9772

FieldTypes[0] = Context->

LongTy

;

9773

FieldNames[0] =

"__gpr"

;

9776

FieldTypes[1] = Context->

LongTy

;

9777

FieldNames[1] =

"__fpr"

;

9781

FieldNames[2] =

"__overflow_arg_area"

;

9785

FieldNames[3] =

"__reg_save_area"

;

9788 for

(

unsigned

i = 0; i < NumFields; ++i) {

9793

&Context->

Idents

.

get

(FieldNames[i]),

9794

FieldTypes[i],

nullptr

,

9799

VaListTagDecl->

addDecl

(Field);

9821 const size_t

NumFields = 3;

9823 const char

*FieldNames[NumFields];

9827

FieldNames[0] =

"__current_saved_reg_area_pointer"

;

9831

FieldNames[1] =

"__saved_reg_area_end_pointer"

;

9835

FieldNames[2] =

"__overflow_area_pointer"

;

9838 for

(

unsigned

i = 0; i < NumFields; ++i) {

9846

VaListTagDecl->

addDecl

(Field);

9876 constexpr size_t

NumFields = 3;

9880 const char

*FieldNames[NumFields] = {

"__va_stk"

,

"__va_reg"

,

"__va_ndx"

};

9883 for

(

unsigned

i = 0; i < NumFields; ++i) {

9886

&Context->

Idents

.

get

(FieldNames[i]), FieldTypes[i],

nullptr

,

9890

VaListTagDecl->

addDecl

(Field);

9900 return

VaListTagTypedefDecl;

9928

llvm_unreachable(

"Unhandled __builtin_va_list type kind"

);

9932 if

(!BuiltinVaListDecl) {

9937 return

BuiltinVaListDecl;

9950 if

(!BuiltinMSVaListDecl)

9953 return

BuiltinMSVaListDecl;

9965

assert(ObjCConstantStringType.

isNull

() &&

9966 "'NSConstantString' type already set!"

);

9976 unsigned

size = End -

Begin

;

9977

assert(size > 1 &&

"set is not overloaded!"

);

9986

assert(isa<FunctionTemplateDecl>(

D

) ||

9987

isa<UnresolvedUsingValueDecl>(

D

) ||

9988

(isa<UsingShadowDecl>(

D

) &&

9989

isa<FunctionTemplateDecl>(

D

->getUnderlyingDecl())));

10006 bool

TemplateKeyword,

10012

llvm::FoldingSetNodeID ID;

10015 void

*InsertPos =

nullptr

;

10017

QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos);

10021

QualifiedTemplateNames.InsertNode(QTN, InsertPos);

10033 "Nested name specifier must be dependent"

);

10035

llvm::FoldingSetNodeID ID;

10038 void

*InsertPos =

nullptr

;

10040

DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);

10046 if

(CanonNNS == NNS) {

10054

DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);

10055

assert(!CheckQTN &&

"Dependent type name canonicalization broken"

);

10059

DependentTemplateNames.InsertNode(QTN, InsertPos);

10069 "Nested name specifier must be dependent"

);

10071

llvm::FoldingSetNodeID ID;

10074 void

*InsertPos =

nullptr

;

10076

= DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);

10082 if

(CanonNNS == NNS) {

10091

= DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos);

10092

assert(!CheckQTN &&

"Dependent template name canonicalization broken"

);

10096

DependentTemplateNames.InsertNode(QTN, InsertPos);

10102

std::optional<unsigned> PackIndex)

const

{

10103

llvm::FoldingSetNodeID ID;

10107 void

*insertPos =

nullptr

;

10109

= SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos);

10113

Replacement, AssociatedDecl, Index, PackIndex);

10114

SubstTemplateTemplateParms.InsertNode(subst, insertPos);

10122 Decl

*AssociatedDecl,

10123 unsigned

Index,

bool

Final)

const

{

10125

llvm::FoldingSetNodeID ID;

10127

AssociatedDecl, Index, Final);

10129 void

*InsertPos =

nullptr

;

10131

= SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos);

10136

SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos);

10150

llvm::FoldingSetNodeID ID;

10153 void

*InsertPos =

nullptr

;

10155

DeducedTemplates.FindNodeOrInsertPos(ID, InsertPos);

10161

DeducedTemplates.InsertNode(DTS, InsertPos);

10184

llvm_unreachable(

"Unhandled TargetInfo::IntType value"

);

10214 while

(

const auto

*AT = dyn_cast<ArrayType>(CT))

10215

CT = AT->getElementType();

10247

assert(FirstVec->

isVectorType

() &&

"FirstVec should be a vector type"

);

10248

assert(SecondVec->

isVectorType

() &&

"SecondVec should be a vector type"

);

10285 if

(Ty->

getKind

() == BuiltinType::SveBool ||

10286

Ty->

getKind

() == BuiltinType::SveCount)

10299 return

BT->getKind() == BuiltinType::SveBool;

10301 return

VT->getElementType().getCanonicalType() ==

10312 return

IsValidCast(FirstType, SecondType) ||

10313

IsValidCast(SecondType, FirstType);

10318 auto

IsLaxCompatible = [

this

](

QualType

FirstType,

QualType

SecondType) {

10331 if

(BT->getKind() == BuiltinType::SveBool &&

10352 return

VecTy->getElementType().getCanonicalType()->isIntegerType() &&

10359 return

IsLaxCompatible(FirstType, SecondType) ||

10360

IsLaxCompatible(SecondType, FirstType);

10377

uint64_t MinElts = Info.

EC

.getKnownMinValue();

10378 return

VScale->first * MinElts * EltSize;

10386 "Expected RVV builtin type and vector type!"

);

10426 return

IsValidCast(FirstType, SecondType) ||

10427

IsValidCast(SecondType, FirstType);

10435 "Expected RVV builtin type and vector type!"

);

10437 auto

IsLaxCompatible = [

this

](

QualType

FirstType,

QualType

SecondType) {

10442 if

(!BT->isRVVVLSBuiltinType())

10462 return

VecTy->getElementType().getCanonicalType()->isIntegerType() &&

10469 return

IsLaxCompatible(FirstType, SecondType) ||

10470

IsLaxCompatible(SecondType, FirstType);

10477 if

(

Attr

->getAttrKind() == attr::ObjCOwnership)

10480

Ty =

Attr

->getModifiedType();

10483

}

else if

(

const ParenType

*

Paren

= dyn_cast<ParenType>(Ty)) {

10484

Ty =

Paren

->getInnerType();

10506 for

(

auto

*PI : rProto->

protocols

())

10516 for

(

auto

*lhsProto : lhs->

quals

()) {

10517 bool match

=

false

;

10518 for

(

auto

*rhsProto : rhs->

quals

()) {

10549 for

(

auto

*I : lhs->

quals

()) {

10553 if

(!rhsID->ClassImplementsProtocol(I,

true

))

10561 for

(

auto

*lhsProto : lhs->

quals

()) {

10562 bool match

=

false

;

10567 for

(

auto

*rhsProto : rhs->

quals

()) {

10577 for

(

auto

*I : lhs->

quals

()) {

10581 if

(rhsID->ClassImplementsProtocol(I,

true

)) {

10598 for

(

auto

*lhsProto : lhs->

quals

()) {

10599 bool match

=

false

;

10606 for

(

auto

*rhsProto : rhs->

quals

()) {

10625 if

(LHSInheritedProtocols.empty() && lhs->

qual_empty

())

10627 for

(

auto

*lhsProto : LHSInheritedProtocols) {

10628 bool match

=

false

;

10629 for

(

auto

*rhsProto : rhs->

quals

()) {

10659 auto

finish = [&](

bool

succeeded) ->

bool

{

10704 bool

BlockReturnType) {

10708 auto

finish = [&](

bool

succeeded) ->

bool

{

10733 if

(

getLangOpts

().CompatibilityQualifiedIdBlockParamTypeChecking)

10737

(!BlockReturnType &&

10741

(BlockReturnType ? LHSOPT : RHSOPT),

10742

(BlockReturnType ? RHSOPT : LHSOPT),

false

));

10750 return

finish(BlockReturnType);

10752 return

finish(!BlockReturnType);

10764 return

(*lhs)->getName().compare((*rhs)->getName());

10781

assert(LHS->

getInterface

() &&

"LHS must have an interface base"

);

10782

assert(RHS->

getInterface

() &&

"RHS must have an interface base"

);

10788 for

(

auto

*proto : LHS->

quals

()) {

10799 for

(

auto

*proto : RHS->

quals

()) {

10807 for

(

auto

*proto : LHSProtocolSet) {

10808 if

(RHSProtocolSet.count(proto))

10809

IntersectionSet.push_back(proto);

10818 if

(!ImpliedProtocols.empty()) {

10820 return

ImpliedProtocols.contains(proto);

10825

llvm::array_pod_sort(IntersectionSet.begin(), IntersectionSet.end(),

10835 if

(lhsOPT && rhsOPT)

10841 if

(lhsBlock && rhsBlock)

10846 if

((lhsOPT && lhsOPT->isObjCIdType() && rhsBlock) ||

10858 bool

stripKindOf) {

10859 if

(lhsArgs.size() != rhsArgs.size())

10866 for

(

unsigned

i = 0, n = lhsArgs.size(); i != n; ++i) {

10872 if

(!stripKindOf ||

10873

!ctx.

hasSameType

(lhsArgs[i].stripObjCKindOfType(ctx),

10874

rhsArgs[i].stripObjCKindOfType(ctx))) {

10902 if

(!LDecl || !RDecl)

10912

llvm::SmallDenseMap<const ObjCInterfaceDecl *, const ObjCObjectType *, 4>

10922 bool

anyChanges =

false

;

10933

anyChanges =

true

;

10940 if

(!Protocols.empty())

10941

anyChanges =

true

;

10946 if

(anyChanges || LHS->

isKindOfType

() != anyKindOf) {

10958 if

(LHSSuperType.

isNull

())

10968 if

(KnownLHS != LHSAncestors.end()) {

10969

LHS = KnownLHS->second;

10973 bool

anyChanges =

false

;

10984

anyChanges =

true

;

10991 if

(!Protocols.empty())

10992

anyChanges =

true

;

10996 if

(anyChanges || RHS->

isKindOfType

() != anyKindOf) {

11008 if

(RHSSuperType.

isNull

())

11019

assert(LHS->

getInterface

() &&

"LHS is not an interface type"

);

11020

assert(RHS->

getInterface

() &&

"RHS is not an interface type"

);

11041 for

(

auto

*RHSPI : RHS->

quals

())

11044 if

(SuperClassInheritedProtocols.empty())

11047 for

(

const auto

*LHSProto : LHS->

quals

()) {

11048 bool

SuperImplementsProtocol =

false

;

11049 for

(

auto

*SuperClassProto : SuperClassInheritedProtocols)

11050 if

(SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) {

11051

SuperImplementsProtocol =

true

;

11054 if

(!SuperImplementsProtocol)

11084 if

(!LHSOPT || !RHSOPT)

11102 bool

CompareUnqualified) {

11121 bool

OfBlockPointer,

11125 if

(UD->

hasAttr

<TransparentUnionAttr>()) {

11126 for

(

const auto

*I : UD->

fields

()) {

11127 QualType

ET = I->getType().getUnqualifiedType();

11141 bool

OfBlockPointer,

11162 bool

IsConditionalOperator) {

11165 const auto

*lproto = dyn_cast<FunctionProtoType>(lbase);

11166 const auto

*rproto = dyn_cast<FunctionProtoType>(rbase);

11167 bool

allLTypes =

true

;

11168 bool

allRTypes =

true

;

11172 if

(OfBlockPointer) {

11174 QualType

LHS = lbase->getReturnType();

11176 if

(!UnqualifiedResult)

11178

retType =

mergeTypes

(LHS, RHS,

true

, UnqualifiedResult,

true

);

11197

allLTypes =

false

;

11199

allRTypes =

false

;

11209 if

(lbaseInfo.

getCC

() != rbaseInfo.

getCC

())

11243 bool

NoReturn = IsConditionalOperator

11247

allLTypes =

false

;

11249

allRTypes =

false

;

11253

std::optional<FunctionEffectSet> MergedFX;

11255 if

(lproto && rproto) {

11256

assert((AllowCXX ||

11257

(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec())) &&

11258 "C++ shouldn't be here"

);

11260 if

(lproto->getNumParams() != rproto->getNumParams())

11264 if

(lproto->isVariadic() != rproto->isVariadic())

11267 if

(lproto->getMethodQuals() != rproto->getMethodQuals())

11273 if

(LHSFX != RHSFX) {

11274 if

(IsConditionalOperator)

11283 if

(*MergedFX != LHSFX)

11284

allLTypes =

false

;

11285 if

(*MergedFX != RHSFX)

11286

allRTypes =

false

;

11290 bool

canUseLeft, canUseRight;

11296

allLTypes =

false

;

11298

allRTypes =

false

;

11302 for

(

unsigned

i = 0, n = lproto->getNumParams(); i < n; i++) {

11303 QualType

lParamType = lproto->getParamType(i).getUnqualifiedType();

11304 QualType

rParamType = rproto->getParamType(i).getUnqualifiedType();

11306

lParamType, rParamType, OfBlockPointer,

Unqualified

);

11307 if

(paramType.

isNull

())

11313 types

.push_back(paramType);

11320

allLTypes =

false

;

11322

allRTypes =

false

;

11325 if

(allLTypes)

return

lhs;

11326 if

(allRTypes)

return

rhs;

11331

newParamInfos.empty() ? nullptr : newParamInfos.data();

11337 if

(lproto) allRTypes =

false

;

11338 if

(rproto) allLTypes =

false

;

11342

assert((AllowCXX || !proto->

hasExceptionSpec

()) &&

"C++ shouldn't be here"

);

11350 for

(

unsigned

i = 0, n = proto->

getNumParams

(); i < n; ++i) {

11356

paramTy =

Enum

->getDecl()->getIntegerType();

11366 if

(allLTypes)

return

lhs;

11367 if

(allRTypes)

return

rhs;

11376 if

(allLTypes)

return

lhs;

11377 if

(allRTypes)

return

rhs;

11383 QualType

other,

bool

isBlockReturnType) {

11389 if

(underlyingType.

isNull

())

11391 if

(Context.

hasSameType

(underlyingType, other))

11405 bool

IsConditionalOperator) {

11416 if

(LangOpts.OpenMP && LHSRefTy && RHSRefTy &&

11420 if

(LHSRefTy || RHSRefTy)

11432 if

(LHSCan == RHSCan)

11437 Qualifiers

RQuals = RHSCan.getLocalQualifiers();

11438 if

(LQuals != RQuals) {

11454

assert((GC_L != GC_R) &&

"unequal qualifier sets had only equal elements"

);

11475 if

(LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;

11476 if

(RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;

11479 if

(LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)

11480

LHSClass = Type::ConstantArray;

11481 if

(RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray)

11482

RHSClass = Type::ConstantArray;

11485 if

(LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject;

11486 if

(RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject;

11489 if

(LHSClass == Type::ExtVector) LHSClass = Type::Vector;

11490 if

(RHSClass == Type::ExtVector) RHSClass = Type::Vector;

11493 if

(LHSClass != RHSClass) {

11503 if

(OfBlockPointer && !BlockReturnType) {

11512 if

(!AT->isDeduced() && AT->isGNUAutoType())

11516 if

(!AT->isDeduced() && AT->isGNUAutoType())

11523 switch

(LHSClass) {

11524#define TYPE(Class, Base) 11525#define ABSTRACT_TYPE(Class, Base) 11526#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 11527#define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 11528#define DEPENDENT_TYPE(Class, Base) case Type::Class: 11529#include "clang/AST/TypeNodes.inc" 11530

llvm_unreachable(

"Non-canonical and dependent types shouldn't get here"

);

11533 case

Type::DeducedTemplateSpecialization:

11534 case

Type::LValueReference:

11535 case

Type::RValueReference:

11536 case

Type::MemberPointer:

11537

llvm_unreachable(

"C++ should never be in mergeTypes"

);

11539 case

Type::ObjCInterface:

11540 case

Type::IncompleteArray:

11541 case

Type::VariableArray:

11542 case

Type::FunctionProto:

11543 case

Type::ExtVector:

11544

llvm_unreachable(

"Types are eliminated above"

);

11546 case

Type::Pointer:

11557 if

(ResultType.

isNull

())

11565 case

Type::BlockPointer:

11590 if

(ResultType.

isNull

())

11609 if

(ResultType.

isNull

())

11617 case

Type::ConstantArray:

11632 if

(ResultType.

isNull

())

11640 if

(LVAT || RVAT) {

11643

-> std::pair<bool,llvm::APInt> {

11645

std::optional<llvm::APSInt> TheInt;

11648 return

std::make_pair(

true

, *TheInt);

11649 return

std::make_pair(

false

, llvm::APSInt());

11652 return

std::make_pair(

true

, CAT->getSize());

11653 return

std::make_pair(

false

, llvm::APInt());

11656 bool

HaveLSize, HaveRSize;

11657

llvm::APInt LSize, RSize;

11658

std::tie(HaveLSize, LSize) = SizeFetch(LVAT, LCAT);

11659

std::tie(HaveRSize, RSize) = SizeFetch(RVAT, RCAT);

11660 if

(HaveLSize && HaveRSize && !llvm::APInt::isSameValue(LSize, RSize))

11694 case

Type::FunctionNoProto:

11696 false

, IsConditionalOperator);

11700 case

Type::Builtin:

11703 case

Type::Complex:

11712 case

Type::ConstantMatrix:

11717 case

Type::ObjCObject: {

11726 case

Type::ObjCObjectPointer:

11727 if

(OfBlockPointer) {

11739

assert(LHS != RHS &&

11740 "Equivalent pipe types should have already been handled!"

);

11742 case

Type::ArrayParameter:

11743

assert(LHS != RHS &&

11744 "Equivalent ArrayParameter types should have already been handled!"

);

11746 case

Type::BitInt: {

11754 if

(LHSUnsigned != RHSUnsigned)

11757 if

(LHSBits != RHSBits)

11761 case

Type::HLSLAttributedResource: {

11768 "HLSLAttributedResourceType should always wrap __hlsl_resource_t"

);

11770 if

(LHSTy->

getAttrs

() == RHSTy->getAttrs() &&

11777

llvm_unreachable(

"Invalid Type::Class!"

);

11782 bool

&CanUseFirst,

bool

&CanUseSecond,

11784

assert(NewParamInfos.empty() &&

"param info list not empty"

);

11785

CanUseFirst = CanUseSecond =

true

;

11791 if

(!FirstHasInfo && !SecondHasInfo)

11794 bool

NeedParamInfo =

false

;

11798 for

(

size_t

I = 0; I <

E

; ++I) {

11809 bool

FirstNoEscape = FirstParam.

isNoEscape

();

11810 bool

SecondNoEscape = SecondParam.

isNoEscape

();

11811 bool

IsNoEscape = FirstNoEscape && SecondNoEscape;

11812

NewParamInfos.push_back(FirstParam.

withIsNoEscape

(IsNoEscape));

11813 if

(NewParamInfos.back().getOpaqueValue())

11814

NeedParamInfo =

true

;

11815 if

(FirstNoEscape != IsNoEscape)

11816

CanUseFirst =

false

;

11817 if

(SecondNoEscape != IsNoEscape)

11818

CanUseSecond =

false

;

11821 if

(!NeedParamInfo)

11822

NewParamInfos.clear();

11828

ObjCLayouts[CD] =

nullptr

;

11838 if

(LHSCan == RHSCan)

11840 if

(RHSCan->isFunctionType()) {

11844

cast<FunctionType>(RHSCan.getTypePtr())->getReturnType();

11846

cast<FunctionType>(LHSCan.

getTypePtr

())->getReturnType();

11849 if

(ResReturnType.

isNull

())

11851 if

(ResReturnType == NewReturnType || ResReturnType == OldReturnType) {

11855 if

(

const auto

*FPT = cast<FunctionProtoType>(F)) {

11868 Qualifiers

RQuals = RHSCan.getLocalQualifiers();

11869 if

(LQuals != RQuals) {

11882

assert((GC_L != GC_R) &&

"unequal qualifier sets had only equal elements"

);

11898 if

(ResQT == LHSBaseQT)

11900 if

(ResQT == RHSBaseQT)

11912 T

= ET->getDecl()->getIntegerType();

11916 return

EIT->getNumBits();

11924 "Unexpected type"

);

11929

VTy->getNumElements(), VTy->getVectorKind());

11938 T

= ETy->getDecl()->getIntegerType();

11941 case

BuiltinType::Char_U:

11943 case

BuiltinType::Char_S:

11944 case

BuiltinType::SChar:

11945 case

BuiltinType::Char8:

11947 case

BuiltinType::Short:

11949 case

BuiltinType::Int:

11951 case

BuiltinType::Long:

11953 case

BuiltinType::LongLong:

11955 case

BuiltinType::Int128:

11960 case

BuiltinType::WChar_S:

11963 case

BuiltinType::ShortAccum:

11965 case

BuiltinType::Accum:

11967 case

BuiltinType::LongAccum:

11969 case

BuiltinType::SatShortAccum:

11971 case

BuiltinType::SatAccum:

11973 case

BuiltinType::SatLongAccum:

11975 case

BuiltinType::ShortFract:

11977 case

BuiltinType::Fract:

11979 case

BuiltinType::LongFract:

11981 case

BuiltinType::SatShortFract:

11983 case

BuiltinType::SatFract:

11985 case

BuiltinType::SatLongFract:

11990 "Unexpected signed integer or fixed point type"

);

11998 "Unexpected type"

);

12003

VTy->getNumElements(), VTy->getVectorKind());

12012 T

= ETy->getDecl()->getIntegerType();

12015 case

BuiltinType::Char_S:

12017 case

BuiltinType::Char_U:

12018 case

BuiltinType::UChar:

12019 case

BuiltinType::Char8:

12021 case

BuiltinType::UShort:

12023 case

BuiltinType::UInt:

12025 case

BuiltinType::ULong:

12027 case

BuiltinType::ULongLong:

12029 case

BuiltinType::UInt128:

12034 case

BuiltinType::WChar_U:

12037 case

BuiltinType::UShortAccum:

12039 case

BuiltinType::UAccum:

12041 case

BuiltinType::ULongAccum:

12043 case

BuiltinType::SatUShortAccum:

12045 case

BuiltinType::SatUAccum:

12047 case

BuiltinType::SatULongAccum:

12049 case

BuiltinType::UShortFract:

12051 case

BuiltinType::UFract:

12053 case

BuiltinType::ULongFract:

12055 case

BuiltinType::SatUShortFract:

12057 case

BuiltinType::SatUFract:

12059 case

BuiltinType::SatULongFract:

12064 "Unexpected signed integer or fixed point type"

);

12089 bool

AllowTypeModifiers) {

12093

RequiresICE =

false

;

12096 bool

Done =

false

;

12098 bool

IsSpecial =

false

;

12102 default

: Done =

true

; --Str;

break

;

12104

RequiresICE =

true

;

12107

assert(!

Unsigned

&&

"Can't use both 'S' and 'U' modifiers!"

);

12108

assert(!

Signed

&&

"Can't use 'S' modifier multiple times!"

);

12112

assert(!

Signed

&&

"Can't use both 'S' and 'U' modifiers!"

);

12113

assert(!

Unsigned

&&

"Can't use 'U' modifier multiple times!"

);

12117

assert(!IsSpecial &&

"Can't use 'L' with 'W', 'N', 'Z' or 'O' modifiers"

);

12118

assert(HowLong <= 2 &&

"Can't have LLLL modifier"

);

12123

assert(!IsSpecial &&

"Can't use two 'N', 'W', 'Z' or 'O' modifiers!"

);

12124

assert(HowLong == 0 &&

"Can't use both 'L' and 'N' modifiers!"

);

12133

assert(!IsSpecial &&

"Can't use two 'N', 'W', 'Z' or 'O' modifiers!"

);

12134

assert(HowLong == 0 &&

"Can't use both 'L' and 'W' modifiers!"

);

12140

llvm_unreachable(

"Unexpected integer type"

);

12151

assert(!IsSpecial &&

"Can't use two 'N', 'W', 'Z' or 'O' modifiers!"

);

12152

assert(HowLong == 0 &&

"Can't use both 'L' and 'Z' modifiers!"

);

12158

llvm_unreachable(

"Unexpected integer type"

);

12171

assert(!IsSpecial &&

"Can't use two 'N', 'W', 'Z' or 'O' modifiers!"

);

12172

assert(HowLong == 0 &&

"Can't use both 'L' and 'O' modifiers!"

);

12188 default

: llvm_unreachable(

"Unknown builtin type letter!"

);

12191 "Bad modifiers used with 'x'!"

);

12196 "Bad modifiers used with 'y'!"

);

12201 "Bad modifiers used with 'v'!"

);

12206 "Bad modifiers used with 'h'!"

);

12211 "Bad modifiers used with 'f'!"

);

12216 "Bad modifiers used with 'd'!"

);

12219 else if

(HowLong == 2)

12225

assert(HowLong == 0 &&

"Bad modifiers used with 's'!"

);

12234 else if

(HowLong == 2)

12236 else if

(HowLong == 1)

12242

assert(HowLong == 0 &&

"Bad modifiers used with 'c'!"

);

12251

assert(HowLong == 0 && !

Signed

&& !

Unsigned

&&

"Bad modifiers for 'b'!"

);

12255

assert(HowLong == 0 && !

Signed

&& !

Unsigned

&&

"Bad modifiers for 'z'!"

);

12259

assert(HowLong == 0 && !

Signed

&& !

Unsigned

&&

"Bad modifiers for 'w'!"

);

12276

assert(!

Type

.isNull() &&

"builtin va list type not initialized!"

);

12288

assert(!

Type

.isNull() &&

"builtin va list type not initialized!"

);

12296 unsigned

NumElements = strtoul(Str, &End, 10);

12297

assert(End != Str &&

"Missing vector size"

);

12301

RequiresICE,

false

);

12302

assert(!RequiresICE &&

"Can't require vector ICE"

);

12310 Type

= Context.SveCountTy;

12314 Type

= Context.AMDGPUBufferRsrcTy;

12318

llvm_unreachable(

"Unexpected target builtin type"

);

12324 unsigned

NumElements = strtoul(Str, &End, 10);

12325

assert(End != Str &&

"Missing vector size"

);

12329

RequiresICE,

false

);

12330

assert(!RequiresICE &&

"Can't require vector ICE"

);

12339 unsigned

NumElements = strtoul(Str, &End, 10);

12340

assert(End != Str &&

"Missing vector size"

);

12352

assert(!RequiresICE &&

"Can't require complex ICE"

);

12361 if

(

Type

.isNull()) {

12372 if

(

Type

.isNull()) {

12378

assert(HowLong == 0 && !

Signed

&& !

Unsigned

&&

"Bad modifiers for 'K'!"

);

12381 if

(

Type

.isNull()) {

12390 Type

= Context.MFloat8Ty;

12395

Done = !AllowTypeModifiers;

12397 switch

(

char c

= *Str++) {

12398 default

: Done =

true

; --Str;

break

;

12404 unsigned

AddrSpace = strtoul(Str, &End, 10);

12432 "Integer constant 'I' type must be an integer"

);

12445 bool

AllowTypeModifiers)

const

{

12446 return DecodeTypeFromStr

(Str, Context, Error, RequireICE, AllowTypeModifiers);

12452 unsigned

*IntegerConstantArgs)

const

{

12454 if

(TypeStr[0] ==

'\0'

) {

12461 bool

RequiresICE =

false

;

12464

RequiresICE,

true

);

12468

assert(!RequiresICE &&

"Result of intrinsic cannot be required to be an ICE"

);

12470 while

(TypeStr[0] && TypeStr[0] !=

'.'

) {

12477 if

(RequiresICE && IntegerConstantArgs)

12478

*IntegerConstantArgs |= 1 << ArgTypes.size();

12484

ArgTypes.push_back(Ty);

12487 if

(

Id

== Builtin::BI__GetExceptionInfo)

12490

assert((TypeStr[0] !=

'.'

|| TypeStr[1] == 0) &&

12491 "'.' should only occur at end of builtin type list!"

);

12493 bool

Variadic = (TypeStr[0] ==

'.'

);

12496

Variadic,

false

,

true

));

12501 if

(ArgTypes.empty() && Variadic && !

getLangOpts

().requiresStrictPrototypes())

12553

!FD->

hasAttr

<DLLExportAttr>()) ||

12554

FD->

hasAttr

<GNUInlineAttr>()) {

12573

isa<CXXConstructorDecl>(FD) &&

12574

cast<CXXConstructorDecl>(FD)->isInheritingConstructor())

12587 if

(

D

->

hasAttr

<DLLImportAttr>()) {

12590

}

else if

(

D

->

hasAttr

<DLLExportAttr>()) {

12596 if

(

D

->

hasAttr

<CUDAGlobalAttr>() &&

12659 while

(LexicalContext && !isa<FunctionDecl>(LexicalContext))

12664 if

(!LexicalContext)

12669 auto

StaticLocalLinkage =

12681 return

StaticLocalLinkage;

12708 return

StrongLinkage;

12726

llvm_unreachable(

"Invalid Linkage!"

);

12736 if

(

const auto

*VD = dyn_cast<VarDecl>(

D

)) {

12737 if

(!VD->isFileVarDecl())

12742 if

(VD->getDescribedVarTemplate() ||

12743

isa<VarTemplatePartialSpecializationDecl>(VD))

12745

}

else if

(

const auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

12749

}

else if

(isa<PragmaCommentDecl>(

D

))

12751 else if

(isa<PragmaDetectMismatchDecl>(

D

))

12753 else if

(isa<OMPRequiresDecl>(

D

))

12755 else if

(isa<OMPThreadPrivateDecl>(

D

))

12757 else if

(isa<OMPAllocateDecl>(

D

))

12759 else if

(isa<OMPDeclareReductionDecl>(

D

) || isa<OMPDeclareMapperDecl>(

D

))

12761 else if

(isa<ImportDecl>(

D

))

12771 if

(

D

->

hasAttr

<WeakRefAttr>())

12778 if

(

const auto

*FD = dyn_cast<FunctionDecl>(

D

)) {

12780 if

(!FD->doesThisDeclarationHaveABody())

12781 return

FD->doesDeclarationForceExternallyVisibleDefinition();

12784 if

(FD->

hasAttr

<ConstructorAttr>() || FD->

hasAttr

<DestructorAttr>())

12789 if

(

getTargetInfo

().getCXXABI().canKeyFunctionBeInline()) {

12790 if

(

const auto

*MD = dyn_cast<CXXMethodDecl>(FD)) {

12808 const auto

*VD = cast<VarDecl>(

D

);

12809

assert(VD->isFileVarDecl() &&

"Expected file scoped var"

);

12813 if

(LangOpts.OpenMP &&

12814

OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))

12821 if

(VD->shouldEmitInExternalSource())

12834 if

(VD->needsDestruction(*

this

))

12838 if

(VD->getInit() && VD->getInit()->HasSideEffects(*

this

) &&

12840

(VD->getInit()->isValueDependent() || !VD->evaluateValue()))

12845 if

(

const auto

*DD = dyn_cast<DecompositionDecl>(VD)) {

12846 for

(

const auto

*BD : DD->flat_bindings())

12847 if

(

const auto

*BindingVD = BD->getHoldingVar())

12857

llvm::function_ref<

void

(

FunctionDecl

*)> Pred)

const

{

12858

assert(FD->

isMultiVersion

() &&

"Only valid for multiversioned functions"

);

12859

llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;

12864 for

(

auto

*CurDecl :

12868

SeenDecls.insert(CurFD).second) {

12876 bool

IsBuiltin)

const

{

12879 return

ABI->getDefaultMethodCallConv(IsVariadic);

12884 switch

(LangOpts.getDefaultCallingConv()) {

12913 return Target

->getDefaultCallingConv();

12918 return

ABI->isNearlyEmpty(RD);

12922 if

(!VTContext.get()) {

12923 auto

ABI =

Target

->getCXXABI();

12924 if

(ABI.isMicrosoft())

12927 auto

ComponentLayout =

getLangOpts

().RelativeCXXABIVTables

12933 return

VTContext.get();

12939 switch

(

T

->getCXXABI().getKind()) {

12940 case

TargetCXXABI::AppleARM64:

12941 case

TargetCXXABI::Fuchsia:

12942 case

TargetCXXABI::GenericAArch64:

12943 case

TargetCXXABI::GenericItanium:

12944 case

TargetCXXABI::GenericARM:

12945 case

TargetCXXABI::GenericMIPS:

12946 case

TargetCXXABI::iOS:

12947 case

TargetCXXABI::WebAssembly:

12948 case

TargetCXXABI::WatchOS:

12949 case

TargetCXXABI::XL:

12951 case

TargetCXXABI::Microsoft:

12954

llvm_unreachable(

"Unsupported ABI"

);

12958

assert(

T

.getCXXABI().getKind() != TargetCXXABI::Microsoft &&

12959 "Device mangle context does not support Microsoft mangling."

);

12960 switch

(

T

.getCXXABI().getKind()) {

12961 case

TargetCXXABI::AppleARM64:

12962 case

TargetCXXABI::Fuchsia:

12963 case

TargetCXXABI::GenericAArch64:

12964 case

TargetCXXABI::GenericItanium:

12965 case

TargetCXXABI::GenericARM:

12966 case

TargetCXXABI::GenericMIPS:

12967 case

TargetCXXABI::iOS:

12968 case

TargetCXXABI::WebAssembly:

12969 case

TargetCXXABI::WatchOS:

12970 case

TargetCXXABI::XL:

12974 if

(

const auto

*RD = dyn_cast<CXXRecordDecl>(ND))

12975 return

RD->getDeviceLambdaManglingNumber();

12976 return

std::nullopt;

12979 case

TargetCXXABI::Microsoft:

12983

llvm_unreachable(

"Unsupported ABI"

);

12989 return

ASTRecordLayouts.getMemorySize() +

12990

llvm::capacity_in_bytes(ObjCLayouts) +

12991

llvm::capacity_in_bytes(KeyFunctions) +

12992

llvm::capacity_in_bytes(ObjCImpls) +

12993

llvm::capacity_in_bytes(BlockVarCopyInits) +

12994

llvm::capacity_in_bytes(DeclAttrs) +

12995

llvm::capacity_in_bytes(TemplateOrInstantiation) +

12996

llvm::capacity_in_bytes(InstantiatedFromUsingDecl) +

12997

llvm::capacity_in_bytes(InstantiatedFromUsingShadowDecl) +

12998

llvm::capacity_in_bytes(InstantiatedFromUnnamedFieldDecl) +

12999

llvm::capacity_in_bytes(OverriddenMethods) +

13000

llvm::capacity_in_bytes(Types) +

13001

llvm::capacity_in_bytes(VariableArrayTypes);

13009 unsigned Signed

)

const

{

13012 if

(!QualTy && DestWidth == 128)

13041

llvm_unreachable(

"Unhandled TargetInfo::RealType value"

);

13048

MangleNumbers[ND] = Number;

13055 bool

ForAuxTarget)

const

{

13056 auto

I = MangleNumbers.find(ND);

13057 unsigned

Res = I != MangleNumbers.end() ? I->second : 1;

13060 if

(LangOpts.CUDA && !LangOpts.CUDAIsDevice) {

13061

Res = ForAuxTarget ? Res >> 16 : Res & 0xFFFF;

13063

assert(!ForAuxTarget &&

"Only CUDA/HIP host compilation supports mangling " 13064 "number for aux target"

);

13066 return

Res > 1 ? Res : 1;

13073

StaticLocalNumbers[VD] = Number;

13080 auto

I = StaticLocalNumbers.find(VD);

13081 return

I != StaticLocalNumbers.end() ? I->second : 1;

13086

assert(LangOpts.CPlusPlus);

13087

std::unique_ptr<MangleNumberingContext> &MCtx = MangleNumberingContexts[DC];

13095

assert(LangOpts.CPlusPlus);

13096

std::unique_ptr<MangleNumberingContext> &MCtx =

13097

ExtraMangleNumberingContexts[

D

];

13103

std::unique_ptr<MangleNumberingContext>

13105 return

ABI->createMangleNumberingContext();

13110 return

ABI->getCopyConstructorForExceptionObject(

13116 return

ABI->addCopyConstructorForExceptionObject(

13123 return

ABI->addTypedefNameForUnnamedTagDecl(TD, DD);

13128 return

ABI->getTypedefNameForUnnamedTagDecl(TD);

13133 return

ABI->addDeclaratorForUnnamedTagDecl(TD, DD);

13137 return

ABI->getDeclaratorForUnnamedTagDecl(TD);

13141

ParamIndices[

D

] = index;

13145

ParameterIndexTable::const_iterator I = ParamIndices.find(

D

);

13146

assert(I != ParamIndices.end() &&

13147 "ParmIndices lacks entry set by ParmVarDecl"

);

13152 unsigned

Length)

const

{

13178

assert(

MSGuidTagDecl

&&

"building MS GUID without MS extensions?"

);

13180

llvm::FoldingSetNodeID ID;

13184 if

(

MSGuidDecl

*Existing = MSGuidDecls.FindNodeOrInsertPos(ID, InsertPos))

13188 MSGuidDecl

*New = MSGuidDecl::Create(*

this

, GUIDType, Parts);

13189

MSGuidDecls.InsertNode(New, InsertPos);

13195 const APValue

&APVal)

const

{

13196

llvm::FoldingSetNodeID ID;

13201

UnnamedGlobalConstantDecls.FindNodeOrInsertPos(ID, InsertPos))

13205

UnnamedGlobalConstantDecl::Create(*

this

, Ty, APVal);

13206

UnnamedGlobalConstantDecls.InsertNode(New, InsertPos);

13212

assert(

T

->

isRecordType

() &&

"template param object of unexpected type"

);

13218

llvm::FoldingSetNodeID ID;

13223

TemplateParamObjectDecls.FindNodeOrInsertPos(ID, InsertPos))

13227

TemplateParamObjectDecls.InsertNode(New, InsertPos);

13233 if

(!

T

.isOSDarwin())

13236 if

(!(

T

.isiOS() &&

T

.isOSVersionLT(7)) &&

13237

!(

T

.isMacOSX() &&

T

.isOSVersionLT(10, 9)))

13246 return

(Size != Align ||

toBits

(sizeChars) > MaxInlineWidthInBits);

13253 if

(MethodDecl->

hasAttr

<UnavailableAttr>()

13254

|| MethodDecl->

hasAttr

<DeprecatedAttr>())

13268

IM != EM && IF != EF; ++IM, ++IF) {

13299

llvm::FoldingSetNodeID IDX, IDY;

13300 X

->Profile(IDX, *

this

,

true

);

13301

Y->

Profile

(IDY, *

this

,

true

);

13315 for

(

const Decl

*DX :

X

->redecls()) {

13320 if

(DX->isFirstDecl())

13323

llvm_unreachable(

"Corrupt redecls chain"

);

13326template

<

class

T, std::enable_if_t<std::is_base_of_v<Decl, T>,

bool

> = true>

13328 return

cast_or_null<T>(

13330 const_cast<Decl

*

>

(cast_or_null<Decl>(Y))));

13333template

<

class

T, std::enable_if_t<std::is_base_of_v<Decl, T>,

bool

> = true>

13336 const_cast<Decl

*

>

(cast<Decl>(Y))));

13341 bool

IgnoreDeduced =

false

) {

13356 bool

IgnoreDeduced) {

13364

assert(Xs.size() == Ys.size());

13366 for

(

size_t

I = 0; I < Rs.size(); ++I)

13373 return X

->getAttributeLoc() == Y->getAttributeLoc() ?

X

->getAttributeLoc()

13380 if

(

X

.getKind() != Y.

getKind

())

13383 switch

(

X

.getKind()) {

13413 auto

NExpX =

X

.getNumTemplateExpansions();

13427 if

(Xs.size() != Ys.size())

13429

R.resize(Xs.size());

13430 for

(

size_t

I = 0; I < R.size(); ++I) {

13443

assert(!Different);

13450 return X

->getKeyword() == Y->getKeyword() ?

X

->getKeyword()

13458 return X

->getQualifier() == Y->getQualifier()

13459

?

X

->getQualifier()

13472 QualType

EX =

X

->getElementType(), EY = Y->getElementType();

13477

QY += EY.getQualifiers() - RQ;

13487

assert(Ctx.

hasSameExpr

(

X

->getSizeExpr(), Y->getSizeExpr()));

13488 return X

->getSizeExpr();

13493 return X

->getSizeModifier();

13499 return X

->getIndexTypeCVRQualifiers();

13508

llvm::DenseMap<QualType, unsigned>

Found

;

13509 for

(

auto

Ts : {

X

, Y}) {

13516

Out.emplace_back(

T

);

13526 bool

AcceptDependent) {

13552

assert(AcceptDependent &&

13553 "computing composite pointer type of dependent types"

);

13568

llvm_unreachable(

"These ESTs should be handled above"

);

13573

assert(EST2 ==

EST_Dynamic

&&

"other cases should already be handled"

);

13577 Result

.Exceptions = ExceptionTypeStorage;

13584

llvm_unreachable(

"shouldn't see unresolved exception specifications here"

);

13587

llvm_unreachable(

"invalid ExceptionSpecificationType"

);

13596#define UNEXPECTED_TYPE(Class, Kind) \ 13597 case Type::Class: \ 13598 llvm_unreachable("Unexpected "

Kind ": " #Class);

13600#define NON_CANONICAL_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "non-canonical"

)

13601#define TYPE(Class, Base) 13602#include "clang/AST/TypeNodes.inc" 13604#define SUGAR_FREE_TYPE(Class) UNEXPECTED_TYPE(Class, "sugar-free"

)

13615#undef SUGAR_FREE_TYPE 13616#define NON_UNIQUE_TYPE(Class) UNEXPECTED_TYPE(Class, "non-unique"

)

13619#undef NON_UNIQUE_TYPE 13623#undef UNEXPECTED_TYPE 13626 const auto

*AX = cast<AutoType>(

X

), *AY = cast<AutoType>(Y);

13627

assert(AX->getDeducedType().isNull());

13628

assert(AY->getDeducedType().isNull());

13629

assert(AX->getKeyword() == AY->getKeyword());

13630

assert(AX->isInstantiationDependentType() ==

13631

AY->isInstantiationDependentType());

13633

AY->getTypeConstraintArguments());

13636

AX->containsUnexpandedParameterPack(),

13638

AY->getTypeConstraintConcept()),

13641 case

Type::IncompleteArray: {

13642 const auto

*AX = cast<IncompleteArrayType>(

X

),

13643

*AY = cast<IncompleteArrayType>(Y);

13648 case

Type::DependentSizedArray: {

13649 const auto

*AX = cast<DependentSizedArrayType>(

X

),

13650

*AY = cast<DependentSizedArrayType>(Y);

13655

AX->getBracketsRange() == AY->getBracketsRange()

13656

? AX->getBracketsRange()

13659 case

Type::ConstantArray: {

13660 const auto

*AX = cast<ConstantArrayType>(

X

),

13661

*AY = cast<ConstantArrayType>(Y);

13662

assert(AX->getSize() == AY->getSize());

13663 const Expr

*SizeExpr = Ctx.

hasSameExpr

(AX->getSizeExpr(), AY->getSizeExpr())

13664

? AX->getSizeExpr()

13670 case

Type::ArrayParameter: {

13671 const auto

*AX = cast<ArrayParameterType>(

X

),

13672

*AY = cast<ArrayParameterType>(Y);

13673

assert(AX->getSize() == AY->getSize());

13674 const Expr

*SizeExpr = Ctx.

hasSameExpr

(AX->getSizeExpr(), AY->getSizeExpr())

13675

? AX->getSizeExpr()

13682 case

Type::Atomic: {

13683 const auto

*AX = cast<AtomicType>(

X

), *AY = cast<AtomicType>(Y);

13687 case

Type::Complex: {

13688 const auto

*CX = cast<ComplexType>(

X

), *CY = cast<ComplexType>(Y);

13691 case

Type::Pointer: {

13692 const auto

*PX = cast<PointerType>(

X

), *PY = cast<PointerType>(Y);

13695 case

Type::BlockPointer: {

13696 const auto

*PX = cast<BlockPointerType>(

X

), *PY = cast<BlockPointerType>(Y);

13699 case

Type::ObjCObjectPointer: {

13700 const auto

*PX = cast<ObjCObjectPointerType>(

X

),

13701

*PY = cast<ObjCObjectPointerType>(Y);

13704 case

Type::MemberPointer: {

13705 const auto

*PX = cast<MemberPointerType>(

X

),

13706

*PY = cast<MemberPointerType>(Y);

13713 case

Type::LValueReference: {

13714 const auto

*PX = cast<LValueReferenceType>(

X

),

13715

*PY = cast<LValueReferenceType>(Y);

13718

PX->isSpelledAsLValue() ||

13719

PY->isSpelledAsLValue());

13721 case

Type::RValueReference: {

13722 const auto

*PX = cast<RValueReferenceType>(

X

),

13723

*PY = cast<RValueReferenceType>(Y);

13727 case

Type::DependentAddressSpace: {

13728 const auto

*PX = cast<DependentAddressSpaceType>(

X

),

13729

*PY = cast<DependentAddressSpaceType>(Y);

13730

assert(Ctx.

hasSameExpr

(PX->getAddrSpaceExpr(), PY->getAddrSpaceExpr()));

13732

PX->getAddrSpaceExpr(),

13735 case

Type::FunctionNoProto: {

13736 const auto

*FX = cast<FunctionNoProtoType>(

X

),

13737

*FY = cast<FunctionNoProtoType>(Y);

13738

assert(FX->getExtInfo() == FY->getExtInfo());

13743 case

Type::FunctionProto: {

13744 const auto

*FX = cast<FunctionProtoType>(

X

),

13745

*FY = cast<FunctionProtoType>(Y);

13747

EPIY = FY->getExtProtoInfo();

13748

assert(EPIX.

ExtInfo

== EPIY.ExtInfo);

13751

assert(EPIX.

TypeQuals

== EPIY.TypeQuals);

13752

assert(EPIX.

Variadic

== EPIY.Variadic);

13766

EPIX.

ExceptionSpec

, EPIY.ExceptionSpec, Exceptions,

true

);

13769 case

Type::ObjCObject: {

13770 const auto

*OX = cast<ObjCObjectType>(

X

), *OY = cast<ObjCObjectType>(Y);

13772

std::equal(OX->getProtocols().begin(), OX->getProtocols().end(),

13773

OY->getProtocols().begin(), OY->getProtocols().end(),

13775

return P0->getCanonicalDecl() == P1->getCanonicalDecl();

13777 "protocol lists must be the same"

);

13779

OY->getTypeArgsAsWritten());

13782

OX->getProtocols(),

13783

OX->isKindOfTypeAsWritten() && OY->isKindOfTypeAsWritten());

13785 case

Type::ConstantMatrix: {

13786 const auto

*MX = cast<ConstantMatrixType>(

X

),

13787

*MY = cast<ConstantMatrixType>(Y);

13788

assert(MX->getNumRows() == MY->getNumRows());

13789

assert(MX->getNumColumns() == MY->getNumColumns());

13791

MX->getNumRows(), MX->getNumColumns());

13793 case

Type::DependentSizedMatrix: {

13794 const auto

*MX = cast<DependentSizedMatrixType>(

X

),

13795

*MY = cast<DependentSizedMatrixType>(Y);

13796

assert(Ctx.

hasSameExpr

(MX->getRowExpr(), MY->getRowExpr()));

13797

assert(Ctx.

hasSameExpr

(MX->getColumnExpr(), MY->getColumnExpr()));

13802 case

Type::Vector: {

13803 const auto

*VX = cast<VectorType>(

X

), *VY = cast<VectorType>(Y);

13804

assert(VX->getNumElements() == VY->getNumElements());

13805

assert(VX->getVectorKind() == VY->getVectorKind());

13807

VX->getNumElements(), VX->getVectorKind());

13809 case

Type::ExtVector: {

13810 const auto

*VX = cast<ExtVectorType>(

X

), *VY = cast<ExtVectorType>(Y);

13811

assert(VX->getNumElements() == VY->getNumElements());

13813

VX->getNumElements());

13815 case

Type::DependentSizedExtVector: {

13816 const auto

*VX = cast<DependentSizedExtVectorType>(

X

),

13817

*VY = cast<DependentSizedExtVectorType>(Y);

13822 case

Type::DependentVector: {

13823 const auto

*VX = cast<DependentVectorType>(

X

),

13824

*VY = cast<DependentVectorType>(Y);

13825

assert(VX->getVectorKind() == VY->getVectorKind());

13830 case

Type::InjectedClassName: {

13831 const auto

*IX = cast<InjectedClassNameType>(

X

),

13832

*IY = cast<InjectedClassNameType>(Y);

13836

IY->getInjectedSpecializationType()));

13838 case

Type::TemplateSpecialization: {

13839 const auto

*TX = cast<TemplateSpecializationType>(

X

),

13840

*TY = cast<TemplateSpecializationType>(Y);

13842

TY->template_arguments());

13845

TY->getTemplateName(),

13847

As,

X

->getCanonicalTypeInternal());

13849 case

Type::Decltype: {

13850 const auto

*DX = cast<DecltypeType>(

X

);

13851

[[maybe_unused]]

const auto

*DY = cast<DecltypeType>(Y);

13852

assert(DX->isDependentType());

13853

assert(DY->isDependentType());

13854

assert(Ctx.

hasSameExpr

(DX->getUnderlyingExpr(), DY->getUnderlyingExpr()));

13858 case

Type::PackIndexing: {

13859 const auto

*DX = cast<PackIndexingType>(

X

);

13860

[[maybe_unused]]

const auto

*DY = cast<PackIndexingType>(Y);

13861

assert(DX->isDependentType());

13862

assert(DY->isDependentType());

13863

assert(Ctx.

hasSameExpr

(DX->getIndexExpr(), DY->getIndexExpr()));

13866 case

Type::DependentName: {

13867 const auto

*NX = cast<DependentNameType>(

X

),

13868

*NY = cast<DependentNameType>(Y);

13869

assert(NX->getIdentifier() == NY->getIdentifier());

13872

NX->getIdentifier(), NX->getCanonicalTypeInternal());

13874 case

Type::DependentTemplateSpecialization: {

13875 const auto

*TX = cast<DependentTemplateSpecializationType>(

X

),

13876

*TY = cast<DependentTemplateSpecializationType>(Y);

13877

assert(TX->getIdentifier() == TY->getIdentifier());

13879

TY->template_arguments());

13882

TX->getIdentifier(), As);

13884 case

Type::UnaryTransform: {

13885 const auto

*TX = cast<UnaryTransformType>(

X

),

13886

*TY = cast<UnaryTransformType>(Y);

13887

assert(TX->getUTTKind() == TY->getUTTKind());

13891

TY->getUnderlyingType()),

13894 case

Type::PackExpansion: {

13895 const auto

*PX = cast<PackExpansionType>(

X

),

13896

*PY = cast<PackExpansionType>(Y);

13897

assert(PX->getNumExpansions() == PY->getNumExpansions());

13900

PX->getNumExpansions(),

false

);

13903 const auto

*PX = cast<PipeType>(

X

), *PY = cast<PipeType>(Y);

13904

assert(PX->isReadOnly() == PY->isReadOnly());

13909 case

Type::TemplateTypeParm: {

13910 const auto

*TX = cast<TemplateTypeParmType>(

X

),

13911

*TY = cast<TemplateTypeParmType>(Y);

13912

assert(TX->getDepth() == TY->getDepth());

13913

assert(TX->getIndex() == TY->getIndex());

13914

assert(TX->isParameterPack() == TY->isParameterPack());

13916

TX->getDepth(), TX->getIndex(), TX->isParameterPack(),

13920

llvm_unreachable(

"Unknown Type Class"

);

13930#define UNEXPECTED_TYPE(Class, Kind) \ 13931 case Type::Class: \ 13932 llvm_unreachable("Unexpected "

Kind ": " #Class);

13933#define TYPE(Class, Base) 13934#define DEPENDENT_TYPE(Class, Base) UNEXPECTED_TYPE(Class, "dependent"

)

13935#include "clang/AST/TypeNodes.inc" 13937#define CANONICAL_TYPE(Class) UNEXPECTED_TYPE(Class, "canonical"

)

13963#undef CANONICAL_TYPE 13965#undef UNEXPECTED_TYPE 13967 case

Type::Adjusted: {

13968 const auto

*AX = cast<AdjustedType>(

X

), *AY = cast<AdjustedType>(Y);

13969 QualType

OX = AX->getOriginalType(), OY = AY->getOriginalType();

13976 case

Type::Decayed: {

13977 const auto

*DX = cast<DecayedType>(

X

), *DY = cast<DecayedType>(Y);

13978 QualType

OX = DX->getOriginalType(), OY = DY->getOriginalType();

13985 case

Type::Attributed: {

13986 const auto

*AX = cast<AttributedType>(

X

), *AY = cast<AttributedType>(Y);

13988 if

(Kind != AY->getAttrKind())

13990 QualType

MX = AX->getModifiedType(), MY = AY->getModifiedType();

13998 case

Type::BTFTagAttributed: {

13999 const auto

*BX = cast<BTFTagAttributedType>(

X

);

14000 const

BTFTypeTagAttr *AX = BX->getAttr();

14002 if

(AX->getBTFTypeTag() !=

14003

cast<BTFTagAttributedType>(Y)->getAttr()->getBTFTypeTag())

14008 const auto

*AX = cast<AutoType>(

X

), *AY = cast<AutoType>(Y);

14011 if

(KW != AY->getKeyword())

14015

AY->getTypeConstraintConcept());

14019

AY->getTypeConstraintArguments())) {

14027 false

,

false

, CD, As);

14029 case

Type::PackIndexing:

14030 case

Type::Decltype:

14032 case

Type::DeducedTemplateSpecialization:

14036 case

Type::Elaborated: {

14037 const auto

*EX = cast<ElaboratedType>(

X

), *EY = cast<ElaboratedType>(Y);

14043 case

Type::MacroQualified: {

14044 const auto

*MX = cast<MacroQualifiedType>(

X

),

14045

*MY = cast<MacroQualifiedType>(Y);

14047 if

(IX != MY->getMacroIdentifier())

14051 case

Type::SubstTemplateTypeParm: {

14052 const auto

*SX = cast<SubstTemplateTypeParmType>(

X

),

14053

*SY = cast<SubstTemplateTypeParmType>(Y);

14058 unsigned

Index = SX->getIndex();

14059 if

(Index != SY->getIndex())

14061 auto

PackIndex = SX->getPackIndex();

14062 if

(PackIndex != SY->getPackIndex())

14065

CD, Index, PackIndex);

14067 case

Type::ObjCTypeParam:

14073 case

Type::TemplateSpecialization: {

14074 const auto

*TX = cast<TemplateSpecializationType>(

X

),

14075

*TY = cast<TemplateSpecializationType>(Y);

14078

TY->getTemplateName(),

true

);

14083

TY->template_arguments()))

14088 case

Type::Typedef: {

14089 const auto

*TX = cast<TypedefType>(

X

), *TY = cast<TypedefType>(Y);

14095 case

Type::TypeOf: {

14101 if

(cast<TypeOfType>(

X

)->

getKind

() == cast<TypeOfType>(Y)->

getKind

() &&

14106 case

Type::TypeOfExpr:

14109 case

Type::UnaryTransform: {

14110 const auto

*UX = cast<UnaryTransformType>(

X

),

14111

*UY = cast<UnaryTransformType>(Y);

14113 if

(KX != UY->getUTTKind())

14115 QualType

BX = UX->getBaseType(), BY = UY->getBaseType();

14122 case

Type::Using: {

14123 const auto

*UX = cast<UsingType>(

X

), *UY = cast<UsingType>(Y);

14130 case

Type::CountAttributed: {

14131 const auto

*DX = cast<CountAttributedType>(

X

),

14132

*DY = cast<CountAttributedType>(Y);

14133 if

(DX->isCountInBytes() != DY->isCountInBytes())

14135 if

(DX->isOrNull() != DY->isOrNull())

14137 Expr

*CEX = DX->getCountExpr();

14138 Expr

*CEY = DY->getCountExpr();

14142

DX->isCountInBytes(), DX->isOrNull(),

14153

DX->isCountInBytes(), DX->isOrNull(),

14157

llvm_unreachable(

"Unhandled Type Class"

);

14179 if

(

X

.isCanonical())

14192 if

(SX.

Ty

!= SY.Ty) {

14200 while

(!Xs.empty() && !Ys.empty() && Xs.back().Ty == Ys.back().Ty) {

14203

SX = Xs.pop_back_val();

14204

SY = Ys.pop_back_val();

14214 while

(!Xs.empty() && !Ys.empty()) {

14217

SX = Xs.pop_back_val();

14218

SY = Ys.pop_back_val();

14223

SX.

Ty

= Underlying.Ty;

14226

QX -= Underlying.Quals;

14244

llvm_unreachable(

"Not a saturated fixed point type!"

);

14245 case

BuiltinType::SatShortAccum:

14247 case

BuiltinType::SatAccum:

14249 case

BuiltinType::SatLongAccum:

14251 case

BuiltinType::SatUShortAccum:

14253 case

BuiltinType::SatUAccum:

14255 case

BuiltinType::SatULongAccum:

14257 case

BuiltinType::SatShortFract:

14259 case

BuiltinType::SatFract:

14261 case

BuiltinType::SatLongFract:

14263 case

BuiltinType::SatUShortFract:

14265 case

BuiltinType::SatUFract:

14267 case

BuiltinType::SatULongFract:

14279

llvm_unreachable(

"Not a fixed point type!"

);

14280 case

BuiltinType::ShortAccum:

14282 case

BuiltinType::Accum:

14284 case

BuiltinType::LongAccum:

14286 case

BuiltinType::UShortAccum:

14288 case

BuiltinType::UAccum:

14290 case

BuiltinType::ULongAccum:

14292 case

BuiltinType::ShortFract:

14294 case

BuiltinType::Fract:

14296 case

BuiltinType::LongFract:

14298 case

BuiltinType::UShortFract:

14300 case

BuiltinType::UFract:

14302 case

BuiltinType::ULongFract:

14308 if

(LangOpts.OpenCL)

14332

llvm_unreachable(

"Not a fixed point type!"

);

14333 case

BuiltinType::ShortAccum:

14334 case

BuiltinType::SatShortAccum:

14335 return Target

.getShortAccumScale();

14336 case

BuiltinType::Accum:

14337 case

BuiltinType::SatAccum:

14338 return Target

.getAccumScale();

14339 case

BuiltinType::LongAccum:

14340 case

BuiltinType::SatLongAccum:

14341 return Target

.getLongAccumScale();

14342 case

BuiltinType::UShortAccum:

14343 case

BuiltinType::SatUShortAccum:

14344 return Target

.getUnsignedShortAccumScale();

14345 case

BuiltinType::UAccum:

14346 case

BuiltinType::SatUAccum:

14347 return Target

.getUnsignedAccumScale();

14348 case

BuiltinType::ULongAccum:

14349 case

BuiltinType::SatULongAccum:

14350 return Target

.getUnsignedLongAccumScale();

14351 case

BuiltinType::ShortFract:

14352 case

BuiltinType::SatShortFract:

14353 return Target

.getShortFractScale();

14354 case

BuiltinType::Fract:

14355 case

BuiltinType::SatFract:

14356 return Target

.getFractScale();

14357 case

BuiltinType::LongFract:

14358 case

BuiltinType::SatLongFract:

14359 return Target

.getLongFractScale();

14360 case

BuiltinType::UShortFract:

14361 case

BuiltinType::SatUShortFract:

14362 return Target

.getUnsignedShortFractScale();

14363 case

BuiltinType::UFract:

14364 case

BuiltinType::SatUFract:

14365 return Target

.getUnsignedFractScale();

14366 case

BuiltinType::ULongFract:

14367 case

BuiltinType::SatULongFract:

14368 return Target

.getUnsignedLongFractScale();

14378

llvm_unreachable(

"Not a fixed point type!"

);

14379 case

BuiltinType::ShortAccum:

14380 case

BuiltinType::SatShortAccum:

14381 return Target

.getShortAccumIBits();

14382 case

BuiltinType::Accum:

14383 case

BuiltinType::SatAccum:

14384 return Target

.getAccumIBits();

14385 case

BuiltinType::LongAccum:

14386 case

BuiltinType::SatLongAccum:

14387 return Target

.getLongAccumIBits();

14388 case

BuiltinType::UShortAccum:

14389 case

BuiltinType::SatUShortAccum:

14390 return Target

.getUnsignedShortAccumIBits();

14391 case

BuiltinType::UAccum:

14392 case

BuiltinType::SatUAccum:

14393 return Target

.getUnsignedAccumIBits();

14394 case

BuiltinType::ULongAccum:

14395 case

BuiltinType::SatULongAccum:

14396 return Target

.getUnsignedLongAccumIBits();

14397 case

BuiltinType::ShortFract:

14398 case

BuiltinType::SatShortFract:

14399 case

BuiltinType::Fract:

14400 case

BuiltinType::SatFract:

14401 case

BuiltinType::LongFract:

14402 case

BuiltinType::SatLongFract:

14403 case

BuiltinType::UShortFract:

14404 case

BuiltinType::SatUShortFract:

14405 case

BuiltinType::UFract:

14406 case

BuiltinType::SatUFract:

14407 case

BuiltinType::ULongFract:

14408 case

BuiltinType::SatULongFract:

14413

llvm::FixedPointSemantics

14416 "Can only get the fixed point semantics for a " 14417 "fixed point or integer type."

);

14419 return

llvm::FixedPointSemantics::GetIntegerSemantics(

14423 return

llvm::FixedPointSemantics(

14426

!isSigned &&

getTargetInfo

().doUnsignedFixedPointTypesHavePadding());

14441 "Expected unsigned fixed point type"

);

14444 case

BuiltinType::UShortAccum:

14446 case

BuiltinType::UAccum:

14448 case

BuiltinType::ULongAccum:

14450 case

BuiltinType::SatUShortAccum:

14452 case

BuiltinType::SatUAccum:

14454 case

BuiltinType::SatULongAccum:

14456 case

BuiltinType::UShortFract:

14458 case

BuiltinType::UFract:

14460 case

BuiltinType::ULongFract:

14462 case

BuiltinType::SatUShortFract:

14464 case

BuiltinType::SatUFract:

14466 case

BuiltinType::SatULongFract:

14469

llvm_unreachable(

"Unexpected unsigned fixed point type"

);

14477

std::vector<std::string> BackendFeats;

14478

llvm::AArch64::ExtensionSet FeatureBits;

14479 for

(StringRef F : FMVFeatStrings)

14480 if

(

auto

FMVExt = llvm::AArch64::parseFMVExtension(F))

14482

FeatureBits.enable(*FMVExt->ID);

14483

FeatureBits.toLLVMFeatureList(BackendFeats);

14484 return

BackendFeats;

14489

assert(TD !=

nullptr

);

14492

llvm::erase_if(

ParsedAttr

.Features, [&](

const

std::string &Feat) {

14493

return !Target->isValidFeatureName(StringRef{Feat}.substr(1));

14504 Target

->getTargetOpts().CPU,

14505 Target

->getTargetOpts().Features);

14512

StringRef TargetCPU =

Target

->getTargetOpts().CPU;

14514 if

(

const auto

*TD = FD->

getAttr

<TargetAttr>()) {

14520 if

(!

Target

->getTriple().isAArch64())

14523 Target

->getTargetOpts().FeaturesAsWritten.begin(),

14524 Target

->getTargetOpts().FeaturesAsWritten.end());

14535

}

else if

(

const auto

*SD = FD->

getAttr

<CPUSpecificAttr>()) {

14537 Target

->getCPUSpecificCPUDispatchFeatures(

14539

std::vector<std::string> Features(FeaturesTmp.begin(), FeaturesTmp.end());

14540

Features.insert(Features.begin(),

14541 Target

->getTargetOpts().FeaturesAsWritten.begin(),

14542 Target

->getTargetOpts().FeaturesAsWritten.end());

14544

}

else if

(

const auto

*TC = FD->

getAttr

<TargetClonesAttr>()) {

14545 if

(

Target

->getTriple().isAArch64()) {

14549

Features.insert(Features.begin(),

14550 Target

->getTargetOpts().FeaturesAsWritten.begin(),

14551 Target

->getTargetOpts().FeaturesAsWritten.end());

14553

}

else if

(

Target

->getTriple().isRISCV()) {

14555

std::vector<std::string> Features;

14556 if

(VersionStr !=

"default"

) {

14558

Features.insert(Features.begin(),

ParsedAttr

.Features.begin(),

14561

Features.insert(Features.begin(),

14562 Target

->getTargetOpts().FeaturesAsWritten.begin(),

14563 Target

->getTargetOpts().FeaturesAsWritten.end());

14566

std::vector<std::string> Features;

14568 if

(VersionStr.starts_with(

"arch="

))

14569

TargetCPU = VersionStr.drop_front(

sizeof

(

"arch="

) - 1);

14570 else if

(VersionStr !=

"default"

)

14571

Features.push_back((StringRef{

"+"

} + VersionStr).str());

14574

}

else if

(

const auto

*TV = FD->

getAttr

<TargetVersionAttr>()) {

14575

std::vector<std::string> Features;

14576 if

(

Target

->getTriple().isRISCV()) {

14578

Features.insert(Features.begin(),

ParsedAttr

.Features.begin(),

14581

assert(

Target

->getTriple().isAArch64());

14583

TV->getFeatures(Feats);

14586

Features.insert(Features.begin(),

14587 Target

->getTargetOpts().FeaturesAsWritten.begin(),

14588 Target

->getTargetOpts().FeaturesAsWritten.end());

14591

FeatureMap =

Target

->getTargetOpts().FeatureMap;

14597 return

{KernelNameType, FD};

14606 const auto

*SKEPAttr = FD->

getAttr

<SYCLKernelEntryPointAttr>();

14607

assert(SKEPAttr &&

"Missing sycl_kernel_entry_point attribute"

);

14616 "SYCL kernel name conflict"

);

14631 return

&IT->second;

14636

OMPTraitInfoVector.emplace_back(

new OMPTraitInfo

());

14637 return

*OMPTraitInfoVector.back();

14643 if

(Section.

Decl

)

14644 return

DB << Section.

Decl

;

14645 return

DB <<

"a prior #pragma section"

;

14649 bool

IsInternalVar =

14650

isa<VarDecl>(

D

) &&

14652 bool

IsExplicitDeviceVar = (

D

->

hasAttr

<CUDADeviceAttr>() &&

14653

!

D

->

getAttr

<CUDADeviceAttr>()->isImplicit()) ||

14654

(

D

->

hasAttr

<CUDAConstantAttr>() &&

14655

!

D

->

getAttr

<CUDAConstantAttr>()->isImplicit());

14659 return

(IsInternalVar &&

14660

(

D

->

hasAttr

<HIPManagedAttr>() || IsExplicitDeviceVar)) ||

14661

(

D

->

hasAttr

<CUDAGlobalAttr>() &&

14673 if

(!CUIDHash.empty())

14675 if

(LangOpts.

CUID

.empty())

14676 return

StringRef();

14677

CUIDHash = llvm::utohexstr(llvm::MD5Hash(LangOpts.

CUID

),

true

);

14687

assert(PrimaryBase);

14690 auto Base

= Layout.getPrimaryBase();

14691 if

(!

Base

||

Base

== PrimaryBase || !

Base

->isPolymorphic())

14693

PrimaryBase =

Base

;

14695 return

PrimaryBase;

14699

StringRef MangledName) {

14700 auto

*Method = cast<CXXMethodDecl>(VirtualMethodDecl.

getDecl

());

14701

assert(Method->isVirtual());

14702 bool

DefaultIncludesPointerAuth =

14703

LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics;

14705 if

(!DefaultIncludesPointerAuth)

14708 auto

Existing = ThunksToBeAbbreviated.find(VirtualMethodDecl);

14709 if

(Existing != ThunksToBeAbbreviated.end())

14710 return

Existing->second.contains(MangledName.str());

14713

llvm::StringMap<llvm::SmallVector<std::string, 2>> Thunks;

14715 if

(

const auto

*ThunkInfos = VtableContext->getThunkInfo(VirtualMethodDecl)) {

14716 auto

*

Destructor

= dyn_cast<CXXDestructorDecl>(Method);

14717 for

(

const auto

&Thunk : *ThunkInfos) {

14719

llvm::raw_svector_ostream ElidedNameStream(ElidedName);

14725

Mangler->mangleThunk(Method, Thunk,

true

,

14728

llvm::raw_svector_ostream mangledNameStream(MangledName);

14732

mangledNameStream);

14734

Mangler->mangleThunk(Method, Thunk,

false

,

14735

mangledNameStream);

14737

Thunks[ElidedName].push_back(std::string(MangledName));

14740

llvm::StringSet<> SimplifiedThunkNames;

14741 for

(

auto

&ThunkList : Thunks) {

14742

llvm::sort(ThunkList.second);

14743

SimplifiedThunkNames.insert(ThunkList.second[0]);

14745 bool Result

= SimplifiedThunkNames.contains(MangledName);

14746

ThunksToBeAbbreviated[VirtualMethodDecl] = std::move(SimplifiedThunkNames);

This file provides AST data structures related to concepts.

static void SortAndUniqueProtocols(SmallVectorImpl< ObjCProtocolDecl * > &Protocols)

static bool isCanonicalExceptionSpecification(const FunctionProtoType::ExceptionSpecInfo &ESI, bool NoexceptInType)

static SourceLocation getCommonAttrLoc(const T *X, const T *Y)

static auto getCommonTypes(ASTContext &Ctx, ArrayRef< QualType > Xs, ArrayRef< QualType > Ys, bool Unqualified=false)

static auto getCanonicalTemplateArguments(const ASTContext &C, ArrayRef< TemplateArgument > Args, bool &AnyNonCanonArgs)

static char getObjCEncodingForPrimitiveType(const ASTContext *C, const BuiltinType *BT)

static bool NeedsInjectedClassNameType(const RecordDecl *D)

static bool unionHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)

static NamespaceDecl * getNamespace(const NestedNameSpecifier *X)

static TypedefDecl * CreateHexagonBuiltinVaListDecl(const ASTContext *Context)

#define CANONICAL_TYPE(Class)

static NestedNameSpecifier * getCommonNNS(ASTContext &Ctx, const T *X, const T *Y)

static Decl * getCommonDecl(Decl *X, Decl *Y)

static GVALinkage adjustGVALinkageForAttributes(const ASTContext &Context, const Decl *D, GVALinkage L)

static bool isTypeTypedefedAsBOOL(QualType T)

static void EncodeBitField(const ASTContext *Ctx, std::string &S, QualType T, const FieldDecl *FD)

static GVALinkage basicGVALinkageForVariable(const ASTContext &Context, const VarDecl *VD)

static const TemplateArgument * getDefaultTemplateArgumentOrNone(const NamedDecl *P)

static uint64_t getSVETypeSize(ASTContext &Context, const BuiltinType *Ty)

getSVETypeSize - Return SVE vector or predicate register size.

#define SUGAR_FREE_TYPE(Class)

static bool getCommonTemplateArguments(ASTContext &Ctx, SmallVectorImpl< TemplateArgument > &R, ArrayRef< TemplateArgument > Xs, ArrayRef< TemplateArgument > Ys)

static bool hasTemplateSpecializationInEncodedString(const Type *T, bool VisitBasesAndFields)

static void getIntersectionOfProtocols(ASTContext &Context, const ObjCInterfaceDecl *CommonBase, const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, SmallVectorImpl< ObjCProtocolDecl * > &IntersectionSet)

getIntersectionOfProtocols - This routine finds the intersection of set of protocols inherited from t...

static bool areCompatMatrixTypes(const ConstantMatrixType *LHS, const ConstantMatrixType *RHS)

areCompatMatrixTypes - Return true if the two specified matrix types are compatible.

static TypedefDecl * CreateAAPCSABIBuiltinVaListDecl(const ASTContext *Context)

static bool sameObjCTypeArgs(ASTContext &ctx, const ObjCInterfaceDecl *iface, ArrayRef< QualType > lhsArgs, ArrayRef< QualType > rhsArgs, bool stripKindOf)

static bool canAssignObjCObjectTypes(ASTContext &ctx, QualType lhs, QualType rhs)

Determine whether the first type is a subtype of the second.

static const Type * getIntegerTypeForEnum(const EnumType *ET)

static const Decl & adjustDeclToTemplate(const Decl &D)

If we have a 'templated' declaration for a template, adjust 'D' to refer to the actual template.

static int CmpProtocolNames(ObjCProtocolDecl *const *LHS, ObjCProtocolDecl *const *RHS)

CmpProtocolNames - Comparison predicate for sorting protocols alphabetically.

static QualType getCommonElementType(ASTContext &Ctx, const T *X, const T *Y)

static TypedefDecl * CreatePowerABIBuiltinVaListDecl(const ASTContext *Context)

static auto getCommonSizeModifier(const ArrayType *X, const ArrayType *Y)

static std::optional< int64_t > structHasUniqueObjectRepresentations(const ASTContext &Context, const RecordDecl *RD, bool CheckIfTriviallyCopyable)

static bool hasSameOverloadableAttrs(const FunctionDecl *A, const FunctionDecl *B)

Determine whether the attributes we can overload on are identical for A and B.

static T * getCommonDeclChecked(T *X, T *Y)

static TypedefDecl * CreateVoidPtrBuiltinVaListDecl(const ASTContext *Context)

static int64_t getSubobjectOffset(const FieldDecl *Field, const ASTContext &Context, const clang::ASTRecordLayout &)

static TypedefDecl * CreateAArch64ABIBuiltinVaListDecl(const ASTContext *Context)

static TypedefDecl * CreatePNaClABIBuiltinVaListDecl(const ASTContext *Context)

static TemplateName getCommonTemplateNameChecked(ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced)

static QualType mergeEnumWithInteger(ASTContext &Context, const EnumType *ET, QualType other, bool isBlockReturnType)

Given that we have an enum type and a non-enum type, try to merge them.

static GVALinkage adjustGVALinkageForExternalDefinitionKind(const ASTContext &Ctx, const Decl *D, GVALinkage L)

Adjust the GVALinkage for a declaration based on what an external AST source knows about whether ther...

static TypedefDecl * CreateSystemZBuiltinVaListDecl(const ASTContext *Context)

static std::optional< int64_t > getSubobjectSizeInBits(const FieldDecl *Field, const ASTContext &Context, bool CheckIfTriviallyCopyable)

static GVALinkage basicGVALinkageForFunction(const ASTContext &Context, const FunctionDecl *FD)

#define NON_UNIQUE_TYPE(Class)

static TypedefDecl * CreateX86_64ABIBuiltinVaListDecl(const ASTContext *Context)

static bool isAddrSpaceMapManglingEnabled(const TargetInfo &TI, const LangOptions &LangOpts)

static auto getCommonIndexTypeCVRQualifiers(const ArrayType *X, const ArrayType *Y)

static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequiresICE, bool AllowTypeModifiers)

DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the pointer over the consume...

static TypedefDecl * CreateCharPtrBuiltinVaListDecl(const ASTContext *Context)

static void mergeTypeLists(ASTContext &Ctx, SmallVectorImpl< QualType > &Out, ArrayRef< QualType > X, ArrayRef< QualType > Y)

static bool areSortedAndUniqued(ArrayRef< ObjCProtocolDecl * > Protocols)

static TypeInfoChars getConstantArrayInfoInChars(const ASTContext &Context, const ConstantArrayType *CAT)

getConstantArrayInfoInChars - Performing the computation in CharUnits instead of in bits prevents ove...

static FloatingRank getFloatingRank(QualType T)

getFloatingRank - Return a relative rank for floating point types.

static TypedefDecl * CreateXtensaABIBuiltinVaListDecl(const ASTContext *Context)

static TemplateArgument getCommonTemplateArgument(ASTContext &Ctx, const TemplateArgument &X, const TemplateArgument &Y)

static auto * getCommonSizeExpr(ASTContext &Ctx, T *X, T *Y)

static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx, raw_ostream &OS, QualType QT)

Encode a function type for use in the discriminator of a function pointer type.

static std::optional< int64_t > structSubobjectsHaveUniqueObjectRepresentations(const RangeT &Subobjects, int64_t CurOffsetInBits, const ASTContext &Context, const clang::ASTRecordLayout &Layout, bool CheckIfTriviallyCopyable)

static char ObjCEncodingForEnumType(const ASTContext *C, const EnumType *ET)

static QualType getCommonArrayElementType(ASTContext &Ctx, const T *X, Qualifiers &QX, const T *Y, Qualifiers &QY)

static QualType getCommonPointeeType(ASTContext &Ctx, const T *X, const T *Y)

static uint64_t getRVVTypeSize(ASTContext &Context, const BuiltinType *Ty)

getRVVTypeSize - Return RVV vector register size.

static auto unwrapSugar(SplitQualType &T, Qualifiers &QTotal)

static SYCLKernelInfo BuildSYCLKernelInfo(CanQualType KernelNameType, const FunctionDecl *FD)

static int compareObjCProtocolsByName(ObjCProtocolDecl *const *lhs, ObjCProtocolDecl *const *rhs)

Comparison routine for Objective-C protocols to be used with llvm::array_pod_sort.

static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X, Qualifiers &QX, const Type *Y, Qualifiers &QY)

static QualType getCommonSugarTypeNode(ASTContext &Ctx, const Type *X, const Type *Y, SplitQualType Underlying)

static bool isSameQualifier(const NestedNameSpecifier *X, const NestedNameSpecifier *Y)

static std::string charUnitsToString(const CharUnits &CU)

static bool hasAnyPackExpansions(ArrayRef< TemplateArgument > Args)

static void addRedeclaredMethods(const ObjCMethodDecl *ObjCMethod, SmallVectorImpl< const NamedDecl * > &Redeclared)

static SmallVector< SourceLocation, 2 > getDeclLocsForCommentSearch(const Decl *D, SourceManager &SourceMgr)

static TemplateName getCommonTemplateName(ASTContext &Ctx, TemplateName X, TemplateName Y, bool IgnoreDeduced=false)

static bool isCanonicalResultType(QualType T)

Determine whether T is canonical as the result type of a function.

static TypedefDecl * CreateMSVaListDecl(const ASTContext *Context)

static bool areCompatVectorTypes(const VectorType *LHS, const VectorType *RHS)

areCompatVectorTypes - Return true if the two specified vector types are compatible.

static TypedefDecl * CreateCharPtrNamedVaListDecl(const ASTContext *Context, StringRef Name)

#define UNEXPECTED_TYPE(Class, Kind)

static TypedefDecl * CreateVaListDecl(const ASTContext *Context, TargetInfo::BuiltinVaListKind Kind)

static std::vector< std::string > getFMVBackendFeaturesFor(const llvm::SmallVectorImpl< StringRef > &FMVFeatStrings)

static ElaboratedTypeKeyword getCommonTypeKeyword(const T *X, const T *Y)

Defines the clang::ASTContext interface.

Provides definitions for the various language-specific address spaces.

static bool isUnsigned(SValBuilder &SVB, NonLoc Value)

static constexpr Builtin::Info BuiltinInfo[]

Defines enum values for all the target-independent builtin functions.

static bool CanThrow(Expr *E, ASTContext &Ctx)

static Decl::Kind getKind(const Decl *D)

Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....

This file defines OpenMP nodes for declarative directives.

Defines the C++ template declaration subclasses.

Defines the ExceptionSpecificationType enumeration and various utility functions.

Defines the clang::Expr interface and subclasses for C++ expressions.

Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.

static const Decl * getCanonicalDecl(const Decl *D)

Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.

Defines the clang::LangOptions interface.

llvm::MachO::Target Target

llvm::MachO::Record Record

static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)

Determine whether a translation unit built using the current language options has the given feature.

Defines the clang::Module class, which describes a module in the source code.

Defines types useful for describing an Objective-C runtime.

static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y)

static QualType getUnderlyingType(const SubRegion *R)

Defines the clang::SourceLocation class and associated facilities.

Defines the SourceManager interface.

Defines various enumerations that describe declaration and type specifiers.

static QualType getPointeeType(const MemRegion *R)

Defines the TargetCXXABI class, which abstracts details of the C++ ABI that we're targeting.

Defines the clang::TypeLoc interface and its subclasses.

static const TemplateArgument & getArgument(const TemplateArgument &A)

C Language Family Type Representation.

__device__ __2f16 float c

APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...

bool isMemberPointerToDerivedMember() const

const ValueDecl * getMemberPointerDecl() const

ArrayRef< const CXXRecordDecl * > getMemberPointerPath() const

Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...

bool getByrefLifetime(QualType Ty, Qualifiers::ObjCLifetime &Lifetime, bool &HasByrefExtendedLayout) const

Returns true, if given type has a known lifetime.

MSGuidDecl * getMSGuidDecl(MSGuidDeclParts Parts) const

Return a declaration for the global GUID object representing the given GUID value.

QualType getUsingType(const UsingShadowDecl *Found, QualType Underlying) const

BuiltinVectorTypeInfo getBuiltinVectorTypeInfo(const BuiltinType *VecTy) const

Returns the element type, element count and number of vectors (in case of tuple) for a builtin vector...

bool ObjCMethodsAreEqual(const ObjCMethodDecl *MethodDecl, const ObjCMethodDecl *MethodImp)

CanQualType ObjCBuiltinSelTy

TranslationUnitDecl * getTranslationUnitDecl() const

const ConstantArrayType * getAsConstantArrayType(QualType T) const

CanQualType getCanonicalFunctionResultType(QualType ResultType) const

Adjust the given function result type.

QualType getAtomicType(QualType T) const

Return the uniqued reference to the atomic type for the specified type.

bool areLaxCompatibleSveTypes(QualType FirstType, QualType SecondType)

Return true if the given vector types are lax-compatible SVE vector types, false otherwise.

llvm::PointerUnion< VarTemplateDecl *, MemberSpecializationInfo * > TemplateOrSpecializationInfo

A type synonym for the TemplateOrInstantiation mapping.

LangAS getOpenCLTypeAddrSpace(const Type *T) const

Get address space for OpenCL type.

CharUnits getTypeAlignInChars(QualType T) const

Return the ABI-specified alignment of a (complete) type T, in characters.

void InitBuiltinTypes(const TargetInfo &Target, const TargetInfo *AuxTarget=nullptr)

Initialize built-in types.

ParentMapContext & getParentMapContext()

Returns the dynamic AST node parent map context.

QualType getParenType(QualType NamedType) const

size_t getSideTableAllocatedMemory() const

Return the total memory used for various side tables.

MemberSpecializationInfo * getInstantiatedFromStaticDataMember(const VarDecl *Var)

If this variable is an instantiated static data member of a class template specialization,...

QualType getRValueReferenceType(QualType T) const

Return the uniqued reference to the type for an rvalue reference to the specified type.

CanQualType ARCUnbridgedCastTy

QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const

Return the unique reference to the matrix type of the specified element type and size.

QualType getBTFTagAttributedType(const BTFTypeTagAttr *BTFAttr, QualType Wrapped) const

llvm::DenseMap< const Decl *, comments::FullComment * > ParsedComments

Mapping from declarations to parsed comments attached to any redeclaration.

BuiltinTemplateDecl * getBuiltinCommonTypeDecl() const

unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const

unsigned getIntWidth(QualType T) const

CanQualType getCanonicalParamType(QualType T) const

Return the canonical parameter type corresponding to the specific potentially non-canonical one.

const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)

Change the ExtInfo on a function type.

TemplateOrSpecializationInfo getTemplateOrSpecializationInfo(const VarDecl *Var)

InlineVariableDefinitionKind

@ None

Not an inline variable.

@ Weak

Weak definition of inline variable.

@ Strong

Strong definition.

@ WeakUnknown

Weak for now, might become strong later in this TU.

void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl)

TypedefDecl * getObjCClassDecl() const

Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type.

TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)

TypedefDecl * getCFConstantStringDecl() const

CanQualType SatUnsignedFractTy

BuiltinTemplateDecl * getMakeIntegerSeqDecl() const

void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)

Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.

bool areCompatibleRVVTypes(QualType FirstType, QualType SecondType)

Return true if the given types are an RISC-V vector builtin type and a VectorType that is a fixed-len...

ExternCContextDecl * getExternCContextDecl() const

const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const

Return the APFloat 'semantics' for the specified scalar floating point type.

ParsedTargetAttr filterFunctionTargetAttrs(const TargetAttr *TD) const

Parses the target attributes passed in, and returns only the ones that are valid feature names.

QualType getAutoType(QualType DeducedType, AutoTypeKeyword Keyword, bool IsDependent, bool IsPack=false, ConceptDecl *TypeConstraintConcept=nullptr, ArrayRef< TemplateArgument > TypeConstraintArgs={}) const

C++11 deduced auto type.

QualType areCommonBaseCompatible(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)

TypedefDecl * getObjCSelDecl() const

Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.

CanQualType UnsignedShortAccumTy

TypedefDecl * getObjCInstanceTypeDecl()

Retrieve the typedef declaration corresponding to the Objective-C "instancetype" type.

uint64_t getFieldOffset(const ValueDecl *FD) const

Get the offset of a FieldDecl or IndirectFieldDecl, in bits.

QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, ArrayRef< TemplateArgumentLoc > Args) const

QualType adjustFunctionResultType(QualType FunctionType, QualType NewResultType)

Change the result type of a function type, preserving sugar such as attributed types.

void setTemplateOrSpecializationInfo(VarDecl *Inst, TemplateOrSpecializationInfo TSI)

bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, ObjCProtocolDecl *rProto) const

ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the inheritance hierarchy of 'rProto...

TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const

Create a new implicit TU-level typedef declaration.

QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const

getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.

void adjustObjCTypeParamBoundType(const ObjCTypeParamDecl *Orig, ObjCTypeParamDecl *New) const

QualType getBlockPointerType(QualType T) const

Return the uniqued reference to the type for a block of the specified type.

TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const

Retrieve the "canonical" template argument.

QualType getAutoRRefDeductType() const

C++11 deduction pattern for 'auto &&' type.

TypedefDecl * getBuiltinMSVaListDecl() const

Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type.

bool ObjCQualifiedIdTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS, bool ForCompare)

ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an ObjCQualifiedIDType.

QualType getTagDeclType(const TagDecl *Decl) const

Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.

QualType getMemberPointerType(QualType T, const Type *Cls) const

Return the uniqued reference to the type for a member pointer to the specified type in the specified ...

QualType getBuiltinVaListType() const

Retrieve the type of the __builtin_va_list type.

QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)

NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)

If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...

DeclarationNameTable DeclarationNames

comments::FullComment * cloneFullComment(comments::FullComment *FC, const Decl *D) const

QualType getUnresolvedUsingType(const UnresolvedUsingTypenameDecl *Decl) const

CharUnits getObjCEncodingTypeSize(QualType T) const

Return the size of type T for Objective-C encoding purpose, in characters.

int getIntegerTypeOrder(QualType LHS, QualType RHS) const

Return the highest ranked integer type, see C99 6.3.1.8p1.

QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const

TypedefDecl * getObjCIdDecl() const

Retrieve the typedef corresponding to the predefined id type in Objective-C.

void setCurrentNamedModule(Module *M)

Set the (C++20) module we are building.

QualType getProcessIDType() const

Return the unique type for "pid_t" defined in <sys/types.h>.

CharUnits getMemberPointerPathAdjustment(const APValue &MP) const

Find the 'this' offset for the member path in a pointer-to-member APValue.

bool mayExternalize(const Decl *D) const

Whether a C++ static variable or CUDA/HIP kernel may be externalized.

QualType getTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args, QualType Canon=QualType()) const

std::unique_ptr< MangleNumberingContext > createMangleNumberingContext() const

QualType getUnsignedPointerDiffType() const

Return the unique unsigned counterpart of "ptrdiff_t" integer type.

QualType getucontext_tType() const

Retrieve the C ucontext_t type.

QualType getRecordType(const RecordDecl *Decl) const

QualType getScalableVectorType(QualType EltTy, unsigned NumElts, unsigned NumFields=1) const

Return the unique reference to a scalable vector type of the specified element type and scalable numb...

bool hasSameExpr(const Expr *X, const Expr *Y) const

Determine whether the given expressions X and Y are equivalent.

void getObjCEncodingForType(QualType T, std::string &S, const FieldDecl *Field=nullptr, QualType *NotEncodedT=nullptr) const

Emit the Objective-CC type encoding for the given type T into S.

MangleContext * createMangleContext(const TargetInfo *T=nullptr)

If T is null pointer, assume the target in ASTContext.

QualType getRealTypeForBitwidth(unsigned DestWidth, FloatModeKind ExplicitType) const

getRealTypeForBitwidth - sets floating point QualTy according to specified bitwidth.

QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const

getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...

QualType getVariableArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals, SourceRange Brackets) const

Return a non-unique reference to the type for a variable array of the specified element type.

QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const

Return a K&R style C function type like 'int()'.

ASTMutationListener * getASTMutationListener() const

Retrieve a pointer to the AST mutation listener associated with this AST context, if any.

IdentifierInfo * getBuiltinCommonTypeName() const

unsigned NumImplicitCopyAssignmentOperatorsDeclared

The number of implicitly-declared copy assignment operators for which declarations were built.

uint64_t getTargetNullPointerValue(QualType QT) const

Get target-dependent integer value for null pointer which is used for constant folding.

unsigned getTypeUnadjustedAlign(QualType T) const

Return the ABI-specified natural alignment of a (complete) type T, before alignment adjustments,...

unsigned char getFixedPointIBits(QualType Ty) const

QualType getCorrespondingSignedFixedPointType(QualType Ty) const

QualType getArrayParameterType(QualType Ty) const

Return the uniqued reference to a specified array parameter type from the original array type.

QualType getCountAttributedType(QualType T, Expr *CountExpr, bool CountInBytes, bool OrNull, ArrayRef< TypeCoupledDeclRefInfo > DependentDecls) const

const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const

Get or compute information about the layout of the specified record (struct/union/class) D,...

CanQualType getCanonicalType(QualType T) const

Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...

unsigned NumImplicitDestructorsDeclared

The number of implicitly-declared destructors for which declarations were built.

bool mergeExtParameterInfo(const FunctionProtoType *FirstFnType, const FunctionProtoType *SecondFnType, bool &CanUseFirst, bool &CanUseSecond, SmallVectorImpl< FunctionProtoType::ExtParameterInfo > &NewParamInfos)

This function merges the ExtParameterInfo lists of two functions.

bool ObjCQualifiedClassTypesAreCompatible(const ObjCObjectPointerType *LHS, const ObjCObjectPointerType *RHS)

ObjCQualifiedClassTypesAreCompatible - compare Class<pr,...> and Class<pr1, ...>.

bool shouldExternalize(const Decl *D) const

Whether a C++ static variable or CUDA/HIP kernel should be externalized.

bool hasSameType(QualType T1, QualType T2) const

Determine whether the given types T1 and T2 are equivalent.

bool propertyTypesAreCompatible(QualType, QualType)

void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)

TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const

Retrieve the template name that represents a qualified template name such as std::vector.

QualType getDependentVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc, VectorKind VecKind) const

Return the unique reference to the type for a dependently sized vector of the specified element type.

CanQualType SatLongAccumTy

CanQualType getIntMaxType() const

Return the unique type for "intmax_t" (C99 7.18.1.5), defined in <stdint.h>.

QualType getVectorType(QualType VectorType, unsigned NumElts, VectorKind VecKind) const

Return the unique reference to a vector type of the specified element type and size.

OpenCLTypeKind getOpenCLTypeKind(const Type *T) const

Map an AST Type to an OpenCLTypeKind enum value.

QualType getFILEType() const

Retrieve the C FILE type.

ArrayRef< Decl * > getModuleInitializers(Module *M)

Get the initializations to perform when importing a module, if any.

void getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, std::string &S) const

Put the string version of the type qualifiers QT into S.

unsigned getPreferredTypeAlign(QualType T) const

Return the "preferred" alignment of the specified type T for the current target, in bits.

std::string getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, bool Extended=false) const

Emit the encoded type for the method declaration Decl into S.

bool DeclMustBeEmitted(const Decl *D)

Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...

CanQualType OMPArrayShapingTy

ASTContext(LangOptions &LOpts, SourceManager &SM, IdentifierTable &idents, SelectorTable &sels, Builtin::Context &builtins, TranslationUnitKind TUKind)

QualType getReadPipeType(QualType T) const

Return a read_only pipe type for the specified type.

std::string getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const

getObjCEncodingForPropertyDecl - Return the encoded type for this method declaration.

TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const

Retrieves the "canonical" template name that refers to a given template.

unsigned getStaticLocalNumber(const VarDecl *VD) const

void addComment(const RawComment &RC)

void getLegacyIntegralTypeEncoding(QualType &t) const

getLegacyIntegralTypeEncoding - Another legacy compatibility encoding: 32-bit longs are encoded as 'l...

bool isSameTypeConstraint(const TypeConstraint *XTC, const TypeConstraint *YTC) const

Determine whether two type contraint are similar enough that they could used in declarations of the s...

CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const

Retrieves the default calling convention for the current target.

RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=RecordDecl::TagKind::Struct) const

Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.

QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex, SubstTemplateTypeParmTypeFlag Flag=SubstTemplateTypeParmTypeFlag::None) const

Retrieve a substitution-result type.

QualType getPointerType(QualType T) const

Return the uniqued reference to the type for a pointer to the specified type.

QualType getMSGuidType() const

Retrieve the implicitly-predeclared 'struct _GUID' type.

const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)

Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...

const ASTRecordLayout & getASTObjCImplementationLayout(const ObjCImplementationDecl *D) const

Get or compute information about the layout of the specified Objective-C implementation.

CanQualType UnsignedLongFractTy

QualType getEnumType(const EnumDecl *Decl) const

overridden_method_range overridden_methods(const CXXMethodDecl *Method) const

QualType getDependentBitIntType(bool Unsigned, Expr *BitsExpr) const

Return a dependent bit-precise integer type with the specified signedness and bit count.

void setObjCImplementation(ObjCInterfaceDecl *IFaceD, ObjCImplementationDecl *ImplD)

Set the implementation of ObjCInterfaceDecl.

StringRef getCUIDHash() const

bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const

Returns true if this is an inline-initialized static data member which is treated as a definition for...

bool canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT)

canAssignObjCInterfaces - Return true if the two interface types are compatible for assignment from R...

QualType getReferenceQualifiedType(const Expr *e) const

getReferenceQualifiedType - Given an expr, will return the type for that expression,...

bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const

Determine whether two function types are the same, ignoring exception specifications in cases where t...

QualType getBlockDescriptorExtendedType() const

Gets the struct used to keep track of the extended descriptor for pointer to blocks.

QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const

Return the uniqued reference to the type for an lvalue reference to the specified type.

IdentifierInfo * getMakeIntegerSeqName() const

bool QIdProtocolsAdoptObjCObjectProtocols(QualType QT, ObjCInterfaceDecl *IDecl)

QIdProtocolsAdoptObjCObjectProtocols - Checks that protocols in QT's qualified-id protocol list adopt...

void addLazyModuleInitializers(Module *M, ArrayRef< GlobalDeclID > IDs)

bool isSameConstraintExpr(const Expr *XCE, const Expr *YCE) const

Determine whether two 'requires' expressions are similar enough that they may be used in re-declarati...

IdentifierInfo * getTypePackElementName() const

bool BlockRequiresCopying(QualType Ty, const VarDecl *D)

Returns true iff we need copy/dispose helpers for the given type.

QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const

Return the unique reference to the type for the specified type declaration.

CanQualType OMPIteratorTy

TemplateName getSubstTemplateTemplateParm(TemplateName replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex) const

Builtin::Context & BuiltinInfo

QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const

Return the unique reference to the type for a constant array of the specified element type.

void addModuleInitializer(Module *M, Decl *Init)

Add a declaration to the list of declarations that are initialized for a module.

const LangOptions & getLangOpts() const

QualType getFunctionTypeWithoutPtrSizes(QualType T)

Get a function type and produce the equivalent function type where pointer size address spaces in the...

llvm::iterator_range< overridden_cxx_method_iterator > overridden_method_range

bool isTypeIgnoredBySanitizer(const SanitizerMask &Mask, const QualType &Ty) const

Check if a type can have its sanitizer instrumentation elided based on its presence within an ignorel...

unsigned getMinGlobalAlignOfVar(uint64_t Size, const VarDecl *VD) const

Return the minimum alignement as specified by the target.

RawCommentList Comments

All comments in this translation unit.

bool isSameDefaultTemplateArgument(const NamedDecl *X, const NamedDecl *Y) const

Determine whether two default template arguments are similar enough that they may be used in declarat...

QualType applyObjCProtocolQualifiers(QualType type, ArrayRef< ObjCProtocolDecl * > protocols, bool &hasError, bool allowOnPointerType=false) const

Apply Objective-C protocol qualifiers to the given type.

QualType getMacroQualifiedType(QualType UnderlyingTy, const IdentifierInfo *MacroII) const

QualType removePtrSizeAddrSpace(QualType T) const

Remove the existing address space on the type if it is a pointer size address space and return the ty...

bool areLaxCompatibleRVVTypes(QualType FirstType, QualType SecondType)

Return true if the given vector types are lax-compatible RISC-V vector types as defined by -flax-vect...

CanQualType SatShortFractTy

QualType getDecayedType(QualType T) const

Return the uniqued reference to the decayed version of the given type.

bool canBindObjCObjectType(QualType To, QualType From)

int getFloatingTypeSemanticOrder(QualType LHS, QualType RHS) const

Compare the rank of two floating point types as above, but compare equal if both types have the same ...

QualType getUIntPtrType() const

Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.

void setParameterIndex(const ParmVarDecl *D, unsigned index)

Used by ParmVarDecl to store on the side the index of the parameter when it exceeds the size of the n...

QualType getFunctionTypeWithExceptionSpec(QualType Orig, const FunctionProtoType::ExceptionSpecInfo &ESI) const

Get a function type and produce the equivalent function type with the specified exception specificati...

Qualifiers::GC getObjCGCAttrKind(QualType Ty) const

Return one of the GCNone, Weak or Strong Objective-C garbage collection attributes.

bool hasUniqueObjectRepresentations(QualType Ty, bool CheckIfTriviallyCopyable=true) const

Return true if the specified type has unique object representations according to (C++17 [meta....

bool typesAreBlockPointerCompatible(QualType, QualType)

CanQualType SatUnsignedAccumTy

bool useAbbreviatedThunkName(GlobalDecl VirtualMethodDecl, StringRef MangledName)

const ASTRecordLayout & getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const

Get or compute information about the layout of the specified Objective-C interface.

void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const

Visits all versions of a multiversioned function with the passed predicate.

void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)

Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...

QualType getBaseElementType(const ArrayType *VAT) const

Return the innermost element type of an array type.

QualType getPointerDiffType() const

Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.

QualType getSignatureParameterType(QualType T) const

Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...

CanQualType ArraySectionTy

QualType getCanonicalTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args) const

CanQualType ObjCBuiltinIdTy

overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const

VTableContextBase * getVTableContext()

int getFloatingTypeOrder(QualType LHS, QualType RHS) const

Compare the rank of the two specified floating point types, ignoring the domain of the type (i....

unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const

ObjCPropertyImplDecl * getObjCPropertyImplDeclForPropertyDecl(const ObjCPropertyDecl *PD, const Decl *Container) const

bool isNearlyEmpty(const CXXRecordDecl *RD) const

void cacheRawCommentForDecl(const Decl &OriginalD, const RawComment &Comment) const

Attaches Comment to OriginalD and to its redeclaration chain and removes the redeclaration chain from...

void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)

Searches existing comments for doc comments that should be attached to Decls.

QualType getIntTypeForBitwidth(unsigned DestWidth, unsigned Signed) const

getIntTypeForBitwidth - sets integer QualTy according to specified details: bitwidth,...

void setStaticLocalNumber(const VarDecl *VD, unsigned Number)

QualType getCFConstantStringType() const

Return the C structure type used to represent constant CFStrings.

void eraseDeclAttrs(const Decl *D)

Erase the attributes corresponding to the given declaration.

UsingEnumDecl * getInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst)

If the given using-enum decl Inst is an instantiation of another using-enum decl, return it.

RecordDecl * getCFConstantStringTagDecl() const

QualType getObjCSelType() const

Retrieve the type that corresponds to the predefined Objective-C 'SEL' type.

QualType getDeducedTemplateSpecializationType(TemplateName Template, QualType DeducedType, bool IsDependent) const

C++17 deduced class template specialization type.

std::string getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const

Emit the encoded type for the function Decl into S.

QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const

Retrieve the template type parameter type for a template parameter or parameter pack with the given d...

CanQualType UnsignedFractTy

QualType getjmp_bufType() const

Retrieve the C jmp_buf type.

GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const

QualType mergeFunctionParameterTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)

mergeFunctionParameterTypes - merge two types which appear as function parameter types

QualType getsigjmp_bufType() const

Retrieve the C sigjmp_buf type.

void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)

Note that the given C++ Method overrides the given Overridden method.

CanQualType ObjCBuiltinClassTy

unsigned NumImplicitDefaultConstructorsDeclared

The number of implicitly-declared default constructors for which declarations were built.

CanQualType UnresolvedTemplateTy

OMPTraitInfo & getNewOMPTraitInfo()

Return a new OMPTraitInfo object owned by this context.

CanQualType UnsignedLongTy

void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass, SmallVectorImpl< const ObjCIvarDecl * > &Ivars) const

DeepCollectObjCIvars - This routine first collects all declared, but not synthesized,...

bool computeBestEnumTypes(bool IsPacked, unsigned NumNegativeBits, unsigned NumPositiveBits, QualType &BestType, QualType &BestPromotionType)

Compute BestType and BestPromotionType for an enum based on the highest number of negative and positi...

llvm::APFixedPoint getFixedPointMin(QualType Ty) const

TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const

Allocate a TypeSourceInfo where all locations have been initialized to a given location,...

QualType adjustType(QualType OldType, llvm::function_ref< QualType(QualType)> Adjust) const

Rebuild a type, preserving any existing type sugar.

void addedLocalImportDecl(ImportDecl *Import)

Notify the AST context that a new import declaration has been parsed or implicitly created within thi...

CanQualType UnsignedLongAccumTy

QualType AutoRRefDeductTy

CanQualType getSizeType() const

Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.

TypeInfo getTypeInfo(const Type *T) const

Get the size and alignment of the specified complete type in bits.

QualType getStringLiteralArrayType(QualType EltTy, unsigned Length) const

Return a type for a constant array for a string literal of the specified element type and length.

QualType getCorrespondingSaturatedType(QualType Ty) const

bool isSameEntity(const NamedDecl *X, const NamedDecl *Y) const

Determine whether the two declarations refer to the same entity.

TypeSourceInfo * getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc, const TemplateArgumentListInfo &Args, QualType Canon=QualType()) const

QualType getSubstTemplateTypeParmPackType(Decl *AssociatedDecl, unsigned Index, bool Final, const TemplateArgument &ArgPack)

Retrieve a.

CanQualType BoundMemberTy

CanQualType SatUnsignedShortFractTy

QualType removeAddrSpaceQualType(QualType T) const

Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...

bool hasSameFunctionTypeIgnoringParamABI(QualType T, QualType U) const

Determine if two function types are the same, ignoring parameter ABI annotations.

TypedefDecl * getInt128Decl() const

Retrieve the declaration for the 128-bit signed integer type.

unsigned getOpenMPDefaultSimdAlign(QualType T) const

Get default simd alignment of the specified complete type in bits.

QualType getObjCSuperType() const

Returns the C struct type for objc_super.

QualType getBlockDescriptorType() const

Gets the struct used to keep track of the descriptor for pointer to blocks.

bool CommentsLoaded

True if comments are already loaded from ExternalASTSource.

BlockVarCopyInit getBlockVarCopyInit(const VarDecl *VD) const

Get the copy initialization expression of the VarDecl VD, or nullptr if none exists.

unsigned NumImplicitMoveConstructorsDeclared

The number of implicitly-declared move constructors for which declarations were built.

unsigned NumImplicitCopyConstructorsDeclared

The number of implicitly-declared copy constructors for which declarations were built.

llvm::DenseSet< const VarDecl * > CUDADeviceVarODRUsedByHost

Keep track of CUDA/HIP device-side variables ODR-used by host code.

CanQualType PseudoObjectTy

QualType getWebAssemblyExternrefType() const

Return a WebAssembly externref type.

void setTraversalScope(const std::vector< Decl * > &)

CharUnits getTypeUnadjustedAlignInChars(QualType T) const

getTypeUnadjustedAlignInChars - Return the ABI-specified alignment of a type, in characters,...

QualType getAdjustedType(QualType Orig, QualType New) const

Return the uniqued reference to a type adjusted from the original type to a new type.

unsigned getAlignOfGlobalVar(QualType T, const VarDecl *VD) const

Return the alignment in bits that should be given to a global variable with type T.

TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const

MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)

Retrieve the context for computing mangling numbers in the given DeclContext.

comments::FullComment * getLocalCommentForDeclUncached(const Decl *D) const

Return parsed documentation comment attached to a given declaration.

unsigned NumImplicitDestructors

The number of implicitly-declared destructors.

QualType getQualifiedType(SplitQualType split) const

Un-split a SplitQualType.

QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const

bool isAlignmentRequired(const Type *T) const

Determine if the alignment the type has was required using an alignment attribute.

bool areComparableObjCPointerTypes(QualType LHS, QualType RHS)

MangleContext * createDeviceMangleContext(const TargetInfo &T)

Creates a device mangle context to correctly mangle lambdas in a mixed architecture compile by settin...

CharUnits getExnObjectAlignment() const

Return the alignment (in bytes) of the thrown exception object.

QualType getObjCObjectPointerType(QualType OIT) const

Return a ObjCObjectPointerType type for the given ObjCObjectType.

ASTMutationListener * Listener

QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true) const

Form a pack expansion type with the given pattern.

CanQualType ObjCBuiltinBoolTy

TypeInfoChars getTypeInfoInChars(const Type *T) const

QualType getObjCObjectType(QualType Base, ObjCProtocolDecl *const *Protocols, unsigned NumProtocols) const

Legacy interface: cannot provide type arguments or __kindof.

TemplateParamObjectDecl * getTemplateParamObjectDecl(QualType T, const APValue &V) const

Return the template parameter object of the given type with the given value.

CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const

Return a conservative estimate of the alignment of the specified decl D.

int64_t toBits(CharUnits CharSize) const

Convert a size in characters to a size in bits.

CanQualType OCLClkEventTy

void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)

Change the exception specification on a function once it is delay-parsed, instantiated,...

TypedefDecl * getUInt128Decl() const

Retrieve the declaration for the 128-bit unsigned integer type.

const clang::PrintingPolicy & getPrintingPolicy() const

ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)

Get the additional modules in which the definition Def has been merged.

llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const

QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts, ArraySizeModifier ASM, unsigned IndexTypeQuals, SourceRange Brackets) const

Return a non-unique reference to the type for a dependently-sized array of the specified element type...

uint64_t lookupFieldBitOffset(const ObjCInterfaceDecl *OID, const ObjCImplementationDecl *ID, const ObjCIvarDecl *Ivar) const

Get the offset of an ObjCIvarDecl in bits.

CanQualType SatUnsignedShortAccumTy

QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)

const RawComment * getRawCommentForAnyRedecl(const Decl *D, const Decl **OriginalDecl=nullptr) const

Return the documentation comment attached to a given declaration.

CharUnits getAlignOfGlobalVarInChars(QualType T, const VarDecl *VD) const

Return the alignment in characters that should be given to a global variable with type T.

const ObjCMethodDecl * getObjCMethodRedeclaration(const ObjCMethodDecl *MD) const

Get the duplicate declaration of a ObjCMethod in the same interface, or null if none exists.

static bool isObjCNSObjectType(QualType Ty)

Return true if this is an NSObject object with its NSObject attribute set.

GVALinkage GetGVALinkageForVariable(const VarDecl *VD) const

UsingShadowDecl * getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst)

QualType getObjCIdType() const

Represents the Objective-CC id type.

Decl * getVaListTagDecl() const

Retrieve the C type declaration corresponding to the predefined __va_list_tag type used to help defin...

QualType getUnsignedWCharType() const

Return the type of "unsigned wchar_t".

QualType getFunctionTypeWithoutParamABIs(QualType T) const

Get or construct a function type that is equivalent to the input type except that the parameter ABI a...

bool hasSameUnqualifiedType(QualType T1, QualType T2) const

Determine whether the given types are equivalent after cvr-qualifiers have been removed.

QualType getCorrespondingUnsaturatedType(QualType Ty) const

comments::FullComment * getCommentForDecl(const Decl *D, const Preprocessor *PP) const

Return parsed documentation comment attached to a given declaration.

FunctionProtoType::ExceptionSpecInfo mergeExceptionSpecs(FunctionProtoType::ExceptionSpecInfo ESI1, FunctionProtoType::ExceptionSpecInfo ESI2, SmallVectorImpl< QualType > &ExceptionTypeStorage, bool AcceptDependent)

TemplateArgument getInjectedTemplateArg(NamedDecl *ParamDecl) const

unsigned getTargetDefaultAlignForAttributeAligned() const

Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...

const ArrayType * getAsArrayType(QualType T) const

Type Query functions.

llvm::DenseMap< CanQualType, SYCLKernelInfo > SYCLKernels

Map of SYCL kernels indexed by the unique type used to name the kernel.

bool isSameTemplateParameterList(const TemplateParameterList *X, const TemplateParameterList *Y) const

Determine whether two template parameter lists are similar enough that they may be used in declaratio...

QualType getWritePipeType(QualType T) const

Return a write_only pipe type for the specified type.

const CXXRecordDecl * baseForVTableAuthentication(const CXXRecordDecl *ThisClass)

Resolve the root record to be used to derive the vtable pointer authentication policy for the specifi...

uint64_t getTypeSize(QualType T) const

Return the size of the specified (complete) type T, in bits.

CanQualType UnsignedInt128Ty

ObjCInterfaceDecl * getObjCProtocolDecl() const

Retrieve the Objective-C class declaration corresponding to the predefined Protocol class.

unsigned NumImplicitDefaultConstructors

The number of implicitly-declared default constructors.

CharUnits getTypeSizeInChars(QualType T) const

Return the size of the specified (complete) type T, in characters.

unsigned NumImplicitMoveAssignmentOperatorsDeclared

The number of implicitly-declared move assignment operators for which declarations were built.

void setManglingNumber(const NamedDecl *ND, unsigned Number)

llvm::DenseMap< const Decl *, const RawComment * > DeclRawComments

Mapping from declaration to directly attached comment.

TypedefDecl * getBuiltinVaListDecl() const

Retrieve the C type declaration corresponding to the predefined __builtin_va_list type.

CanQualType UnsignedCharTy

CanQualType UnsignedShortFractTy

BuiltinTemplateDecl * buildBuiltinTemplateDecl(BuiltinTemplateKind BTK, const IdentifierInfo *II) const

void * Allocate(size_t Size, unsigned Align=8) const

bool canBuiltinBeRedeclared(const FunctionDecl *) const

Return whether a declaration to a builtin is allowed to be overloaded/redeclared.

CanQualType UnsignedIntTy

TemplateName getDependentTemplateName(NestedNameSpecifier *NNS, const IdentifierInfo *Name) const

Retrieve the template name that represents a dependent template name such as MetaFun::template apply.

unsigned NumImplicitMoveConstructors

The number of implicitly-declared move constructors.

QualType getObjCTypeParamType(const ObjCTypeParamDecl *Decl, ArrayRef< ObjCProtocolDecl * > protocols) const

QualType getVolatileType(QualType T) const

Return the uniqued reference to the type for a volatile qualified type.

void getObjCEncodingForMethodParameter(Decl::ObjCDeclQualifier QT, QualType T, std::string &S, bool Extended) const

getObjCEncodingForMethodParameter - Return the encoded type for a single method parameter or return t...

void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)

unsigned overridden_methods_size(const CXXMethodDecl *Method) const

std::string getObjCEncodingForBlock(const BlockExpr *blockExpr) const

Return the encoded type for this block declaration.

TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const

Allocate an uninitialized TypeSourceInfo.

QualType getExceptionObjectType(QualType T) const

void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())

Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...

FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const

DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)

bool ObjCObjectAdoptsQTypeProtocols(QualType QT, ObjCInterfaceDecl *Decl)

ObjCObjectAdoptsQTypeProtocols - Checks that protocols in IC's protocol list adopt all protocols in Q...

CanQualType UnsignedLongLongTy

QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const

Return the type for the specified builtin.

QualType getCommonSugaredType(QualType X, QualType Y, bool Unqualified=false)

CanQualType OCLReserveIDTy

bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const

Determine whether two template parameters are similar enough that they may be used in declarations of...

void registerSYCLEntryPointFunction(FunctionDecl *FD)

Generates and stores SYCL kernel metadata for the provided SYCL kernel entry point function.

QualType getArrayDecayedType(QualType T) const

Return the properly qualified result of decaying the specified array type to a pointer.

overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const

CanQualType UnsignedShortTy

unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const

Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...

void UnwrapSimilarArrayTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const

Attempt to unwrap two types that may both be array types with the same bound (or both be array types ...

bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const

QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const

Return a normal function type with a typed argument list.

QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const

const SYCLKernelInfo & getSYCLKernelInfo(QualType T) const

Given a type used as a SYCL kernel name, returns a reference to the metadata generated from the corre...

bool canAssignObjCInterfacesInBlockPointer(const ObjCObjectPointerType *LHSOPT, const ObjCObjectPointerType *RHSOPT, bool BlockReturnType)

canAssignObjCInterfacesInBlockPointer - This routine is specifically written for providing type-safet...

CanQualType SatUnsignedLongFractTy

const CXXConstructorDecl * getCopyConstructorForExceptionObject(CXXRecordDecl *RD)

QualType getDependentAddressSpaceType(QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttrLoc) const

QualType getPackIndexingType(QualType Pattern, Expr *IndexExpr, bool FullySubstituted=false, ArrayRef< QualType > Expansions={}, int Index=-1) const

RawComment * getRawCommentForDeclNoCache(const Decl *D) const

Return the documentation comment attached to a given declaration, without looking into cache.

QualType getPromotedIntegerType(QualType PromotableType) const

Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...

const VariableArrayType * getAsVariableArrayType(QualType T) const

QualType getUnaryTransformType(QualType BaseType, QualType UnderlyingType, UnaryTransformType::UTTKind UKind) const

Unary type transforms.

void setExternalSource(IntrusiveRefCntPtr< ExternalASTSource > Source)

Attach an external AST source to the AST context.

const ObjCInterfaceDecl * getObjContainingInterface(const NamedDecl *ND) const

Returns the Objective-C interface that ND belongs to if it is an Objective-C method/property/ivar etc...

StringLiteral * getPredefinedStringLiteralFromCache(StringRef Key) const

Return a string representing the human readable name for the specified function declaration or file n...

bool hasSimilarType(QualType T1, QualType T2) const

Determine if two types are similar, according to the C++ rules.

llvm::APFixedPoint getFixedPointMax(QualType Ty) const

QualType getComplexType(QualType T) const

Return the uniqued reference to the type for a complex number with the specified element type.

bool areCompatibleSveTypes(QualType FirstType, QualType SecondType)

Return true if the given types are an SVE builtin and a VectorType that is a fixed-length representat...

bool hasDirectOwnershipQualifier(QualType Ty) const

Return true if the type has been explicitly qualified with ObjC ownership.

Qualifiers::ObjCLifetime getInnerObjCOwnership(QualType T) const

Recurses in pointer/array types until it finds an Objective-C retainable type and returns its ownersh...

void addCopyConstructorForExceptionObject(CXXRecordDecl *RD, CXXConstructorDecl *CD)

DiagnosticsEngine & getDiagnostics() const

QualType getAdjustedParameterType(QualType T) const

Perform adjustment on the parameter type of a function.

void ResetObjCLayout(const ObjCContainerDecl *CD)

interp::Context & getInterpContext()

Returns the clang bytecode interpreter context.

UnnamedGlobalConstantDecl * getUnnamedGlobalConstantDecl(QualType Ty, const APValue &Value) const

Return a declaration for a uniquified anonymous global constant corresponding to a given APValue.

QualType getExtVectorType(QualType VectorType, unsigned NumElts) const

Return the unique reference to an extended vector type of the specified element type and size.

bool areCompatibleVectorTypes(QualType FirstVec, QualType SecondVec)

Return true if the given vector types are of the same unqualified type or if they are equivalent to t...

void getOverriddenMethods(const NamedDecl *Method, SmallVectorImpl< const NamedDecl * > &Overridden) const

Return C++ or ObjC overridden methods for the given Method.

DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const

bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const

Determine whether the given template names refer to the same template.

CanQualType SatLongFractTy

const TargetInfo & getTargetInfo() const

void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)

CanQualType SatShortAccumTy

QualType getAutoDeductType() const

C++11 deduction pattern for 'auto' type.

unsigned NumImplicitCopyConstructors

The number of implicitly-declared copy constructors.

CharUnits toCharUnitsFromBits(int64_t BitSize) const

Convert a size in bits to a size in characters.

CanQualType IncompleteMatrixIdxTy

void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const

CanQualType getNSIntegerType() const

QualType getCorrespondingUnsignedType(QualType T) const

void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)

Set the copy initialization expression of a block var decl.

TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const

Retrieve the template name that corresponds to a non-empty lookup.

bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)

Compatibility predicates used to check assignment expressions.

TemplateName getSubstTemplateTemplateParmPack(const TemplateArgument &ArgPack, Decl *AssociatedDecl, unsigned Index, bool Final) const

TargetCXXABI::Kind getCXXABIKind() const

Return the C++ ABI kind that should be used.

QualType getHLSLAttributedResourceType(QualType Wrapped, QualType Contained, const HLSLAttributedResourceType::Attributes &Attrs)

bool UnwrapSimilarTypes(QualType &T1, QualType &T2, bool AllowPiMismatch=true) const

Attempt to unwrap two types that may be similar (C++ [conv.qual]).

QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const

Return the uniqued reference to the type for an address space qualified type with the specified type ...

ExternalASTSource * getExternalSource() const

Retrieve a pointer to the external AST source associated with this AST context, if any.

uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const

Return number of constant array elements.

BuiltinTemplateDecl * getTypePackElementDecl() const

CanQualType SatUnsignedLongAccumTy

QualType getUnconstrainedType(QualType T) const

Remove any type constraints from a template parameter type, for equivalence comparison of template pa...

QualType getTypeOfType(QualType QT, TypeOfKind Kind) const

getTypeOfType - Unlike many "get<Type>" functions, we don't unique TypeOfType nodes.

QualType getCorrespondingSignedType(QualType T) const

QualType mergeObjCGCQualifiers(QualType, QualType)

mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 'RHS' attributes and ret...

llvm::DenseMap< const Decl *, const Decl * > CommentlessRedeclChains

Keeps track of redeclaration chains that don't have any comment attached.

uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const

Return number of elements initialized in an ArrayInitLoopExpr.

void deduplicateMergedDefinitonsFor(NamedDecl *ND)

Clean up the merged definition list.

unsigned getTargetAddressSpace(LangAS AS) const

QualType getWideCharType() const

Return the type of wide characters.

QualType getIntPtrType() const

Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.

void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)

Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...

void addTranslationUnitDecl()

void getObjCEncodingForPropertyType(QualType T, std::string &S) const

Emit the Objective-C property type encoding for the given type T into S.

unsigned NumImplicitCopyAssignmentOperators

The number of implicitly-declared copy assignment operators.

void CollectInheritedProtocols(const Decl *CDecl, llvm::SmallPtrSet< ObjCProtocolDecl *, 8 > &Protocols)

CollectInheritedProtocols - Collect all protocols in current class and those inherited by it.

bool isPromotableIntegerType(QualType T) const

More type predicates useful for type checking/promotion.

llvm::DenseMap< const Decl *, const Decl * > RedeclChainComments

Mapping from canonical declaration to the first redeclaration in chain that has a comment attached.

CanQualType getSignedSizeType() const

Return the unique signed counterpart of the integer type corresponding to size_t.

void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)

Change the result type of a function type once it is deduced.

QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const

Return the uniqued reference to the type for an Objective-C gc-qualified type.

QualType getDecltypeType(Expr *e, QualType UnderlyingType) const

C++11 decltype.

NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const

Retrieves the "canonical" nested name specifier for a given nested name specifier.

QualType getTypedefType(const TypedefNameDecl *Decl, QualType Underlying=QualType()) const

Return the unique reference to the type for the specified typedef-name decl.

InlineVariableDefinitionKind getInlineVariableDefinitionKind(const VarDecl *VD) const

Determine whether a definition of this inline variable should be treated as a weak or strong definiti...

CanQualType getUIntMaxType() const

Return the unique type for "uintmax_t" (C99 7.18.1.5), defined in <stdint.h>.

uint16_t getPointerAuthVTablePointerDiscriminator(const CXXRecordDecl *RD)

Return the "other" discriminator used for the pointer auth schema used for vtable pointers in instanc...

CharUnits getOffsetOfBaseWithVBPtr(const CXXRecordDecl *RD) const

Loading virtual member pointers using the virtual inheritance model always results in an adjustment u...

LangAS getLangASForBuiltinAddressSpace(unsigned AS) const

bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)

Determine whether two function types are the same, ignoring pointer sizes in the return type and para...

unsigned char getFixedPointScale(QualType Ty) const

QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const

Return a unique reference to the type for an incomplete array of the specified element type.

QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const

QualType DecodeTypeStr(const char *&Str, const ASTContext &Context, ASTContext::GetBuiltinTypeError &Error, bool &RequireICE, bool AllowTypeModifiers) const

TemplateName getAssumedTemplateName(DeclarationName Name) const

Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...

@ GE_Missing_stdio

Missing a type from <stdio.h>

@ GE_Missing_type

Missing a type.

@ GE_Missing_ucontext

Missing a type from <ucontext.h>

@ GE_Missing_setjmp

Missing a type from <setjmp.h>

QualType adjustStringLiteralBaseType(QualType StrLTy) const

uint16_t getPointerAuthTypeDiscriminator(QualType T)

Return the "other" type-specific discriminator for the given type.

QualType getTypeOfExprType(Expr *E, TypeOfKind Kind) const

C23 feature and GCC extension.

QualType getSignedWCharType() const

Return the type of "signed wchar_t".

QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const

Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.

bool hasCvrSimilarType(QualType T1, QualType T2)

Determine if two types are similar, ignoring only CVR qualifiers.

TemplateName getDeducedTemplateName(TemplateName Underlying, DefaultArguments DefaultArgs) const

Represents a TemplateName which had some of its default arguments deduced.

ObjCImplementationDecl * getObjCImplementation(ObjCInterfaceDecl *D)

Get the implementation of the ObjCInterfaceDecl D, or nullptr if none exists.

CanQualType UnsignedAccumTy

void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)

void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)

QualType getConstantMatrixType(QualType ElementType, unsigned NumRows, unsigned NumColumns) const

Return the unique reference to the matrix type of the specified element type and size.

QualType getVariableArrayDecayedType(QualType Ty) const

Returns a vla type where known sizes are replaced with [*].

bool isInSameModule(const Module *M1, const Module *M2)

If the two module M1 and M2 are in the same module.

void setCFConstantStringType(QualType T)

const SYCLKernelInfo * findSYCLKernelInfo(QualType T) const

Returns a pointer to the metadata generated from the corresponding SYCLkernel entry point if the prov...

unsigned getParameterIndex(const ParmVarDecl *D) const

Used by ParmVarDecl to retrieve on the side the index of the parameter when it exceeds the size of th...

void AddDeallocation(void(*Callback)(void *), void *Data) const

Add a deallocation callback that will be invoked when the ASTContext is destroyed.

AttrVec & getDeclAttrs(const Decl *D)

Retrieve the attributes for the given declaration.

CXXMethodVector::const_iterator overridden_cxx_method_iterator

RawComment * getRawCommentForDeclNoCacheImpl(const Decl *D, const SourceLocation RepresentativeLocForDecl, const std::map< unsigned, RawComment * > &CommentsInFile) const

unsigned getTypeAlign(QualType T) const

Return the ABI-specified alignment of a (complete) type T, in bits.

QualType mergeTransparentUnionType(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false)

mergeTransparentUnionType - if T is a transparent union type and a member of T is compatible with Sub...

QualType isPromotableBitField(Expr *E) const

Whether this is a promotable bitfield reference according to C99 6.3.1.1p2, bullet 2 (and GCC extensi...

bool isSentinelNullExpr(const Expr *E)

CanQualType getNSUIntegerType() const

uint64_t getCharWidth() const

Return the size of the character type, in bits.

QualType getBitIntType(bool Unsigned, unsigned NumBits) const

Return a bit-precise integer type with the specified signedness and bit count.

unsigned NumImplicitMoveAssignmentOperators

The number of implicitly-declared move assignment operators.

An abstract interface that should be implemented by listeners that want to be notified when an AST en...

virtual void AddedStaticLocalNumbers(const Decl *D, unsigned Number)

An static local number was added to a Decl.

virtual ~ASTMutationListener()

virtual void RedefinedHiddenDefinition(const NamedDecl *D, Module *M)

A definition has been made visible by being redefined locally.

virtual void AddedManglingNumber(const Decl *D, unsigned Number)

An mangling number was added to a Decl.

virtual void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType)

A function's return type has been deduced.

ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...

CharUnits getAlignment() const

getAlignment - Get the record alignment in characters.

const CXXRecordDecl * getBaseSharingVBPtr() const

CharUnits getSize() const

getSize - Get the record size in characters.

uint64_t getFieldOffset(unsigned FieldNo) const

getFieldOffset - Get the offset of the given field index, in bits.

CharUnits getDataSize() const

getDataSize() - Get the record data size, which is the record size without tail padding,...

CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const

getBaseClassOffset - Get the offset, in chars, for the given base class.

CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const

getVBaseClassOffset - Get the offset, in chars, for the given base class.

CharUnits getNonVirtualSize() const

getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...

CharUnits getUnadjustedAlignment() const

getUnadjustedAlignment - Get the record alignment in characters, before alignment adjustement.

Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.

void Profile(llvm::FoldingSetNodeID &ID)

Represents a loop initializing the elements of an array.

llvm::APInt getArraySize() const

Expr * getSubExpr() const

Get the initializer to use for each array element.

Represents a constant array type that does not decay to a pointer when used as a function parameter.

Represents an array type, per C99 6.7.5.2 - Array Declarators.

ArraySizeModifier getSizeModifier() const

Qualifiers getIndexTypeQualifiers() const

QualType getElementType() const

unsigned getIndexTypeCVRQualifiers() const

A structure for storing the information associated with a name that has been assumed to be a template...

AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...

QualType getValueType() const

Gets the type contained by this atomic type, i.e.

void Profile(llvm::FoldingSetNodeID &ID)

Attr - This represents one attribute.

An attributed type is a type to which a type attribute has been applied.

void Profile(llvm::FoldingSetNodeID &ID)

Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

bool isConstrained() const

void Profile(llvm::FoldingSetNodeID &ID)

A fixed int type of a specified bitwidth.

void Profile(llvm::FoldingSetNodeID &ID) const

unsigned getNumBits() const

Represents a block literal declaration, which is like an unnamed FunctionDecl.

BlockExpr - Adaptor class for mixing a BlockDecl with expressions.

void Profile(llvm::FoldingSetNodeID &ID)

Represents the builtin template declaration which is used to implement __make_integer_seq and other b...

static BuiltinTemplateDecl * Create(const ASTContext &C, DeclContext *DC, DeclarationName Name, BuiltinTemplateKind BTK)

This class is used for builtin types like 'int'.

StringRef getName(const PrintingPolicy &Policy) const

Holds information about both target-independent and target-specific builtins, allowing easy queries b...

const char * getTypeString(unsigned ID) const

Get the type descriptor string for the specified builtin.

bool hasCustomTypechecking(unsigned ID) const

Determines whether this builtin has custom typechecking.

bool canBeRedeclared(unsigned ID) const

Returns true if this is a builtin that can be redeclared.

bool isNoReturn(unsigned ID) const

Return true if we know this builtin never returns.

bool isNoThrow(unsigned ID) const

Return true if we know this builtin never throws an exception.

Implements C++ ABI-specific semantic analysis functions.

Represents a C++ constructor within a class.

Represents a static or instance method of a struct/union/class.

CXXMethodDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

Represents a C++ struct/union/class.

bool isPolymorphic() const

Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...

static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr, bool DelayTypeCreation=false)

bool isDynamicClass() const

bool isEmpty() const

Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).

SplitQualType split() const

static CanQual< Type > CreateUnsafe(QualType Other)

Builds a canonical type from a QualType.

QualType withConst() const

Retrieves a version of this type with const applied.

CanQual< T > getUnqualifiedType() const

Retrieve the unqualified form of this type.

Qualifiers getQualifiers() const

Retrieve all qualifiers.

const T * getTypePtr() const

Retrieve the underlying type pointer, which refers to a canonical type.

CharUnits - This is an opaque type for sizes expressed in character units.

bool isPositive() const

isPositive - Test whether the quantity is greater than zero.

bool isZero() const

isZero - Test whether the quantity equals zero.

QuantityType getQuantity() const

getQuantity - Get the raw integer representation of this quantity.

static CharUnits fromQuantity(QuantityType Quantity)

fromQuantity - Construct a CharUnits quantity from a raw integer type.

static CharUnits Zero()

Zero - Construct a CharUnits quantity of zero.

Declaration of a class template.

llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const

Retrieve the class template or class template partial specialization which was specialized by this.

Complex values, per C99 6.2.5p11.

QualType getElementType() const

void Profile(llvm::FoldingSetNodeID &ID)

Declaration of a C++20 concept.

ConceptDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

bool hasExplicitTemplateArgs() const

Whether or not template arguments were explicitly specified in the concept reference (they might not ...

const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const

Represents the canonical version of C arrays with a specified constant size.

const Expr * getSizeExpr() const

Return a pointer to the size expression.

llvm::APInt getSize() const

Return the constant array size as an APInt.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)

uint64_t getZExtSize() const

Return the size zero-extended as a uint64_t.

Represents a concrete matrix type with constant number of rows and columns.

unsigned getNumColumns() const

Returns the number of columns in the matrix.

void Profile(llvm::FoldingSetNodeID &ID)

unsigned getNumRows() const

Returns the number of rows in the matrix.

static constexpr bool isDimensionValid(size_t NumElements)

Returns true if NumElements is a valid matrix dimension.

Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...

void Profile(llvm::FoldingSetNodeID &ID)

Represents a pointer type decayed from an array or function type.

DeclContext - This is used only as base class of specific decl types that can act as declaration cont...

DeclContext * getParent()

getParent - Returns the containing DeclContext.

bool isFileContext() const

bool isDependentContext() const

Determines whether this context is dependent on a template parameter.

DeclContext * getLexicalParent()

getLexicalParent - Returns the containing lexical DeclContext.

lookup_result lookup(DeclarationName Name) const

lookup - Find the declarations (if any) with the given Name in this context.

DeclContext * getRedeclContext()

getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...

void addDecl(Decl *D)

Add the declaration D into this context.

A reference to a declared variable, function, enum, etc.

Decl - This represents one declaration (or definition), e.g.

Decl * getPreviousDecl()

Retrieve the previous declaration that declares the same entity as this declaration,...

const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const

If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...

ASTContext & getASTContext() const LLVM_READONLY

bool isImplicit() const

isImplicit - Indicates whether the declaration was implicitly generated by the implementation.

unsigned getMaxAlignment() const

getMaxAlignment - return the maximum alignment specified by attributes on this decl,...

static Decl * castFromDeclContext(const DeclContext *)

bool isTemplated() const

Determine whether this declaration is a templated entity (whether it is.

bool isCanonicalDecl() const

Whether this particular Decl is a canonical one.

FunctionDecl * getAsFunction() LLVM_READONLY

Returns the function itself, or the templated function if this is a function template.

ObjCDeclQualifier

ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...

bool isInvalidDecl() const

llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const

SourceLocation getLocation() const

bool isTemplateParameterPack() const

isTemplateParameter - Determines whether this declaration is a template parameter pack.

void setImplicit(bool I=true)

redecl_range redecls() const

Returns an iterator range for all the redeclarations of the same decl.

DeclContext * getDeclContext()

SourceLocation getBeginLoc() const LLVM_READONLY

void setDeclContext(DeclContext *DC)

setDeclContext - Set both the semantic and lexical DeclContext to DC.

DeclContext * getLexicalDeclContext()

getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).

virtual Decl * getCanonicalDecl()

Retrieves the "canonical" declaration of the given declaration.

DeclarationNameLoc - Additional source/type location info for a declaration name.

static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)

Construct location information for a non-literal C++ operator.

The name of a declaration.

static int compare(DeclarationName LHS, DeclarationName RHS)

Represents a ValueDecl that came out of a declarator.

TypeSourceInfo * getTypeSourceInfo() const

Represents the type decltype(expr) (C++11).

Represents a C++17 deduced template specialization type.

void Profile(llvm::FoldingSetNodeID &ID) const

TemplateName getUnderlying() const

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const

DefaultArguments getDefaultArguments() const

Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...

Represents an extended address space qualifier where the input address space value is dependent.

Expr * getAddrSpaceExpr() const

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Internal representation of canonical, dependent decltype(expr) types.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Represents a qualified type name for which the type name is dependent.

void Profile(llvm::FoldingSetNodeID &ID)

Represents an array type in C++ whose size is a value-dependent expression.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Expr * getSizeExpr() const

Represents an extended vector type where either the type or size is dependent.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Represents a matrix type where the type and the number of rows and columns is dependent on a template...

Expr * getRowExpr() const

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Represents a dependent template name that cannot be resolved prior to template instantiation.

OverloadedOperatorKind getOperator() const

Return the overloaded operator to which this template name refers.

bool isIdentifier() const

Determine whether this template name refers to an identifier.

const IdentifierInfo * getIdentifier() const

Returns the identifier to which this template name refers.

void Profile(llvm::FoldingSetNodeID &ID)

Represents a template specialization type whose template cannot be resolved, e.g.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Internal representation of canonical, dependent typeof(expr) types.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Internal representation of canonical, dependent __underlying_type(type) types.

void Profile(llvm::FoldingSetNodeID &ID)

Represents a vector type where either the type or size is dependent.

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context)

Concrete class used by the front-end to report problems and issues.

DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)

Issue the message to the client.

unsigned getCustomDiagID(Level L, const char(&FormatString)[N])

Return an ID for a diagnostic with the specified format string and level.

Wrap a function effect's condition expression in another struct so that FunctionProtoType's TrailingO...

Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...

void Profile(llvm::FoldingSetNodeID &ID)

bool isScoped() const

Returns true if this is a C++11 scoped enumeration.

bool isComplete() const

Returns true if this can be considered a complete type.

QualType getIntegerType() const

Return the integer type this enum decl corresponds to.

EnumDecl * getInstantiatedFromMemberEnum() const

Returns the enumeration (declared within the template) from which this enumeration type was instantia...

A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.

EnumDecl * getDecl() const

This represents one expression.

Expr * IgnoreParenCasts() LLVM_READONLY

Skip past any parentheses and casts which might surround this expression until reaching a fixed point...

bool isValueDependent() const

Determines whether the value of this expression depends on.

ExprValueKind getValueKind() const

getValueKind - The value kind that this expression produces.

bool isTypeDependent() const

Determines whether the type of this expression depends on.

FieldDecl * getSourceBitField()

If this expression refers to a bit-field, retrieve the declaration of that bit-field.

@ NPC_ValueDependentIsNull

Specifies that a value-dependent expression of integral or dependent type should be considered a null...

bool isInstantiationDependent() const

Whether this expression is instantiation-dependent, meaning that it depends in some way on.

bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const

Expr * IgnoreImpCasts() LLVM_READONLY

Skip past any implicit casts which might surround this expression until reaching a fixed point.

NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const

isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.

std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const

isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.

static ExprValueKind getValueKindForType(QualType T)

getValueKindForType - Given a formal return or parameter type, give its value kind.

We can encode up to four bits in the low bits of a type pointer, but there are many more type qualifi...

void Profile(llvm::FoldingSetNodeID &ID) const

ExtVectorType - Extended vector type.

Declaration context for names declared as extern "C" in C++.

static ExternCContextDecl * Create(const ASTContext &C, TranslationUnitDecl *TU)

Abstract interface for external sources of AST nodes.

virtual ExtKind hasExternalDefinitions(const Decl *D)

virtual void ReadComments()

Loads comment ranges.

virtual void CompleteRedeclChain(const Decl *D)

Gives the external AST source an opportunity to complete the redeclaration chain for a declaration.

virtual void PrintStats()

Print any statistics that have been gathered regarding the external AST source.

Represents a member of a struct/union/class.

bool isBitField() const

Determines whether this field is a bitfield.

unsigned getBitWidthValue() const

Computes the bit width of this field, if this is a bit field.

unsigned getFieldIndex() const

Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...

const RecordDecl * getParent() const

Returns the parent of this field declaration, which is the struct in which this field is defined.

static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)

An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...

Represents a function declaration or definition.

bool isMultiVersion() const

True if this function is considered a multiversioned function.

unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const

Returns a value indicating whether this function corresponds to a builtin function.

bool isInlined() const

Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...

bool isMSExternInline() const

The combination of the extern and inline keywords under MSVC forces the function to be required.

TemplateSpecializationKind getTemplateSpecializationKind() const

Determine what kind of template instantiation this function represents.

bool isUserProvided() const

True if this method is user-declared and was not deleted or defaulted on its first declaration.

FunctionDecl * getInstantiatedFromMemberFunction() const

If this function is an instantiation of a member function of a class template specialization,...

bool isInlineDefinitionExternallyVisible() const

For an inline function definition in C, or for a gnu_inline function in C++, determine whether the de...

static FunctionEffectSet getIntersection(FunctionEffectsRef LHS, FunctionEffectsRef RHS)

static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)

Represents an abstract function effect, using just an enumeration describing its kind.

An immutable set of FunctionEffects and possibly conditions attached to them.

ArrayRef< EffectConditionExpr > conditions() const

Represents a K&R-style 'int foo()' function, which has no information available about its arguments.

void Profile(llvm::FoldingSetNodeID &ID)

Represents a prototype with parameter type info, e.g.

ExtParameterInfo getExtParameterInfo(unsigned I) const

ExceptionSpecificationType getExceptionSpecType() const

Get the kind of exception specification on this function.

unsigned getNumParams() const

QualType getParamType(unsigned i) const

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)

bool hasExceptionSpec() const

Return whether this function has any kind of exception spec.

bool isVariadic() const

Whether this function prototype is variadic.

ExtProtoInfo getExtProtoInfo() const

ArrayRef< QualType > getParamTypes() const

ArrayRef< ExtParameterInfo > getExtParameterInfos() const

bool hasExtParameterInfos() const

Is there any interesting extra information for any of the parameters of this function type?

Declaration of a template function.

A class which abstracts out some details necessary for making a call.

CallingConv getCC() const

bool getNoCfCheck() const

unsigned getRegParm() const

bool getNoCallerSavedRegs() const

ExtInfo withNoReturn(bool noReturn) const

bool getHasRegParm() const

bool getProducesResult() const

Interesting information about a specific parameter that can't simply be reflected in parameter's type...

ExtParameterInfo withIsNoEscape(bool NoEscape) const

FunctionType - C99 6.7.5.3 - Function Declarators.

ExtInfo getExtInfo() const

QualType getReturnType() const

GlobalDecl - represents a global declaration.

unsigned getMultiVersionIndex() const

CXXDtorType getDtorType() const

const Decl * getDecl() const

QualType getWrappedType() const

const Attributes & getAttrs() const

QualType getContainedType() const

void Profile(llvm::FoldingSetNodeID &ID)

One of these records is kept for each identifier that is lexed.

unsigned getLength() const

Efficiently return the length of this identifier info.

StringRef getName() const

Return the actual identifier string.

Implements an efficient mapping from strings to IdentifierInfo nodes.

IdentifierInfo & get(StringRef Name)

Return the identifier token info for the specified named identifier.

Describes a module import declaration, which makes the contents of the named module visible in the cu...

Represents a C array with an unspecified size.

void Profile(llvm::FoldingSetNodeID &ID)

The injected class name of a C++ class template or class template partial specialization.

static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)

@ Relative

Components in the vtable are relative offsets between the vtable and the other structs/functions.

@ Pointer

Components in the vtable are pointers to other structs/functions.

An lvalue reference type, per C++11 [dcl.ref].

@ Swift

Interoperability with the latest known version of the Swift runtime.

@ Swift4_2

Interoperability with the Swift 4.2 runtime.

@ Swift4_1

Interoperability with the Swift 4.1 runtime.

@ Integer

Permit vector bitcasts between integer vectors with different numbers of elements but the same total ...

@ All

Permit vector bitcasts between all vectors with the same total bit-width.

Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...

std::optional< TargetCXXABI::Kind > CXXABI

C++ ABI to compile with, if specified by the frontend through -fc++-abi=.

clang::ObjCRuntime ObjCRuntime

CoreFoundationABI CFRuntime

CommentOptions CommentOpts

Options for parsing comments.

std::string CUID

The user provided compilation unit ID, if non-empty.

static void Profile(llvm::FoldingSetNodeID &ID, Parts P)

Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.

MangleContext - Context for tracking state which persists across multiple calls to the C++ name mangl...

Keeps track of the mangled names of lambda expressions and block literals within a particular context...

QualType getElementType() const

Returns type of the elements being stored in the matrix.

static bool isValidElementType(QualType T)

Valid elements types are the following:

A pointer to member type per C++ 8.3.3 - Pointers to members.

void Profile(llvm::FoldingSetNodeID &ID)

QualType getPointeeType() const

const Type * getClass() const

Provides information a specialization of a member of a class template, which may be a member function...

static MicrosoftMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)

Describes a module or submodule.

bool isNamedModule() const

Does this Module is a named module of a standard named module?

This represents a decl that may have a name.

IdentifierInfo * getIdentifier() const

Get the identifier that names this declaration, if there is one.

bool isPlaceholderVar(const LangOptions &LangOpts) const

DeclarationName getDeclName() const

Get the actual, stored name of the declaration, which may be a special name.

std::string getNameAsString() const

Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...

bool isExternallyVisible() const

NamespaceDecl * getNamespace()

Retrieve the namespace declaration aliased by this directive.

Represent a C++ namespace.

static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)

Represents a C++ nested name specifier, such as "\::std::vector<int>::".

bool isDependent() const

Whether this nested name specifier refers to a dependent type or not.

SpecifierKind getKind() const

Determine what kind of nested name specifier is stored.

static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)

Builds a specifier combining a prefix and an identifier.

NamespaceAliasDecl * getAsNamespaceAlias() const

Retrieve the namespace alias stored in this nested name specifier.

IdentifierInfo * getAsIdentifier() const

Retrieve the identifier stored in this nested name specifier.

NestedNameSpecifier * getPrefix() const

Return the prefix of this nested name specifier.

@ NamespaceAlias

A namespace alias, stored as a NamespaceAliasDecl*.

@ TypeSpec

A type, stored as a Type*.

@ TypeSpecWithTemplate

A type that was preceded by the 'template' keyword, stored as a Type*.

@ Super

Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.

@ Identifier

An identifier, stored as an IdentifierInfo*.

@ Global

The global specifier '::'. There is no stored value.

@ Namespace

A namespace, stored as a NamespaceDecl*.

NamespaceDecl * getAsNamespace() const

Retrieve the namespace stored in this nested name specifier.

const Type * getAsType() const

Retrieve the type stored in this nested name specifier.

NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.

static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)

Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...

ObjCCategoryDecl - Represents a category declaration.

ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.

ObjCContainerDecl - Represents a container for method declarations.

ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...

Represents an ObjC class declaration.

ObjCTypeParamList * getTypeParamList() const

Retrieve the type parameters of this class.

static ObjCInterfaceDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation atLoc, const IdentifierInfo *Id, ObjCTypeParamList *typeParamList, ObjCInterfaceDecl *PrevDecl, SourceLocation ClassLoc=SourceLocation(), bool isInternal=false)

bool hasDefinition() const

Determine whether this class has been defined.

bool ClassImplementsProtocol(ObjCProtocolDecl *lProto, bool lookupCategory, bool RHSIsQualifiedID=false)

ClassImplementsProtocol - Checks that 'lProto' protocol has been implemented in IDecl class,...

StringRef getObjCRuntimeNameAsString() const

Produce a name to be used for class's metadata.

ObjCImplementationDecl * getImplementation() const

ObjCInterfaceDecl * getCanonicalDecl() override

Retrieves the canonical declaration of this Objective-C class.

ObjCInterfaceDecl * getSuperClass() const

bool isSuperClassOf(const ObjCInterfaceDecl *I) const

isSuperClassOf - Return true if this class is the specified class or is a super class of the specifie...

known_extensions_range known_extensions() const

Interfaces are the core concept in Objective-C for object oriented design.

ObjCInterfaceDecl * getDecl() const

Get the declaration of this interface.

ObjCIvarDecl - Represents an ObjC instance variable.

ObjCIvarDecl * getNextIvar()

ObjCMethodDecl - Represents an instance or class method declaration.

ObjCDeclQualifier getObjCDeclQualifier() const

unsigned param_size() const

param_const_iterator param_end() const

param_const_iterator param_begin() const

const ParmVarDecl *const * param_const_iterator

Selector getSelector() const

bool isInstanceMethod() const

QualType getReturnType() const

Represents a pointer to an Objective C object.

bool isObjCQualifiedClassType() const

True if this is equivalent to 'Class.

const ObjCObjectPointerType * stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const

Strip off the Objective-C "kindof" type and (with it) any protocol qualifiers.

bool isObjCQualifiedIdType() const

True if this is equivalent to 'id.

void Profile(llvm::FoldingSetNodeID &ID)

const ObjCObjectType * getObjectType() const

Gets the type pointed to by this ObjC pointer.

bool isObjCIdType() const

True if this is equivalent to the 'id' type, i.e.

QualType getPointeeType() const

Gets the type pointed to by this ObjC pointer.

ObjCInterfaceDecl * getInterfaceDecl() const

If this pointer points to an Objective @interface type, gets the declaration for that interface.

const ObjCInterfaceType * getInterfaceType() const

If this pointer points to an Objective C @interface type, gets the type for that interface.

bool isObjCClassType() const

True if this is equivalent to the 'Class' type, i.e.

A class providing a concrete implementation of ObjCObjectType, so as to not increase the footprint of...

void Profile(llvm::FoldingSetNodeID &ID)

Represents a class type in Objective C.

bool isKindOfTypeAsWritten() const

Whether this is a "__kindof" type as written.

bool isSpecialized() const

Determine whether this object type is "specialized", meaning that it has type arguments.

ArrayRef< QualType > getTypeArgsAsWritten() const

Retrieve the type arguments of this object type as they were written.

bool isObjCQualifiedClass() const

QualType getBaseType() const

Gets the base type of this object type.

bool isKindOfType() const

Whether this ia a "__kindof" type (semantically).

bool isObjCQualifiedId() const

ArrayRef< QualType > getTypeArgs() const

Retrieve the type arguments of this object type (semantically).

bool isObjCUnqualifiedId() const

ObjCInterfaceDecl * getInterface() const

Gets the interface declaration for this object type, if the base type really is an interface.

QualType getSuperClassType() const

Retrieve the type of the superclass of this object type.

Represents one property declaration in an Objective-C interface.

bool isReadOnly() const

isReadOnly - Return true iff the property has a setter.

static ObjCPropertyDecl * findPropertyDecl(const DeclContext *DC, const IdentifierInfo *propertyID, ObjCPropertyQueryKind queryKind)

Lookup a property by name in the specified DeclContext.

SetterKind getSetterKind() const

getSetterKind - Return the method used for doing assignment in the property setter.

Selector getSetterName() const

Selector getGetterName() const

ObjCPropertyAttribute::Kind getPropertyAttributes() const

ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...

ObjCIvarDecl * getPropertyIvarDecl() const

Represents an Objective-C protocol declaration.

protocol_range protocols() const

unsigned getNumProtocols() const

Return the number of qualifying protocols in this type, or 0 if there are none.

qual_iterator qual_end() const

qual_iterator qual_begin() const

bool isGNUFamily() const

Is this runtime basically of the GNU family of runtimes?

Represents the declaration of an Objective-C type parameter.

ObjCTypeParamVariance getVariance() const

Determine the variance of this type parameter.

Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...

Represents a type parameter type in Objective C.

void Profile(llvm::FoldingSetNodeID &ID)

A structure for storing the information associated with an overloaded template name.

Represents a C++11 pack expansion that produces a sequence of expressions.

Represents a pack expansion of types.

void Profile(llvm::FoldingSetNodeID &ID)

void Profile(llvm::FoldingSetNodeID &ID)

Sugar for parentheses used when specifying types.

void Profile(llvm::FoldingSetNodeID &ID)

void clear()

Clear parent maps.

Represents a parameter to a function.

ObjCDeclQualifier getObjCDeclQualifier() const

QualType getOriginalType() const

ParsedAttr - Represents a syntactic attribute.

void Profile(llvm::FoldingSetNodeID &ID)

PointerType - C99 6.7.5.1 - Pointer Declarators.

QualType getPointeeType() const

void Profile(llvm::FoldingSetNodeID &ID)

Engages in a tight little dance with the lexer to efficiently preprocess tokens.

A (possibly-)qualified type.

bool isVolatileQualified() const

Determine whether this type is volatile-qualified.

bool isTriviallyCopyableType(const ASTContext &Context) const

Return true if this is a trivially copyable type (C++0x [basic.types]p9)

Qualifiers::GC getObjCGCAttr() const

Returns gc attribute of this type.

bool hasQualifiers() const

Determine whether this type has any qualifiers.

QualType withConst() const

bool hasLocalQualifiers() const

Determine whether this particular QualType instance has any qualifiers, without looking through any t...

bool isNull() const

Return true if this QualType doesn't point to a type yet.

const Type * getTypePtr() const

Retrieves a pointer to the underlying (unqualified) type.

LangAS getAddressSpace() const

Return the address space of this type.

Qualifiers getQualifiers() const

Retrieve the set of qualifiers applied to this type.

Qualifiers::ObjCLifetime getObjCLifetime() const

Returns lifetime attribute of this type.

QualType getCanonicalType() const

QualType getUnqualifiedType() const

Retrieve the unqualified variant of the given type, removing as little sugar as possible.

SplitQualType split() const

Divides a QualType into its unqualified type and a set of local qualifiers.

bool isConstQualified() const

Determine whether this type is const-qualified.

DestructionKind isDestructedType() const

Returns a nonzero value if objects of this type require non-trivial work to clean up after.

const Type * getTypePtrOrNull() const

static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)

PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const

Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...

Qualifiers getLocalQualifiers() const

Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...

Represents a template name as written in source code.

void Profile(llvm::FoldingSetNodeID &ID)

A qualifier set is used to build a set of qualifiers.

const Type * strip(QualType type)

Collect any qualifiers on the given type and return an unqualified type.

The collection of all-type qualifiers we support.

unsigned getCVRQualifiers() const

void removeCVRQualifiers(unsigned mask)

void addAddressSpace(LangAS space)

static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R)

Returns the common set of qualifiers while removing them from the given sets.

@ OCL_Strong

Assigning into this object requires the old value to be released and the new value to be retained.

@ OCL_ExplicitNone

This object can be modified without requiring retains or releases.

@ OCL_None

There is no lifetime qualification on this type.

@ OCL_Weak

Reading or writing from this object requires a barrier call.

@ OCL_Autoreleasing

Assigning into this object requires a lifetime extension.

void removeObjCLifetime()

bool hasNonFastQualifiers() const

Return true if the set contains any qualifiers which require an ExtQuals node to be allocated.

void addConsistentQualifiers(Qualifiers qs)

Add the qualifiers from the given set to this set, given that they don't conflict.

void removeFastQualifiers(unsigned mask)

bool hasUnaligned() const

bool hasAddressSpace() const

static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)

Returns true if address space A is equal to or a superset of B.

unsigned getFastQualifiers() const

void removeAddressSpace()

void setAddressSpace(LangAS space)

bool hasObjCGCAttr() const

uint64_t getAsOpaqueValue() const

bool hasObjCLifetime() const

ObjCLifetime getObjCLifetime() const

void addObjCGCAttr(GC type)

LangAS getAddressSpace() const

An rvalue reference type, per C++11 [dcl.ref].

Represents a struct/union/class.

bool hasFlexibleArrayMember() const

field_range fields() const

static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)

virtual void completeDefinition()

Note that the definition of this type is now complete.

RecordDecl * getDefinition() const

Returns the RecordDecl that actually defines this struct/union/class.

A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...

RecordDecl * getDecl() const

decl_type * getFirstDecl()

Return the first declaration of this declaration or itself if this is the only declaration.

decl_type * getPreviousDecl()

Return the previous declaration of this declaration or NULL if this is the first declaration.

decl_type * getMostRecentDecl()

Returns the most recent (re)declaration of this declaration.

redecl_range redecls() const

Returns an iterator range for all the redeclarations of the same decl.

Base for LValueReferenceType and RValueReferenceType.

QualType getPointeeType() const

void Profile(llvm::FoldingSetNodeID &ID)

This table allows us to fully hide how we implement multi-keyword caching.

std::string getAsString() const

Derive the full selector name (e.g.

Encodes a location in the source.

bool isValid() const

Return true if this is a valid SourceLocation object.

This class handles loading and caching of source files into memory.

DiagnosticsEngine & getDiagnostics() const

StringRef getBufferData(FileID FID, bool *Invalid=nullptr) const

Return a StringRef to the source buffer data for the specified FileID.

SourceLocation getSpellingLoc(SourceLocation Loc) const

Given a SourceLocation object, return the spelling location referenced by the ID.

unsigned getLineNumber(FileID FID, unsigned FilePos, bool *Invalid=nullptr) const

Given a SourceLocation, return the spelling line number for the position indicated.

bool isInSystemHeader(SourceLocation Loc) const

Returns if a SourceLocation is in a system header.

std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const

Decompose the specified location into a raw FileID + Offset pair.

SourceLocation getExpansionLoc(SourceLocation Loc) const

Given a SourceLocation object Loc, return the expansion location referenced by the ID.

A trivial tuple used to represent a source range.

SourceLocation getBegin() const

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const

Produce a unique representation of the given statement.

The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.

StringLiteral - This represents a string literal expression, e.g.

static StringLiteral * Create(const ASTContext &Ctx, StringRef Str, StringLiteralKind Kind, bool Pascal, QualType Ty, const SourceLocation *Loc, unsigned NumConcatenated)

This is the "fully general" constructor that allows representation of strings formed from multiple co...

A structure for storing an already-substituted template template parameter pack.

Decl * getAssociatedDecl() const

A template-like entity which owns the whole pattern being substituted.

void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context)

TemplateTemplateParmDecl * getParameterPack() const

Retrieve the template template parameter pack being substituted.

TemplateArgument getArgumentPack() const

Retrieve the template template argument pack with which this parameter was substituted.

unsigned getIndex() const

Returns the index of the replaced parameter in the associated declaration.

A structure for storing the information associated with a substituted template template parameter.

void Profile(llvm::FoldingSetNodeID &ID)

TemplateTemplateParmDecl * getParameter() const

Represents the result of substituting a set of types for a template type parameter pack.

void Profile(llvm::FoldingSetNodeID &ID)

Represents the result of substituting a type for a template type parameter.

void Profile(llvm::FoldingSetNodeID &ID)

Represents the declaration of a struct/union/class/enum.

TypedefNameDecl * getTypedefNameForAnonDecl() const

void startDefinition()

Starts the definition of this tag declaration.

TagDecl * getDecl() const

bool isMicrosoft() const

Is this ABI an MSVC-compatible ABI?

Kind

The basic C++ ABI kind.

static Kind getKind(StringRef Name)

Exposes information about the current target.

TargetOptions & getTargetOpts() const

Retrieve the target options.

const llvm::Triple & getTriple() const

Returns the target triple of the primary target.

IntType getInt64Type() const

unsigned getMaxAtomicInlineWidth() const

Return the maximum width lock-free atomic operation which can be inlined given the supported features...

virtual LangAS getCUDABuiltinAddressSpace(unsigned AS) const

Map from the address space field in builtin description strings to the language address space.

virtual LangAS getOpenCLBuiltinAddressSpace(unsigned AS) const

Map from the address space field in builtin description strings to the language address space.

unsigned getDefaultAlignForAttributeAligned() const

Return the default alignment for attribute((aligned)) on this target, to be used if no alignment valu...

unsigned getBFloat16Width() const

getBFloat16Width/Align/Format - Return the size/align/format of '__bf16'.

BuiltinVaListKind

The different kinds of __builtin_va_list types defined by the target implementation.

@ AArch64ABIBuiltinVaList

__builtin_va_list as defined by the AArch64 ABI http://infocenter.arm.com/help/topic/com....

@ PNaClABIBuiltinVaList

__builtin_va_list as defined by the PNaCl ABI: http://www.chromium.org/nativeclient/pnacl/bitcode-abi...

@ PowerABIBuiltinVaList

__builtin_va_list as defined by the Power ABI: https://www.power.org /resources/downloads/Power-Arch-...

@ AAPCSABIBuiltinVaList

__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com

@ CharPtrBuiltinVaList

typedef char* __builtin_va_list;

@ VoidPtrBuiltinVaList

typedef void* __builtin_va_list;

@ X86_64ABIBuiltinVaList

__builtin_va_list as defined by the x86-64 ABI: http://refspecs.linuxbase.org/elf/x86_64-abi-0....

virtual uint64_t getNullPointerValue(LangAS AddrSpace) const

Get integer value for null pointer.

uint64_t getPointerWidth(LangAS AddrSpace) const

Return the width of pointers on this target, for the specified address space.

static bool isTypeSigned(IntType T)

Returns true if the type is signed; false otherwise.

unsigned getHalfAlign() const

unsigned getBFloat16Align() const

virtual std::optional< std::pair< unsigned, unsigned > > getVScaleRange(const LangOptions &LangOpts, bool IsArmStreamingFunction) const

Returns target-specific min and max values VScale_Range.

FloatModeKind getRealTypeByWidth(unsigned BitWidth, FloatModeKind ExplicitType) const

Return floating point type with specified width.

virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const

Return integer type with specified width.

unsigned getHalfWidth() const

getHalfWidth/Align/Format - Return the size/align/format of 'half'.

unsigned getMaxAlignedAttribute() const

Get the maximum alignment in bits for a static variable with aligned attribute.

virtual unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const

getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...

unsigned getTargetAddressSpace(LangAS AS) const

unsigned getFloat128Width() const

getFloat128Width/Align/Format - Return the size/align/format of '__float128'.

const llvm::fltSemantics & getLongDoubleFormat() const

TargetCXXABI getCXXABI() const

Get the C++ ABI currently in use.

bool hasAArch64SVETypes() const

Returns whether or not the AArch64 SVE built-in types are available on this target.

bool useAddressSpaceMapMangling() const

Specify if mangling based on address space map should be used or not for language specific address sp...

unsigned getLongWidth() const

getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...

unsigned getFloat128Align() const

virtual bool hasBFloat16Type() const

Determine whether the _BFloat16 type is supported on this target.

const llvm::fltSemantics & getFloat128Format() const

unsigned getLongDoubleWidth() const

getLongDoubleWidth/Align/Format - Return the size/align/format of 'long double'.

unsigned getLongDoubleAlign() const

llvm::StringMap< bool > FeatureMap

The map of which features have been enabled disabled based on the command line.

A convenient class for passing around template argument information.

SourceLocation getRAngleLoc() const

llvm::ArrayRef< TemplateArgumentLoc > arguments() const

SourceLocation getLAngleLoc() const

A template argument list.

ArrayRef< TemplateArgument > asArray() const

Produce this as an array ref.

Location wrapper for a TemplateArgument.

Represents a template argument.

QualType getStructuralValueType() const

Get the type of a StructuralValue.

QualType getParamTypeForDecl() const

Expr * getAsExpr() const

Retrieve the template argument as an expression.

std::optional< unsigned > getNumTemplateExpansions() const

Retrieve the number of expansions that a template template argument expansion will produce,...

QualType getAsType() const

Retrieve the type for a type template argument.

QualType getNullPtrType() const

Retrieve the type for null non-type template argument.

static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)

Create a new template argument pack by copying the given set of template arguments.

TemplateName getAsTemplate() const

Retrieve the template name for a template name argument.

bool structurallyEquals(const TemplateArgument &Other) const

Determines whether two template arguments are superficially the same.

QualType getIntegralType() const

Retrieve the type of the integral value.

bool getIsDefaulted() const

If returns 'true', this TemplateArgument corresponds to a default template parameter.

ValueDecl * getAsDecl() const

Retrieve the declaration for a declaration non-type template argument.

ArrayRef< TemplateArgument > pack_elements() const

Iterator range referencing all of the elements of a template argument pack.

@ Declaration

The template argument is a declaration that was provided for a pointer, reference,...

@ Template

The template argument is a template name that was provided for a template template parameter.

@ StructuralValue

The template argument is a non-type template argument that can't be represented by the special-case D...

@ Pack

The template argument is actually a parameter pack.

@ TemplateExpansion

The template argument is a pack expansion of a template name that was provided for a template templat...

@ NullPtr

The template argument is a null pointer or null pointer to member that was provided for a non-type te...

@ Type

The template argument is a type.

@ Null

Represents an empty template argument, e.g., one that has not been deduced.

@ Integral

The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...

@ Expression

The template argument is an expression, and we've not resolved it to one of the other forms yet,...

ArgKind getKind() const

Return the kind of stored template argument.

TemplateName getAsTemplateOrTemplatePattern() const

Retrieve the template argument as a template name; if the argument is a pack expansion,...

const APValue & getAsStructuralValue() const

Get the value of a StructuralValue.

The base class of all kinds of template declarations (e.g., class, function, etc.).

TemplateParameterList * getTemplateParameters() const

Get the list of template parameters.

Represents a C++ template name within the type system.

TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const

Retrieve the underlying template declaration that this template name refers to, if known.

DependentTemplateName * getAsDependentTemplateName() const

Retrieve the underlying dependent template name structure, if any.

void * getAsVoidPointer() const

Retrieve the template name as a void pointer.

@ UsingTemplate

A template name that refers to a template declaration found through a specific using shadow declarati...

@ OverloadedTemplate

A set of overloaded template declarations.

@ Template

A single template declaration.

@ DependentTemplate

A dependent template name that has not been resolved to a template (or set of templates).

@ SubstTemplateTemplateParm

A template template parameter that has been substituted for some other template name.

@ SubstTemplateTemplateParmPack

A template template parameter pack that has been substituted for a template template argument pack,...

@ DeducedTemplate

A template name that refers to another TemplateName with deduced default arguments.

@ QualifiedTemplate

A qualified template name, where the qualification is kept to describe the source code as written.

@ AssumedTemplate

An unqualified-id that has been assumed to name a function template that will be found by ADL.

A template parameter object.

static void Profile(llvm::FoldingSetNodeID &ID, QualType T, const APValue &V)

Stores a list of template parameters for a TemplateDecl and its derived classes.

NamedDecl * getParam(unsigned Idx)

static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)

NamedDecl *const * const_iterator

Iterates through the template parameters in this list.

Expr * getRequiresClause()

The constraint-expression of the associated requires-clause.

ArrayRef< NamedDecl * > asArray()

unsigned getNumArgs() const

void setArgLocInfo(unsigned i, TemplateArgumentLocInfo AI)

void setTemplateKeywordLoc(SourceLocation Loc)

void setTemplateNameLoc(SourceLocation Loc)

void setLAngleLoc(SourceLocation Loc)

void setRAngleLoc(SourceLocation Loc)

Represents a type template specialization; the template must be a class template, a type alias templa...

void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)

TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.

unsigned getPosition() const

Get the position of the template parameter within its parameter list.

bool isParameterPack() const

Whether this template template parameter is a template parameter pack.

unsigned getIndex() const

Get the index of the template parameter within its parameter list.

unsigned getDepth() const

Get the nesting depth of the template parameter.

bool isExpandedParameterPack() const

Whether this parameter is a template template parameter pack that has a known list of different templ...

static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, bool Typename, TemplateParameterList *Params)

Declaration of a template type parameter.

static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, std::optional< unsigned > NumExpanded=std::nullopt)

void Profile(llvm::FoldingSetNodeID &ID)

Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...

ConceptDecl * getNamedConcept() const

Expr * getImmediatelyDeclaredConstraint() const

Get the immediately-declared constraint expression introduced by this type-constraint,...

ConceptReference * getConceptReference() const

Represents a declaration of a type.

void setTypeForDecl(const Type *TD)

const Type * getTypeForDecl() const

T castAs() const

Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.

static unsigned getFullDataSizeForType(QualType Ty)

Returns the size of type source info data block for the given type.

void initialize(ASTContext &Context, SourceLocation Loc) const

Initializes this to state that every location in this type is the given location.

Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...

Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...

A container of type source information.

TypeLoc getTypeLoc() const

Return the TypeLoc wrapper for the type source info.

The base class of the type hierarchy.

CXXRecordDecl * getAsCXXRecordDecl() const

Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...

bool isBlockPointerType() const

bool isBooleanType() const

bool isFunctionReferenceType() const

bool isObjCBuiltinType() const

QualType getRVVEltType(const ASTContext &Ctx) const

Returns the representative type for the element of an RVV builtin type.

const RecordType * getAsUnionType() const

NOTE: getAs*ArrayType are methods on ASTContext.

bool isIncompleteArrayType() const

bool isPlaceholderType() const

Test for a type which does not represent an actual type-system type but is instead used as a placehol...

bool isSignedIntegerType() const

Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...

bool isConstantArrayType() const

bool hasIntegerRepresentation() const

Determine whether this type has an integer representation of some sort, e.g., it is an integer type o...

bool isConstantSizeType() const

Return true if this is not a variable sized type, according to the rules of C99 6....

QualType getLocallyUnqualifiedSingleStepDesugaredType() const

Pull a single level of sugar off of this locally-unqualified type.

bool isFunctionPointerType() const

bool isPointerType() const

bool isArrayParameterType() const

bool isIntegerType() const

isIntegerType() does not include complex integers (a GCC extension).

const T * castAs() const

Member-template castAs<specific type>.

bool isSpecificPlaceholderType(unsigned K) const

Test for a specific placeholder type.

bool isSignedFixedPointType() const

Return true if this is a fixed point type that is signed according to ISO/IEC JTC1 SC22 WG14 N1169.

bool isEnumeralType() const

bool isSveVLSBuiltinType() const

Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...

bool isObjCQualifiedIdType() const

QualType getPointeeType() const

If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.

bool isIntegralOrEnumerationType() const

Determine whether this type is an integral or enumeration type.

bool hasUnsignedIntegerRepresentation() const

Determine whether this type has an unsigned integer representation of some sort, e....

QualType getSveEltType(const ASTContext &Ctx) const

Returns the representative type for the element of an SVE builtin type.

AutoType * getContainedAutoType() const

Get the AutoType whose type will be deduced for a variable with an initializer of this type.

bool isInstantiationDependentType() const

Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...

bool isBitIntType() const

bool isSpecificBuiltinType(unsigned K) const

Test for a particular builtin type.

bool isBuiltinType() const

Helper methods to distinguish type categories.

bool isDependentType() const

Whether this type is a dependent type, meaning that its definition somehow depends on a template para...

bool isFixedPointType() const

Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.

bool isSaturatedFixedPointType() const

Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.

bool containsUnexpandedParameterPack() const

Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...

bool hasSignedIntegerRepresentation() const

Determine whether this type has an signed integer representation of some sort, e.g....

QualType getCanonicalTypeInternal() const

const Type * getBaseElementTypeUnsafe() const

Get the base element type of this type, potentially discarding type qualifiers.

bool isMemberPointerType() const

bool isObjCIdType() const

bool isUnsaturatedFixedPointType() const

Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.

const ArrayType * getAsArrayTypeUnsafe() const

A variant of getAs<> for array types which silently discards qualifiers from the outermost type.

bool isIncompleteType(NamedDecl **Def=nullptr) const

Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...

bool isFunctionType() const

bool isObjCObjectPointerType() const

bool isUnsignedFixedPointType() const

Return true if this is a fixed point type that is unsigned according to ISO/IEC JTC1 SC22 WG14 N1169.

bool isVectorType() const

bool isObjCClassType() const

bool isRVVVLSBuiltinType() const

Determines if this is a sizeless type supported by the 'riscv_rvv_vector_bits' type attribute,...

bool isRVVSizelessBuiltinType() const

Returns true for RVV scalable vector types.

bool isUnsignedIntegerType() const

Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...

bool isAnyPointerType() const

TypeClass getTypeClass() const

bool isCanonicalUnqualified() const

Determines if this type would be canonical if it had no further qualification.

const T * getAs() const

Member-template getAs<specific type>'.

const Type * getUnqualifiedDesugaredType() const

Return the specified type with any "sugar" removed from the type, removing any typedefs,...

bool isNullPtrType() const

bool isRecordType() const

bool isObjCRetainableType() const

std::optional< NullabilityKind > getNullability() const

Determine the nullability of the given type.

Represents the declaration of a typedef-name via the 'typedef' type specifier.

static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)

Base class for declarations which introduce a typedef-name.

QualType getUnderlyingType() const

void setTypeSourceInfo(TypeSourceInfo *newType)

void Profile(llvm::FoldingSetNodeID &ID)

A unary type transform, which is a type constructed from another.

An artificial decl, representing a global anonymous constant value which is uniquified by value withi...

static void Profile(llvm::FoldingSetNodeID &ID, QualType Ty, const APValue &APVal)

The iterator over UnresolvedSets.

Represents the dependent type named by a dependently-scoped typename using declaration,...

Represents a dependent using declaration which was marked with typename.

Represents a C++ using-enum-declaration.

Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...

void Profile(llvm::FoldingSetNodeID &ID)

Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...

void setType(QualType newType)

bool isWeak() const

Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.

Represents a variable declaration or definition.

VarTemplateDecl * getDescribedVarTemplate() const

Retrieves the variable template that is described by this variable declaration.

bool isOutOfLine() const override

Determine whether this is or was instantiated from an out-of-line definition of a static data member.

bool isStaticDataMember() const

Determines whether this is a static data member.

bool isStaticLocal() const

Returns true if a variable with function scope is a static local variable.

VarDecl * getInstantiatedFromStaticDataMember() const

If this variable is an instantiated static data member of a class template specialization,...

bool isInline() const

Whether this variable is (C++1z) inline.

@ DeclarationOnly

This declaration is only a declaration.

DefinitionKind hasDefinition(ASTContext &) const

Check whether this variable is defined in this translation unit.

TemplateSpecializationKind getTemplateSpecializationKind() const

If this variable is an instantiation of a variable template or a static data member of a class templa...

Represents a C array with a specified size that is not an integer-constant-expression.

Expr * getSizeExpr() const

Represents a GCC generic vector type.

unsigned getNumElements() const

void Profile(llvm::FoldingSetNodeID &ID)

VectorKind getVectorKind() const

QualType getElementType() const

Holds all information required to evaluate constexpr code in a module.

Defines the Linkage enumeration and various utility functions.

Defines the clang::TargetInfo interface.

const internal::VariadicAllOfMatcher< Attr > attr

Matches attributes.

SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)

Returns the results of matching Matcher on Node.

const internal::VariadicAllOfMatcher< Type > type

Matches Types in the clang AST.

const AstTypeMatcher< ArrayType > arrayType

Matches all kinds of arrays.

const AstTypeMatcher< TagType > tagType

Matches tag types (record and enum types).

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

OverloadedOperatorKind

Enumeration specifying the different kinds of C++ overloaded operators.

GVALinkage

A more specific kind of linkage than enum Linkage.

@ GVA_AvailableExternally

AutoTypeKeyword

Which keyword(s) were used to create an AutoType.

OpenCLTypeKind

OpenCL type kinds.

FunctionType::ExtInfo getFunctionExtInfo(const Type &t)

bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)

NullabilityKind

Describes the nullability of a particular type.

@ Nullable

Values of this type can be null.

@ Unspecified

Whether values of this type can be null is (explicitly) unspecified.

@ NonNull

Values of this type can never be null.

@ ICIS_NoInit

No in-class initializer.

CXXABI * CreateMicrosoftCXXABI(ASTContext &Ctx)

@ Vector

'vector' clause, allowed on 'loop', Combined, and 'routine' directives.

@ Self

'self' clause, allowed on Compute and Combined Constructs, plus 'update'.

TypeOfKind

The kind of 'typeof' expression we're after.

CXXABI * CreateItaniumCXXABI(ASTContext &Ctx)

Creates an instance of a C++ ABI class.

const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)

Insertion operator for diagnostics.

Linkage

Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.

@ External

External linkage, which indicates that the entity can be referred to from other translation units.

@ Result

The result type of a method or function.

ArraySizeModifier

Capture whether this is a normal array (e.g.

bool isComputedNoexcept(ExceptionSpecificationType ESpecType)

SubstTemplateTypeParmTypeFlag

TagTypeKind

The kind of a tag type.

@ Interface

The "__interface" keyword.

@ Struct

The "struct" keyword.

@ Class

The "class" keyword.

bool isDiscardableGVALinkage(GVALinkage L)

BuiltinTemplateKind

Kinds of BuiltinTemplateDecl.

@ BTK__type_pack_element

This names the __type_pack_element BuiltinTemplateDecl.

@ BTK__builtin_common_type

This names the __builtin_common_type BuiltinTemplateDecl.

@ BTK__make_integer_seq

This names the __make_integer_seq BuiltinTemplateDecl.

LangAS

Defines the address space values used by the address space qualifier of QualType.

TranslationUnitKind

Describes the kind of translation unit being processed.

bool isPtrSizeAddressSpace(LangAS AS)

ExprValueKind

The categorization of expression values, currently following the C++11 scheme.

@ VK_PRValue

A pr-value expression (in the C++11 taxonomy) produces a temporary value.

@ VK_XValue

An x-value expression is a reference to an object with independent storage but which can be "moved",...

@ VK_LValue

An l-value expression is a reference to an object with independent storage.

const FunctionProtoType * T

void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)

Print a template argument list, including the '<' and '>' enclosing the template arguments.

bool declaresSameEntity(const Decl *D1, const Decl *D2)

Determine whether two declarations declare the same entity.

TemplateSpecializationKind

Describes the kind of template specialization that a particular template specialization declaration r...

@ TSK_ExplicitInstantiationDefinition

This template specialization was instantiated from a template due to an explicit instantiation defini...

@ TSK_ExplicitInstantiationDeclaration

This template specialization was instantiated from a template due to an explicit instantiation declar...

@ TSK_ExplicitSpecialization

This template specialization was declared or defined by an explicit specialization (C++ [temp....

@ TSK_ImplicitInstantiation

This template specialization was implicitly instantiated from a template.

@ TSK_Undeclared

This template specialization was formed from a template-id but has not yet been declared,...

CallingConv

CallingConv - Specifies the calling convention that a function uses.

@ Invariant

The parameter is invariant: must match exactly.

@ Contravariant

The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...

@ Covariant

The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...

@ AltiVecBool

is AltiVec 'vector bool ...'

@ SveFixedLengthData

is AArch64 SVE fixed-length data vector

@ AltiVecPixel

is AltiVec 'vector Pixel'

@ Generic

not a target-specific vector type

@ RVVFixedLengthData

is RISC-V RVV fixed-length data vector

@ RVVFixedLengthMask

is RISC-V RVV fixed-length mask vector

@ SveFixedLengthPredicate

is AArch64 SVE fixed-length predicate vector

LangAS getLangASFromTargetAS(unsigned TargetAS)

@ None

The alignment was not explicit in code.

@ RequiredByEnum

The alignment comes from an alignment attribute on a enum type.

@ RequiredByTypedef

The alignment comes from an alignment attribute on a typedef.

@ RequiredByRecord

The alignment comes from an alignment attribute on a record type.

ElaboratedTypeKeyword

The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...

@ None

No keyword precedes the qualified type name.

@ Enum

The "enum" keyword introduces the elaborated-type-specifier.

@ Typename

The "typename" keyword precedes the qualified type name, e.g., typename T::type.

ExceptionSpecificationType

The various types of exception specifications that exist in C++11.

@ EST_DependentNoexcept

noexcept(expression), value-dependent

@ EST_DynamicNone

throw()

@ EST_Uninstantiated

not instantiated yet

@ EST_Unparsed

not parsed yet

@ EST_NoThrow

Microsoft __declspec(nothrow) extension.

@ EST_None

no exception specification

@ EST_MSAny

Microsoft throw(...) extension.

@ EST_BasicNoexcept

noexcept

@ EST_NoexceptFalse

noexcept(expression), evals to 'false'

@ EST_Unevaluated

not evaluated yet, for special member function

@ EST_NoexceptTrue

noexcept(expression), evals to 'true'

@ EST_Dynamic

throw(T1, T2)

Diagnostic wrappers for TextAPI types for error reporting.

unsigned NumTemplateArgs

The number of template arguments in TemplateArgs.

Copy initialization expr of a __block variable and a boolean flag that indicates whether the expressi...

Expr * getCopyExpr() const

DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...

ArrayRef< TemplateArgument > Args

Holds information about the various types of exception specification.

ExceptionSpecificationType Type

The kind of exception specification this is.

ArrayRef< QualType > Exceptions

Explicitly-specified list of exception types.

Expr * NoexceptExpr

Noexcept expression, if this is a computed noexcept specification.

Extra information about a function prototype.

ExceptionSpecInfo ExceptionSpec

bool requiresFunctionProtoTypeArmAttributes() const

FunctionEffectsRef FunctionEffects

const ExtParameterInfo * ExtParameterInfos

RefQualifierKind RefQualifier

unsigned HasTrailingReturn

bool requiresFunctionProtoTypeExtraBitfields() const

FunctionType::ExtInfo ExtInfo

A simple holder for a QualType representing a type in an exception specification.

A holder for Arm type attributes as described in the Arm C/C++ Language extensions which are not part...

A lazy value (of type T) that is within an AST node of type Owner, where the value might change in la...

Parts of a decomposed MSGuidDecl.

Contains information gathered from parsing the contents of TargetAttr.

Describes how types, statements, expressions, and declarations should be printed.

A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...

const Type * Ty

The locally-unqualified type.

Qualifiers Quals

The local qualifiers.

A this pointer adjustment.

IntType

===-— Target Data Type Query Methods ----------------------------—===//

AlignRequirementKind AlignRequirement

AlignRequirementKind AlignRequirement

static bool isEqual(const FoldingSetNodeID &LHS, const FoldingSetNodeID &RHS)

static FoldingSetNodeID getTombstoneKey()

static FoldingSetNodeID getEmptyKey()

static unsigned getHashValue(const FoldingSetNodeID &Val)


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4