clang: lib/Serialization/ASTReaderDecl.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

57#include "llvm/ADT/DenseMap.h"

58#include "llvm/ADT/FoldingSet.h"

59#include "llvm/ADT/SmallPtrSet.h"

60#include "llvm/ADT/SmallVector.h"

61#include "llvm/ADT/iterator_range.h"

62#include "llvm/Bitstream/BitstreamReader.h"

63#include "llvm/Support/ErrorHandling.h"

64#include "llvm/Support/SaveAndRestore.h"

65#include

66#include

67#include

68#include

69#include

70#include

71

72using namespace clang;

74

75

76

77

78

79namespace {

80

81class RedeclarableResult {

82 Decl *MergeWith;

83 GlobalDeclID FirstID;

84 bool IsKeyDecl;

85

86public:

87 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID, bool IsKeyDecl)

88 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}

89

90

91 GlobalDeclID getFirstID() const { return FirstID; }

92

93

94 bool isKeyDecl() const { return IsKeyDecl; }

95

96

97

98 Decl *getKnownMergeTarget() const { return MergeWith; }

99};

100}

101

105

106public:

108

110 unsigned Number);

111

112

113

114

115

116 template

119

120 template

122 RedeclarableResult &Redecl) {

124 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() : GlobalDeclID());

125 }

126

129

131 struct CXXRecordDecl::DefinitionData &&NewDD);

133 struct ObjCInterfaceDecl::DefinitionData &&NewDD);

135 struct ObjCProtocolDecl::DefinitionData &&NewDD);

136};

137}

138

139

140

141

142

148 ASTReader::RecordLocation Loc;

151

153

154 TypeID DeferredTypeID = 0;

155 unsigned AnonymousDeclNumber = 0;

158

159

160

161

162 bool IsDeclMarkedUsed = false;

163

164 uint64_t GetCurrentCursorOffset();

165

166 uint64_t ReadLocalOffset() {

167 uint64_t LocalOffset = Record.readInt();

168 assert(LocalOffset < Loc.Offset && "offset point after current record");

169 return LocalOffset ? Loc.Offset - LocalOffset : 0;

170 }

171

172 uint64_t ReadGlobalOffset() {

173 uint64_t Local = ReadLocalOffset();

174 return Local ? Record.getGlobalBitOffset(Local) : 0;

175 }

176

177 SourceLocation readSourceLocation() { return Record.readSourceLocation(); }

178

179 SourceRange readSourceRange() { return Record.readSourceRange(); }

180

181 TypeSourceInfo *readTypeSourceInfo() { return Record.readTypeSourceInfo(); }

182

183 GlobalDeclID readDeclID() { return Record.readDeclID(); }

184

185 std::string readString() { return Record.readString(); }

186

187 Decl *readDecl() { return Record.readDecl(); }

188

189 template T *readDeclAs() { return Record.readDeclAs<T>(); }

190

192 if (Record.getIdx() == Record.size())

193 return 0;

194

195 return Record.getGlobalSubmoduleID(Record.readInt());

196 }

197

198 Module *readModule() { return Record.getSubmodule(readSubmoduleID()); }

199

201 Decl *LambdaContext = nullptr,

202 unsigned IndexInLambdaContext = 0);

203 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data,

205 unsigned IndexInLambdaContext);

206 void ReadObjCDefinitionData(struct ObjCInterfaceDecl::DefinitionData &Data);

207 void ReadObjCDefinitionData(struct ObjCProtocolDecl::DefinitionData &Data);

208

210

215

216

217

218

219

222

223

224

225

226

227

228 class FindExistingResult {

232 bool AddResult = false;

233 unsigned AnonymousDeclNumber = 0;

235

236 public:

237 FindExistingResult(ASTReader &Reader) : Reader(Reader) {}

238

240 unsigned AnonymousDeclNumber,

242 : Reader(Reader), New(New), Existing(Existing), AddResult(true),

243 AnonymousDeclNumber(AnonymousDeclNumber),

244 TypedefNameForLinkage(TypedefNameForLinkage) {}

245

246 FindExistingResult(FindExistingResult &&Other)

248 AddResult(Other.AddResult),

249 AnonymousDeclNumber(Other.AnonymousDeclNumber),

250 TypedefNameForLinkage(Other.TypedefNameForLinkage) {

251 Other.AddResult = false;

252 }

253

254 FindExistingResult &operator=(FindExistingResult &&) = delete;

255 ~FindExistingResult();

256

257

258

259 void suppress() { AddResult = false; }

260

261 operator NamedDecl *() const { return Existing; }

262

263 template operator T *() const {

264 return dyn_cast_or_null(Existing);

265 }

266 };

267

270 FindExistingResult findExisting(NamedDecl *D);

271

272public:

274 ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID,

276 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),

277 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}

278

279 template

283

284 template

289 Decl *Canon);

290

293

294 template

298

299 template

302

304 llvm::BitstreamCursor &DeclsCursor, bool IsPartial);

305

308

310

313 Cat->NextClassCategory = Next;

314 }

315

338 RedeclarableResult

340

341 void

345

348 RedeclarableResult

350

354

384 void

413

416

418

419 template

421

422 template

424

426 RedeclarableResult &Redecl);

427

429

431

433

434

455};

456}

457

458namespace {

459

460

461

462template class MergedRedeclIterator {

463 DeclT *Start = nullptr;

464 DeclT *Canonical = nullptr;

465 DeclT *Current = nullptr;

466

467public:

468 MergedRedeclIterator() = default;

469 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}

470

471 DeclT *operator*() { return Current; }

472

473 MergedRedeclIterator &operator++() {

474 if (Current->isFirstDecl()) {

475 Canonical = Current;

476 Current = Current->getMostRecentDecl();

477 } else

478 Current = Current->getPreviousDecl();

479

480

481

482

483

484 if (Current == Start || Current == Canonical)

485 Current = nullptr;

486 return *this;

487 }

488

489 friend bool operator!=(const MergedRedeclIterator &A,

490 const MergedRedeclIterator &B) {

491 return A.Current != B.Current;

492 }

493};

494

495}

496

497template

498static llvm::iterator_range<MergedRedeclIterator>

500 return llvm::make_range(MergedRedeclIterator(D),

501 MergedRedeclIterator());

502}

503

504uint64_t ASTDeclReader::GetCurrentCursorOffset() {

505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;

506}

507

509 if (Record.readInt()) {

510 Reader.DefinitionSource[FD] =

512 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;

513 }

514 if (auto *CD = dyn_cast(FD)) {

515 CD->setNumCtorInitializers(Record.readInt());

516 if (CD->getNumCtorInitializers())

517 CD->CtorInitializers = ReadGlobalOffset();

518 }

519

520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();

521

523 Reader.ThisDeclarationWasADefinitionSet.insert(FD);

524}

525

528

529

530

532 IsDeclMarkedUsed = false;

533

534 if (auto *DD = dyn_cast(D)) {

535 if (auto *TInfo = DD->getTypeSourceInfo())

536 Record.readTypeLoc(TInfo->getTypeLoc());

537 }

538

539 if (auto *TD = dyn_cast(D)) {

540

542 assert(DeferredTypeID == 0 &&

543 "Deferred type not used for TagDecls and Typedefs");

544 else

545 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());

546

547

548

549 if (NamedDeclForTagDecl.isValid())

552 } else if (auto *ID = dyn_cast(D)) {

553

554 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();

555 } else if (auto *FD = dyn_cast(D)) {

556

557 if (Record.readInt())

559 } else if (auto *VD = dyn_cast(D)) {

561 } else if (auto *FD = dyn_cast(D)) {

562 if (FD->hasInClassInitializer() && Record.readInt()) {

563 FD->setLazyInClassInitializer(LazyDeclStmtPtr(GetCurrentCursorOffset()));

564 }

565 }

566}

567

570 auto ModuleOwnership =

574 IsDeclMarkedUsed |= D->Used;

577 bool HasStandaloneLexicalDC = DeclBits.getNextBit();

578 bool HasAttrs = DeclBits.getNextBit();

580 D->InvalidDecl = DeclBits.getNextBit();

582

585

586

587

588

589

590

591 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();

592 GlobalDeclID LexicalDCIDForTemplateParmDecl =

593 HasStandaloneLexicalDC ? readDeclID() : GlobalDeclID();

594 if (LexicalDCIDForTemplateParmDecl.isInvalid())

595 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;

596 Reader.addPendingDeclContextInfo(D,

597 SemaDCIDForTemplateParmDecl,

598 LexicalDCIDForTemplateParmDecl);

599 D->setDeclContext(Reader.getContext().getTranslationUnitDecl());

600 } else {

601 auto *SemaDC = readDeclAs();

602 auto *LexicalDC =

603 HasStandaloneLexicalDC ? readDeclAs() : nullptr;

604 if (!LexicalDC)

605 LexicalDC = SemaDC;

606

607

609 if (auto *RD = dyn_cast(SemaDC))

610 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);

611 else

612 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);

613

614

615 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,

616 Reader.getContext());

617 }

619

620 if (HasAttrs) {

622 Record.readAttributes(Attrs);

623

624

625 D->setAttrsImpl(Attrs, Reader.getContext());

626 }

627

628

629

630 bool ModulePrivate =

632 if (unsigned SubmoduleID = readSubmoduleID()) {

633 switch (ModuleOwnership) {

636 break;

641 break;

642 }

643

645

647

648 if (ModulePrivate) {

649

650

651 } else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {

652

653

655

658 else

659 Reader.HiddenNamesMap[Owner].push_back(D);

660 }

661 } else if (ModulePrivate) {

663 }

664}

665

670 std::string Arg = readString();

671 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());

672 D->getTrailingObjects()[Arg.size()] = '\0';

673}

674

678 std::string Name = readString();

679 memcpy(D->getTrailingObjects(), Name.data(), Name.size());

680 D->getTrailingObjects()[Name.size()] = '\0';

681

682 D->ValueStart = Name.size() + 1;

683 std::string Value = readString();

684 memcpy(D->getTrailingObjects() + D->ValueStart, Value.data(), Value.size());

685 D->getTrailingObjects()[D->ValueStart + Value.size()] = '\0';

686}

687

689 llvm_unreachable("Translation units are not serialized");

690}

691

694 ND->setDeclName(Record.readDeclarationName());

695 AnonymousDeclNumber = Record.readInt();

696}

697

701

703 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());

704}

705

710 if (Record.readInt()) {

711 QualType modedT = Record.readType();

713 } else

715

716

717

718

719 readDecl();

720 return Redecl;

721}

722

727

730 if (auto *Template = readDeclAs())

731

733 else

735}

736

740

742

751

752 switch (TagDeclBits.getNextBits(2)) {

753 case 0:

754 break;

755 case 1: {

756 auto *Info = new (Reader.getContext()) TagDecl::ExtInfo();

757 Record.readQualifierInfo(*Info);

758 TD->TypedefNameDeclOrQualifier = Info;

759 break;

760 }

761 case 2:

762 NamedDeclForTagDecl = readDeclID();

763 TypedefNameForLinkage = Record.readIdentifier();

764 break;

765 default:

766 llvm_unreachable("unexpected tag info kind");

767 }

768

771 return Redecl;

772}

773

778 else

781

783 ED->setNumPositiveBits(EnumDeclBits.getNextBits(8));

784 ED->setNumNegativeBits(EnumDeclBits.getNextBits(8));

788

789 ED->setHasODRHash(true);

790 ED->ODRHash = Record.readInt();

791

792

793

794 if (ED->isCompleteDefinition() && Reader.getContext().getLangOpts().Modules) {

796 if (!OldDef) {

797

798

800 if (!D->isFromASTFile() && D->isCompleteDefinition()) {

801 OldDef = D;

802 break;

803 }

804 }

805 }

806 if (OldDef) {

807 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));

809 Reader.mergeDefinitionVisibility(OldDef, ED);

810

811

814 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);

815 } else {

816 OldDef = ED;

817 }

818 }

819

820 if (auto *InstED = readDeclAs()) {

823 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);

825 }

826}

827

829 RedeclarableResult Redecl = VisitTagDecl(RD);

830

831 BitsUnpacker RecordDeclBits(Record.readInt());

847 return Redecl;

848}

849

852 RD->setODRHash(Record.readInt());

853

854

855

858 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];

859 if (!OldDef) {

860

861

863 if (!D->isFromASTFile() && D->isCompleteDefinition()) {

864 OldDef = D;

865 break;

866 }

867 }

868 }

869 if (OldDef) {

870 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));

872 Reader.mergeDefinitionVisibility(OldDef, RD);

874 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);

875 } else {

876 OldDef = RD;

877 }

878 }

879}

880

883

884

885

887 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());

888 else

889 VD->setType(Record.readType());

890}

891

894 if (Record.readInt())

896 ECD->setInitVal(Reader.getContext(), Record.readAPSInt());

898}

899

903 if (Record.readInt()) {

904 auto *Info = new (Reader.getContext()) DeclaratorDecl::ExtInfo();

905 Record.readQualifierInfo(*Info);

907 Record.readExpr(),

909 DD->DeclInfo = Info;

910 }

911 QualType TSIType = Record.readType();

913 TSIType.isNull() ? nullptr

914 : Reader.getContext().CreateTypeSourceInfo(TSIType));

915}

916

919

921

924 break;

927 break;

929 auto *Template = readDeclAs();

932 break;

933 }

935 auto *InstFD = readDeclAs();

938 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);

940 break;

941 }

943 auto *Template = readDeclAs();

945

946

948 Record.readTemplateArgumentList(TemplArgs, true);

949

950

952 bool HasTemplateArgumentsAsWritten = Record.readBool();

953 if (HasTemplateArgumentsAsWritten)

954 Record.readTemplateArgumentListInfo(TemplArgsWritten);

955

957

961

963 if (Record.readInt()) {

964 auto *FD = readDeclAs();

967

970 }

971

974 C, FD, Template, TSK, TemplArgList,

975 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr, POI,

976 MSInfo);

977 FD->TemplateOrSpecialization = FTInfo;

978

979 if (FD->isCanonicalDecl()) {

980

981

982 auto *CanonTemplate = readDeclAs();

983

984

985

986

987

988 llvm::FoldingSetNodeID ID;

990 void *InsertPos = nullptr;

993 CommonPtr->Specializations.FindNodeOrInsertPos(ID, InsertPos);

994 if (InsertPos)

995 CommonPtr->Specializations.InsertNode(FTInfo, InsertPos);

996 else {

997 assert(Reader.getContext().getLangOpts().Modules &&

998 "already deserialized this template specialization");

1000 }

1001 }

1002 break;

1003 }

1005

1007 unsigned NumCandidates = Record.readInt();

1008 while (NumCandidates--)

1009 Candidates.addDecl(readDeclAs());

1010

1011

1013 bool HasTemplateArgumentsAsWritten = Record.readBool();

1014 if (HasTemplateArgumentsAsWritten)

1015 Record.readTemplateArgumentListInfo(TemplArgsWritten);

1016

1018 Reader.getContext(), Candidates,

1019 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr);

1020

1021

1022 break;

1023 }

1024 }

1025

1027

1028

1029

1035

1036

1038 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});

1039 } else {

1040 FD->setType(Reader.GetType(DeferredTypeID));

1041 }

1042 DeferredTypeID = 0;

1043

1044 FD->DNLoc = Record.readDeclarationNameLoc(FD->getDeclName());

1046

1047

1048

1049 BitsUnpacker FunctionDeclBits(Record.readInt());

1050

1057

1058

1059

1060 const bool Pure = FunctionDeclBits.getNextBit();

1080

1081 FD->EndRangeLoc = readSourceLocation();

1084

1085 FD->ODRHash = Record.readInt();

1086 FD->setHasODRHash(true);

1087

1089

1090

1091

1092 if (auto Info = Record.readInt()) {

1093 bool HasMessage = Info & 2;

1096

1097 unsigned NumLookups = Record.readInt();

1099 for (unsigned I = 0; I != NumLookups; ++I) {

1103 }

1104

1107 Reader.getContext(), Lookups, DeletedMessage));

1108 }

1109 }

1110

1111 if (Existing)

1112 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);

1116

1117

1118 auto merge = [this, &Redecl, FD](auto &&F) {

1119 auto *Existing = cast_or_null(Redecl.getKnownMergeTarget());

1120 RedeclarableResult NewRedecl(Existing ? F(Existing) : nullptr,

1121 Redecl.getFirstID(), Redecl.isKeyDecl());

1123 };

1125 merge(

1127 else

1130 });

1131 } else

1133

1134

1135

1137

1138

1139 unsigned NumParams = Record.readInt();

1141 Params.reserve(NumParams);

1142 for (unsigned I = 0; I != NumParams; ++I)

1143 Params.push_back(readDeclAs());

1144 FD->setParams(Reader.getContext(), Params);

1145

1146

1147

1148

1149 if (FD->hasAttr()) {

1150 auto *SKEPAttr = FD->getAttr();

1152 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());

1153 if (SKI) {

1155 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict)

1156 << SKEPAttr;

1158 diag::note_previous_declaration);

1159 SKEPAttr->setInvalidAttr();

1160 }

1161 } else {

1162 C.registerSYCLEntryPointFunction(FD);

1163 }

1164 }

1165}

1166

1169 if (Record.readInt()) {

1170

1171

1172 Reader.PendingBodies[MD] = GetCurrentCursorOffset();

1173 }

1174 MD->setSelfDecl(readDeclAs());

1175 MD->setCmdDecl(readDeclAs());

1183

1187 Reader.getContext().setObjCMethodRedeclaration(MD,

1188 readDeclAs());

1189

1196 MD->DeclEndLoc = readSourceLocation();

1197 unsigned NumParams = Record.readInt();

1199 Params.reserve(NumParams);

1200 for (unsigned I = 0; I != NumParams; ++I)

1201 Params.push_back(readDeclAs());

1202

1204 unsigned NumStoredSelLocs = Record.readInt();

1206 SelLocs.reserve(NumStoredSelLocs);

1207 for (unsigned i = 0; i != NumStoredSelLocs; ++i)

1208 SelLocs.push_back(readSourceLocation());

1209

1210 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);

1211}

1212

1215

1216 D->Variance = Record.readInt();

1217 D->Index = Record.readInt();

1218 D->VarianceLoc = readSourceLocation();

1219 D->ColonLoc = readSourceLocation();

1220}

1221

1227

1229 unsigned numParams = Record.readInt();

1230 if (numParams == 0)

1231 return nullptr;

1232

1234 typeParams.reserve(numParams);

1235 for (unsigned i = 0; i != numParams; ++i) {

1236 auto *typeParam = readDeclAs();

1237 if (!typeParam)

1238 return nullptr;

1239

1240 typeParams.push_back(typeParam);

1241 }

1242

1245

1247 typeParams, rAngleLoc);

1248}

1249

1250void ASTDeclReader::ReadObjCDefinitionData(

1251 struct ObjCInterfaceDecl::DefinitionData &Data) {

1252

1253 Data.SuperClassTInfo = readTypeSourceInfo();

1254

1255 Data.EndLoc = readSourceLocation();

1256 Data.HasDesignatedInitializers = Record.readInt();

1258 Data.HasODRHash = true;

1259

1260

1261 unsigned NumProtocols = Record.readInt();

1263 Protocols.reserve(NumProtocols);

1264 for (unsigned I = 0; I != NumProtocols; ++I)

1265 Protocols.push_back(readDeclAs());

1267 ProtoLocs.reserve(NumProtocols);

1268 for (unsigned I = 0; I != NumProtocols; ++I)

1269 ProtoLocs.push_back(readSourceLocation());

1270 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),

1272

1273

1274 NumProtocols = Record.readInt();

1275 Protocols.clear();

1276 Protocols.reserve(NumProtocols);

1277 for (unsigned I = 0; I != NumProtocols; ++I)

1278 Protocols.push_back(readDeclAs());

1279 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,

1281}

1282

1284 ObjCInterfaceDecl *D, struct ObjCInterfaceDecl::DefinitionData &&NewDD) {

1285 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();

1286 if (DD.Definition == NewDD.Definition)

1287 return;

1288

1289 Reader.MergedDeclContexts.insert(

1290 std::make_pair(NewDD.Definition, DD.Definition));

1291 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);

1292

1293 if (D->getODRHash() != NewDD.ODRHash)

1294 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(

1295 {NewDD.Definition, &NewDD});

1296}

1297

1301 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());

1303

1305 if (Record.readInt()) {

1306

1307 ID->allocateDefinitionData();

1308

1309 ReadObjCDefinitionData(ID->data());

1311 if (Canon->Data.getPointer()) {

1312

1313

1314 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));

1315 ID->Data = Canon->Data;

1316 } else {

1317

1318

1319 ID->getCanonicalDecl()->Data = ID->Data;

1320

1321

1322 ID->setIvarList(nullptr);

1323 }

1324

1325

1326 Reader.PendingDefinitions.insert(ID);

1327

1328

1329 Reader.ObjCClassesLoaded.push_back(ID);

1330 } else {

1331 ID->Data = ID->getCanonicalDecl()->Data;

1332 }

1333}

1334

1338

1340 bool synth = Record.readInt();

1342

1343

1345 return;

1346

1347

1348

1350 return;

1355 if (PrevIvar && PrevIvar != IVD) {

1356 auto *ParentExt = dyn_cast(IVD->getDeclContext());

1357 auto *PrevParentExt =

1358 dyn_cast(PrevIvar->getDeclContext());

1359 if (ParentExt && PrevParentExt) {

1360

1361

1362 Reader

1363 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,

1364 PrevParentExt)]

1365 .push_back(std::make_pair(IVD, PrevIvar));

1366 } else if (ParentExt || PrevParentExt) {

1367

1368

1369

1370 Reader.Diag(IVD->getLocation(), diag::err_duplicate_ivar_declaration)

1371 << II;

1372 Reader.Diag(PrevIvar->getLocation(), diag::note_previous_definition);

1373 }

1374 }

1375}

1376

1377void ASTDeclReader::ReadObjCDefinitionData(

1378 struct ObjCProtocolDecl::DefinitionData &Data) {

1379 unsigned NumProtoRefs = Record.readInt();

1381 ProtoRefs.reserve(NumProtoRefs);

1382 for (unsigned I = 0; I != NumProtoRefs; ++I)

1383 ProtoRefs.push_back(readDeclAs());

1385 ProtoLocs.reserve(NumProtoRefs);

1386 for (unsigned I = 0; I != NumProtoRefs; ++I)

1387 ProtoLocs.push_back(readSourceLocation());

1388 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,

1389 ProtoLocs.data(), Reader.getContext());

1391 Data.HasODRHash = true;

1392}

1393

1395 ObjCProtocolDecl *D, struct ObjCProtocolDecl::DefinitionData &&NewDD) {

1396 struct ObjCProtocolDecl::DefinitionData &DD = D->data();

1397 if (DD.Definition == NewDD.Definition)

1398 return;

1399

1400 Reader.MergedDeclContexts.insert(

1401 std::make_pair(NewDD.Definition, DD.Definition));

1402 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);

1403

1404 if (D->getODRHash() != NewDD.ODRHash)

1405 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(

1406 {NewDD.Definition, &NewDD});

1407}

1408

1413

1414 if (Record.readInt()) {

1415

1416 PD->allocateDefinitionData();

1417

1418 ReadObjCDefinitionData(PD->data());

1419

1421 if (Canon->Data.getPointer()) {

1422

1423

1424 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));

1425 PD->Data = Canon->Data;

1426 } else {

1427

1428

1430 }

1431

1432 Reader.PendingDefinitions.insert(PD);

1433 } else {

1435 }

1436}

1437

1441

1447

1448

1449

1450

1451 Reader.CategoriesDeserialized.insert(CD);

1452

1453 CD->ClassInterface = readDeclAs();

1455 unsigned NumProtoRefs = Record.readInt();

1457 ProtoRefs.reserve(NumProtoRefs);

1458 for (unsigned I = 0; I != NumProtoRefs; ++I)

1459 ProtoRefs.push_back(readDeclAs());

1461 ProtoLocs.reserve(NumProtoRefs);

1462 for (unsigned I = 0; I != NumProtoRefs; ++I)

1463 ProtoLocs.push_back(readSourceLocation());

1464 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),

1465 Reader.getContext());

1466

1467

1468 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())

1471 Reader.getContext());

1472}

1473

1478

1501

1506

1509 D->CategoryNameLoc = readSourceLocation();

1510}

1511

1514 D->setSuperClass(readDeclAs());

1515 D->SuperLoc = readSourceLocation();

1520 D->NumIvarInitializers = Record.readInt();

1521 if (D->NumIvarInitializers)

1522 D->IvarInitializers = ReadGlobalOffset();

1523}

1524

1527 D->setAtLoc(readSourceLocation());

1529 D->PropertyIvarDecl = readDeclAs();

1530 D->IvarLoc = readSourceLocation();

1535}

1536

1539 FD->Mutable = Record.readInt();

1540

1541 unsigned Bits = Record.readInt();

1542 FD->StorageKind = Bits >> 1;

1543 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)

1546 else if (Bits & 1)

1548

1551 if (auto *Tmpl = readDeclAs())

1552 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);

1553 }

1555}

1556

1559 PD->GetterId = Record.readIdentifier();

1560 PD->SetterId = Record.readIdentifier();

1561}

1562

1565 D->PartVal.Part1 = Record.readInt();

1566 D->PartVal.Part2 = Record.readInt();

1567 D->PartVal.Part3 = Record.readInt();

1568 for (auto &C : D->PartVal.Part4And5)

1569 C = Record.readInt();

1570

1571

1572 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))

1573 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());

1574}

1575

1579 D->Value = Record.readAPValue();

1580

1581

1583 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))

1584 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());

1585}

1586

1589 D->Value = Record.readAPValue();

1590

1591

1592

1594 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))

1595 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());

1596}

1597

1600

1601 FD->ChainingSize = Record.readInt();

1602 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2");

1603 FD->Chaining = new (Reader.getContext())NamedDecl*[FD->ChainingSize];

1604

1605 for (unsigned I = 0; I != FD->ChainingSize; ++I)

1606 FD->Chaining[I] = readDeclAs();

1607

1609}

1610

1614

1617 bool DefGeneratedInModule = VarDeclBits.getNextBit();

1622 bool HasDeducedType = false;

1629

1636

1638 HasDeducedType = VarDeclBits.getNextBit();

1641

1644 }

1645

1646

1647

1648

1649 if (HasDeducedType)

1650 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});

1651 else

1652 VD->setType(Reader.GetType(DeferredTypeID));

1653 DeferredTypeID = 0;

1654

1656

1657

1661

1662 if (DefGeneratedInModule) {

1663 Reader.DefinitionSource[VD] =

1665 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;

1666 }

1667

1668 if (VD->hasAttr()) {

1669 Expr *CopyExpr = Record.readExpr();

1670 if (CopyExpr)

1671 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());

1672 }

1673

1674 enum VarKind {

1675 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization

1676 };

1677 switch ((VarKind)Record.readInt()) {

1678 case VarNotTemplate:

1679

1680

1684 break;

1686

1688 break;

1689 case StaticDataMemberSpecialization: {

1690 auto *Tmpl = readDeclAs();

1693 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);

1695 break;

1696 }

1697 }

1698

1699 return Redecl;

1700}

1701

1703 if (uint64_t Val = Record.readInt()) {

1711 Eval->Evaluated = Record.readAPValue();

1713 Reader.getContext().addDestruction(&Eval->Evaluated);

1714 }

1715

1716

1717

1718

1719 Eval->Value = GetCurrentCursorOffset();

1720 }

1721}

1722

1726

1729

1730 unsigned scopeIndex = Record.readInt();

1731 BitsUnpacker ParmVarDeclBits(Record.readInt());

1732 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();

1733 unsigned scopeDepth = ParmVarDeclBits.getNextBits(7);

1734 unsigned declQualifier = ParmVarDeclBits.getNextBits(7);

1735 if (isObjCMethodParam) {

1736 assert(scopeDepth == 0);

1738 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;

1739 } else {

1741 }

1743

1745 if (ParmVarDeclBits.getNextBit())

1747

1748 if (ParmVarDeclBits.getNextBit())

1749 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();

1750

1751

1752

1753}

1754

1757 auto **BDs = DD->getTrailingObjects();

1758 for (unsigned I = 0; I != DD->NumBindings; ++I) {

1759 BDs[I] = readDeclAs();

1760 BDs[I]->setDecomposedDecl(DD);

1761 }

1762}

1763

1766 BD->Binding = Record.readExpr();

1767}

1768

1774

1777 D->Statement = Record.readStmt();

1778}

1779

1782 BD->setBody(cast_or_null(Record.readStmt()));

1784 unsigned NumParams = Record.readInt();

1786 Params.reserve(NumParams);

1787 for (unsigned I = 0; I != NumParams; ++I)

1788 Params.push_back(readDeclAs());

1790

1796

1797 bool capturesCXXThis = Record.readInt();

1798 unsigned numCaptures = Record.readInt();

1800 captures.reserve(numCaptures);

1801 for (unsigned i = 0; i != numCaptures; ++i) {

1802 auto *decl = readDeclAs();

1803 unsigned flags = Record.readInt();

1804 bool byRef = (flags & 1);

1805 bool nested = (flags & 2);

1806 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);

1807

1809 }

1810 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);

1811}

1812

1814

1816 for (unsigned I = 0; I < D->NumParams; ++I)

1817 D->setParam(I, readDeclAs());

1818 D->setNothrow(Record.readInt() != 0);

1819 D->setBody(cast_or_null(Record.readStmt()));

1820}

1821

1824 unsigned ContextParamPos = Record.readInt();

1825 CD->setNothrow(Record.readInt() != 0);

1826

1827 for (unsigned I = 0; I < CD->NumParams; ++I) {

1828 if (I != ContextParamPos)

1829 CD->setParam(I, readDeclAs());

1830 else

1831 CD->setContextParam(I, readDeclAs());

1832 }

1833}

1834

1841

1844 D->RBraceLoc = readSourceLocation();

1845}

1846

1851

1855

1856 BitsUnpacker NamespaceDeclBits(Record.readInt());

1859 D->LocStart = readSourceLocation();

1860 D->RBraceLoc = readSourceLocation();

1861

1862

1863

1864

1865

1867 if (Redecl.getFirstID() == ThisDeclID)

1868 AnonNamespace = readDeclID();

1869

1871

1872 if (AnonNamespace.isValid()) {

1873

1874

1875

1877 if (!Record.isModule())

1879 }

1880}

1881

1886 D->IsCBuffer = Record.readBool();

1887 D->KwLoc = readSourceLocation();

1888 D->LBraceLoc = readSourceLocation();

1889 D->RBraceLoc = readSourceLocation();

1890}

1891

1895 D->NamespaceLoc = readSourceLocation();

1896 D->IdentLoc = readSourceLocation();

1897 D->QualifierLoc = Record.readNestedNameSpecifierLoc();

1898 D->Namespace = readDeclAs();

1900}

1901

1905 D->QualifierLoc = Record.readNestedNameSpecifierLoc();

1906 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());

1907 D->FirstUsingShadow.setPointer(readDeclAs());

1909 if (auto *Pattern = readDeclAs())

1910 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);

1912}

1913

1917 D->setEnumLoc(readSourceLocation());

1918 D->setEnumType(Record.readTypeSourceInfo());

1919 D->FirstUsingShadow.setPointer(readDeclAs());

1920 if (auto *Pattern = readDeclAs())

1921 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);

1923}

1924

1927 D->InstantiatedFrom = readDeclAs();

1928 auto **Expansions = D->getTrailingObjects();

1929 for (unsigned I = 0; I != D->NumExpansions; ++I)

1930 Expansions[I] = readDeclAs();

1932}

1933

1937 D->Underlying = readDeclAs();

1939 D->UsingOrNextShadow = readDeclAs();

1940 auto *Pattern = readDeclAs();

1941 if (Pattern)

1942 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);

1944}

1945

1949 D->NominatedBaseClassShadowDecl = readDeclAs();

1950 D->ConstructedBaseClassShadowDecl = readDeclAs();

1951 D->IsVirtual = Record.readInt();

1952}

1953

1956 D->UsingLoc = readSourceLocation();

1957 D->NamespaceLoc = readSourceLocation();

1958 D->QualifierLoc = Record.readNestedNameSpecifierLoc();

1959 D->NominatedNamespace = readDeclAs();

1960 D->CommonAncestor = readDeclAs();

1961}

1962

1966 D->QualifierLoc = Record.readNestedNameSpecifierLoc();

1967 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());

1968 D->EllipsisLoc = readSourceLocation();

1970}

1971

1975 D->TypenameLocation = readSourceLocation();

1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();

1977 D->EllipsisLoc = readSourceLocation();

1979}

1980

1985

1986void ASTDeclReader::ReadCXXDefinitionData(

1987 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,

1988 Decl *LambdaContext, unsigned IndexInLambdaContext) {

1989

1991

1992#define FIELD(Name, Width, Merge) \

1993 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \

1994 CXXRecordDeclBits.updateValue(Record.readInt()); \

1995 Data.Name = CXXRecordDeclBits.getNextBits(Width);

1996

1997#include "clang/AST/CXXRecordDeclDefinitionBits.def"

1998#undef FIELD

1999

2000

2002 Data.HasODRHash = true;

2003

2004 if (Record.readInt()) {

2005 Reader.DefinitionSource[D] =

2006 Loc.F->Kind == ModuleKind::MK_MainFile ||

2008 }

2009

2010 Record.readUnresolvedSet(Data.Conversions);

2011 Data.ComputedVisibleConversions = Record.readInt();

2012 if (Data.ComputedVisibleConversions)

2013 Record.readUnresolvedSet(Data.VisibleConversions);

2014 assert(Data.Definition && "Data.Definition should be already set!");

2015

2016 if (Data.IsLambda) {

2017 assert(!LambdaContext && !IndexInLambdaContext &&

2018 "given lambda context for non-lambda");

2019

2021 if (Data.NumBases)

2022 Data.Bases = ReadGlobalOffset();

2023

2025 if (Data.NumVBases)

2026 Data.VBases = ReadGlobalOffset();

2027

2029 } else {

2030 using Capture = LambdaCapture;

2031

2032 auto &Lambda = static_cast<CXXRecordDecl::LambdaDefinitionData &>(Data);

2033

2034 BitsUnpacker LambdaBits(Record.readInt());

2035 Lambda.DependencyKind = LambdaBits.getNextBits(2);

2036 Lambda.IsGenericLambda = LambdaBits.getNextBit();

2037 Lambda.CaptureDefault = LambdaBits.getNextBits(2);

2038 Lambda.NumCaptures = LambdaBits.getNextBits(15);

2039 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();

2040

2041 Lambda.NumExplicitCaptures = Record.readInt();

2042 Lambda.ManglingNumber = Record.readInt();

2043 if (unsigned DeviceManglingNumber = Record.readInt())

2044 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;

2045 Lambda.IndexInContext = IndexInLambdaContext;

2046 Lambda.ContextDecl = LambdaContext;

2047 Capture *ToCapture = nullptr;

2048 if (Lambda.NumCaptures) {

2049 ToCapture = (Capture *)Reader.getContext().Allocate(sizeof(Capture) *

2050 Lambda.NumCaptures);

2051 Lambda.AddCaptureList(Reader.getContext(), ToCapture);

2052 }

2053 Lambda.MethodTyInfo = readTypeSourceInfo();

2054 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {

2055 SourceLocation Loc = readSourceLocation();

2056 BitsUnpacker CaptureBits(Record.readInt());

2057 bool IsImplicit = CaptureBits.getNextBit();

2059 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(3));

2060 switch (Kind) {

2064 new (ToCapture)

2065 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());

2066 ToCapture++;

2067 break;

2070 auto *Var = readDeclAs();

2071 SourceLocation EllipsisLoc = readSourceLocation();

2072 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);

2073 ToCapture++;

2074 break;

2075 }

2076 }

2077 }

2078}

2079

2081 CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&MergeDD) {

2082 assert(D->DefinitionData &&

2083 "merging class definition into non-definition");

2084 auto &DD = *D->DefinitionData;

2085

2086 if (DD.Definition != MergeDD.Definition) {

2087

2088 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,

2089 DD.Definition));

2090 Reader.PendingDefinitions.erase(MergeDD.Definition);

2091 MergeDD.Definition->demoteThisDefinitionToDeclaration();

2092 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);

2093 assert(!Reader.Lookups.contains(MergeDD.Definition) &&

2094 "already loaded pending lookups for merged definition");

2095 }

2096

2097 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);

2098 if (PFDI != Reader.PendingFakeDefinitionData.end() &&

2099 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {

2100

2101

2102 assert(!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?");

2103 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;

2104

2105

2106

2107 auto *Def = DD.Definition;

2108 DD = std::move(MergeDD);

2109 DD.Definition = Def;

2110 for (auto *D : Def->redecls())

2112 return;

2113 }

2114

2115 bool DetectedOdrViolation = false;

2116

2117 #define FIELD(Name, Width, Merge) Merge(Name)

2118 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;

2119 #define NO_MERGE(Field) \

2120 DetectedOdrViolation |= DD.Field != MergeDD.Field; \

2121 MERGE_OR(Field)

2122 #include "clang/AST/CXXRecordDeclDefinitionBits.def"

2124 #undef NO_MERGE

2125 #undef MERGE_OR

2126

2127 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)

2128 DetectedOdrViolation = true;

2129

2130

2131

2132

2133

2134 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {

2135 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);

2136 DD.ComputedVisibleConversions = true;

2137 }

2138

2139

2140

2141

2142 if (DD.IsLambda) {

2143 auto &Lambda1 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(DD);

2144 auto &Lambda2 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(MergeDD);

2145 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;

2146 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;

2147 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;

2148 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;

2149 DetectedOdrViolation |=

2150 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;

2151 DetectedOdrViolation |=

2152 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;

2153 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;

2154

2155 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {

2156 for (unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {

2157 LambdaCapture &Cap1 = Lambda1.Captures.front()[I];

2158 LambdaCapture &Cap2 = Lambda2.Captures.front()[I];

2160 }

2161 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());

2162 }

2163 }

2164

2165

2167 return;

2168

2169 if (D->getODRHash() != MergeDD.ODRHash) {

2170 DetectedOdrViolation = true;

2171 }

2172

2173 if (DetectedOdrViolation)

2174 Reader.PendingOdrMergeFailures[DD.Definition].push_back(

2175 {MergeDD.Definition, &MergeDD});

2176}

2177

2178void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,

2179 Decl *LambdaContext,

2180 unsigned IndexInLambdaContext) {

2181 struct CXXRecordDecl::DefinitionData *DD;

2183

2184

2185

2186 bool IsLambda = Record.readInt();

2187 assert(!(IsLambda && Update) &&

2188 "lambda definition should not be added by update record");

2189 if (IsLambda)

2190 DD = new (C) CXXRecordDecl::LambdaDefinitionData(

2192 else

2193 DD = new (C) struct CXXRecordDecl::DefinitionData(D);

2194

2196

2197

2198

2199 if (!Canon->DefinitionData)

2200 Canon->DefinitionData = DD;

2201 D->DefinitionData = Canon->DefinitionData;

2202 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);

2203

2204

2206

2207

2208

2209

2210 if (Canon->DefinitionData != DD) {

2212 return;

2213 }

2214

2215

2216

2217

2218 if (Update || Canon != D)

2219 Reader.PendingDefinitions.insert(D);

2220}

2221

2224

2226

2227 enum CXXRecKind {

2228 CXXRecNotTemplate = 0,

2229 CXXRecTemplate,

2230 CXXRecMemberSpecialization,

2231 CXXLambda

2232 };

2233

2234 Decl *LambdaContext = nullptr;

2235 unsigned IndexInLambdaContext = 0;

2236

2237 switch ((CXXRecKind)Record.readInt()) {

2238 case CXXRecNotTemplate:

2239

2242 break;

2243 case CXXRecTemplate: {

2244

2245 auto *Template = readDeclAs();

2246 D->TemplateOrInstantiation = Template;

2247 break;

2248 }

2249 case CXXRecMemberSpecialization: {

2250 auto *RD = readDeclAs();

2255 D->TemplateOrInstantiation = MSI;

2257 break;

2258 }

2259 case CXXLambda: {

2260 LambdaContext = readDecl();

2261 if (LambdaContext)

2262 IndexInLambdaContext = Record.readInt();

2263 if (LambdaContext)

2264 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);

2265 else

2266

2267

2269 break;

2270 }

2271 }

2272

2273 bool WasDefinition = Record.readInt();

2274 if (WasDefinition)

2275 ReadCXXRecordDefinition(D, false, LambdaContext,

2276 IndexInLambdaContext);

2277 else

2278

2280

2281

2282

2283 if (WasDefinition) {

2286

2287

2288

2290 }

2291

2292 return Redecl;

2293}

2294

2296 D->setExplicitSpecifier(Record.readExplicitSpec());

2297 D->Ctor = readDeclAs();

2304 Record.readInt()));

2305}

2306

2309

2310 unsigned NumOverridenMethods = Record.readInt();

2312 while (NumOverridenMethods--) {

2313

2314

2315 if (auto *MD = readDeclAs())

2316 Reader.getContext().addOverriddenMethod(D, MD->getCanonicalDecl());

2317 }

2318 } else {

2319

2320

2321 Record.skipInts(NumOverridenMethods);

2322 }

2323}

2324

2326

2327

2330 auto *Shadow = readDeclAs();

2331 auto *Ctor = readDeclAs();

2334 }

2335

2337}

2338

2341

2344 if (auto *OperatorDelete = readDeclAs()) {

2345 auto *ThisArg = Record.readExpr();

2346

2348 C.addOperatorDeleteForVDtor(D, OperatorDelete,

2350 Canon->OperatorDeleteThisArg = ThisArg;

2351 }

2352 }

2353 if (auto *OperatorGlobDelete = readDeclAs()) {

2354 if (C.dtorHasOperatorDelete(D,

2356 C.addOperatorDeleteForVDtor(

2358 }

2359 if (auto *OperatorArrayDelete = readDeclAs()) {

2361 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,

2363 }

2364 if (auto *OperatorGlobArrayDelete = readDeclAs()) {

2365 if (C.dtorHasOperatorDelete(D,

2367 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,

2369 }

2370}

2371

2376

2379 D->ImportedModule = readModule();

2380 D->setImportComplete(Record.readInt());

2381 auto *StoredLocs = D->getTrailingObjects();

2382 for (unsigned I = 0, N = Record.back(); I != N; ++I)

2383 StoredLocs[I] = readSourceLocation();

2384 Record.skipInts(1);

2385}

2386

2391

2394 if (Record.readInt())

2395 D->Friend = readDeclAs();

2396 else

2397 D->Friend = readTypeSourceInfo();

2398 for (unsigned i = 0; i != D->NumTPLists; ++i)

2399 D->getTrailingObjects()[i] = Record.readTemplateParameterList();

2400 D->NextFriend = readDeclID().getRawValue();

2401 D->UnsupportedFriend = (Record.readInt() != 0);

2402 D->FriendLoc = readSourceLocation();

2403 D->EllipsisLoc = readSourceLocation();

2404}

2405

2408 unsigned NumParams = Record.readInt();

2409 D->NumParams = NumParams;

2411 for (unsigned i = 0; i != NumParams; ++i)

2412 D->Params[i] = Record.readTemplateParameterList();

2413 if (Record.readInt())

2414 D->Friend = readDeclAs();

2415 else

2416 D->Friend = readTypeSourceInfo();

2417 D->FriendLoc = readSourceLocation();

2418}

2419

2422

2423 assert(!D->TemplateParams && "TemplateParams already set!");

2424 D->TemplateParams = Record.readTemplateParameterList();

2425 D->init(readDeclAs());

2426}

2427

2433

2436

2437

2440 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)

2441 Args.push_back(Record.readTemplateArgument(false));

2443}

2444

2447

2449 llvm::BitstreamCursor &DeclsCursor,

2450 bool IsPartial) {

2451 uint64_t Offset = ReadLocalOffset();

2452 bool Failed =

2453 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);

2454 (void)Failed;

2455 assert(!Failed);

2456}

2457

2458RedeclarableResult

2461

2462

2463

2465 if (!CanonD->Common) {

2466 CanonD->Common = CanonD->newCommon(Reader.getContext());

2467 Reader.PendingDefinitions.insert(CanonD);

2468 }

2470

2471

2472

2473 if (ThisDeclID == Redecl.getFirstID()) {

2474 if (auto *RTD = readDeclAs()) {

2475 assert(RTD->getKind() == D->getKind() &&

2476 "InstantiatedFromMemberTemplate kind mismatch");

2478 if (Record.readInt())

2480 }

2481 }

2482

2485

2486 return Redecl;

2487}

2488

2492

2493 if (ThisDeclID == Redecl.getFirstID()) {

2494

2495

2496 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, false);

2498 }

2499}

2500

2502 llvm_unreachable("BuiltinTemplates are not serialized");

2503}

2504

2505

2506

2507

2511

2512 if (ThisDeclID == Redecl.getFirstID()) {

2513

2514

2515 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, false);

2517 }

2518}

2519

2523

2525 if (Decl *InstD = readDecl()) {

2526 if (auto *CTD = dyn_cast(InstD)) {

2527 D->SpecializedTemplate = CTD;

2528 } else {

2530 Record.readTemplateArgumentList(TemplArgs);

2533 auto *PS =

2535 SpecializedPartialSpecialization();

2536 PS->PartialSpecialization

2538 PS->TemplateArgs = ArgList;

2539 D->SpecializedTemplate = PS;

2540 }

2541 }

2542

2544 Record.readTemplateArgumentList(TemplArgs, true);

2546 D->PointOfInstantiation = readSourceLocation();

2548 D->StrictPackMatch = Record.readBool();

2549

2550 bool writtenAsCanonicalDecl = Record.readInt();

2551 if (writtenAsCanonicalDecl) {

2552 auto *CanonPattern = readDeclAs();

2553 if (D->isCanonicalDecl()) {

2554

2556 if (auto *Partial = dyn_cast(D)) {

2557 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations

2558 .GetOrInsertNode(Partial);

2559 } else {

2560 CanonSpec =

2561 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);

2562 }

2563

2564 if (CanonSpec != D) {

2565 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);

2566

2567

2568

2569 if (auto *DDD = D->DefinitionData) {

2570 if (CanonSpec->DefinitionData)

2571 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));

2572 else

2573 CanonSpec->DefinitionData = D->DefinitionData;

2574 }

2575 D->DefinitionData = CanonSpec->DefinitionData;

2576 }

2577 }

2578 }

2579

2580

2581 if (Record.readBool()) {

2584 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();

2585 D->ExplicitInfo = ExplicitInfo;

2586 }

2587

2588 if (Record.readBool())

2590

2591 return Redecl;

2592}

2593

2596

2597

2599 D->TemplateParams = Params;

2600

2602

2603

2604 if (ThisDeclID == Redecl.getFirstID()) {

2605 D->InstantiatedFromMember.setPointer(

2606 readDeclAs());

2607 D->InstantiatedFromMember.setInt(Record.readInt());

2608 }

2609}

2610

2613

2614 if (ThisDeclID == Redecl.getFirstID()) {

2615

2616 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, false);

2617 }

2618}

2619

2620

2621

2622

2623

2624

2628 if (Decl *InstD = readDecl()) {

2629 if (auto *VTD = dyn_cast(InstD)) {

2630 D->SpecializedTemplate = VTD;

2631 } else {

2633 Record.readTemplateArgumentList(TemplArgs);

2635 C, TemplArgs);

2636 auto *PS =

2637 new (C)

2638 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();

2639 PS->PartialSpecialization =

2641 PS->TemplateArgs = ArgList;

2642 D->SpecializedTemplate = PS;

2643 }

2644 }

2645

2646

2647 if (Record.readBool()) {

2650 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();

2651 D->ExplicitInfo = ExplicitInfo;

2652 }

2653

2654 if (Record.readBool())

2656

2658 Record.readTemplateArgumentList(TemplArgs, true);

2660 D->PointOfInstantiation = readSourceLocation();

2662 D->IsCompleteDefinition = Record.readInt();

2663

2665

2666 bool writtenAsCanonicalDecl = Record.readInt();

2667 if (writtenAsCanonicalDecl) {

2668 auto *CanonPattern = readDeclAs();

2669 if (D->isCanonicalDecl()) {

2671 if (auto *Partial = dyn_cast(D)) {

2672 CanonSpec = CanonPattern->getCommonPtr()

2673 ->PartialSpecializations.GetOrInsertNode(Partial);

2674 } else {

2675 CanonSpec =

2676 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);

2677 }

2678

2679 if (CanonSpec != D)

2680 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);

2681 }

2682 }

2683

2684 return Redecl;

2685}

2686

2687

2688

2689

2690

2691

2695 D->TemplateParams = Params;

2696

2698

2699

2700 if (ThisDeclID == Redecl.getFirstID()) {

2701 D->InstantiatedFromMember.setPointer(

2702 readDeclAs());

2703 D->InstantiatedFromMember.setInt(Record.readInt());

2704 }

2705}

2706

2709

2711

2712 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();

2713 if (TypeConstraintInitialized) {

2715 if (Record.readBool())

2716 CR = Record.readConceptReference();

2717 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();

2718 UnsignedOrNone ArgPackSubstIndex = Record.readUnsignedOrNone();

2719

2720 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);

2721 D->NumExpanded = Record.readUnsignedOrNone();

2722 }

2723

2724 if (Record.readInt())

2726 Record.readTemplateArgumentLoc());

2727}

2728

2731

2732 D->setDepth(Record.readInt());

2737 auto TypesAndInfos =

2738 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();

2740 new (&TypesAndInfos[I].first) QualType(Record.readType());

2741 TypesAndInfos[I].second = readTypeSourceInfo();

2742 }

2743 } else {

2744

2745 D->ParameterPack = Record.readInt();

2746 if (Record.readInt())

2748 Record.readTemplateArgumentLoc());

2749 }

2750}

2751

2754 D->ParameterKind = static_cast<TemplateNameKind>(Record.readInt());

2756

2757 D->setDepth(Record.readInt());

2760 auto **Data = D->getTrailingObjects();

2762 I != N; ++I)

2763 Data[I] = Record.readTemplateParameterList();

2764 } else {

2765

2766 D->ParameterPack = Record.readInt();

2767 if (Record.readInt())

2769 Record.readTemplateArgumentLoc());

2770 }

2771}

2772

2777

2780 D->AssertExprAndFailed.setPointer(Record.readExpr());

2781 D->AssertExprAndFailed.setInt(Record.readInt());

2782 D->Message = cast_or_null(Record.readExpr());

2783 D->RParenLoc = readSourceLocation();

2784}

2785

2789

2793 D->ExtendingDecl = readDeclAs();

2794 D->ExprWithTemporary = Record.readStmt();

2795 if (Record.readInt()) {

2798 }

2799 D->ManglingNumber = Record.readInt();

2801}

2802

2810

2811template

2814 Decl *MergeWith = nullptr;

2815

2816 bool IsKeyDecl = ThisDeclID == FirstDeclID;

2817 bool IsFirstLocalDecl = false;

2818

2819 uint64_t RedeclOffset = 0;

2820

2821

2822

2824 FirstDeclID = ThisDeclID;

2825 IsKeyDecl = true;

2826 IsFirstLocalDecl = true;

2827 } else if (unsigned N = Record.readInt()) {

2828

2829

2830 IsKeyDecl = N == 1;

2831 IsFirstLocalDecl = true;

2832

2833

2834

2835

2836

2837

2838 for (unsigned I = 0; I != N - 1; ++I)

2839 MergeWith = readDecl();

2840

2841 RedeclOffset = ReadLocalOffset();

2842 } else {

2843

2844

2845 (void)readDecl();

2846 }

2847

2848 auto *FirstDecl = cast_or_null(Reader.GetDecl(FirstDeclID));

2849 if (FirstDecl != D) {

2850

2851

2852

2853

2855 D->First = FirstDecl->getCanonicalDecl();

2856 }

2857

2858 auto *DAsT = static_cast<T *>(D);

2859

2860

2861

2862

2863

2864 if (IsFirstLocalDecl)

2865 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));

2866

2867 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);

2868}

2869

2870

2871

2872template

2874 RedeclarableResult &Redecl) {

2875

2876 if (!Reader.getContext().getLangOpts().Modules)

2877 return;

2878

2879

2881 return;

2882

2883 auto *D = static_cast<T *>(DBase);

2884

2885 if (auto *Existing = Redecl.getKnownMergeTarget())

2886

2887 MergeImpl.mergeRedeclarable(D, cast(Existing), Redecl);

2888 else if (FindExistingResult ExistingRes = findExisting(D))

2889 if (T *Existing = ExistingRes)

2890 MergeImpl.mergeRedeclarable(D, Existing, Redecl);

2891}

2892

2893

2894

2895

2896

2897

2898

2900 Decl &Context, unsigned IndexInContext) {

2901

2902 if (!Reader.getContext().getLangOpts().Modules)

2903 return;

2904

2905

2907 return;

2908

2909 if (auto *Existing = Redecl.getKnownMergeTarget())

2910

2912

2913

2914

2915 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{

2916 Context.getCanonicalDecl(), IndexInContext}];

2917 if (Slot)

2919 else

2920 Slot = D;

2921}

2922

2924 RedeclarableResult &Redecl) {

2926

2927

2928

2930}

2931

2932

2933

2934

2937 llvm_unreachable("bad assert_cast");

2938}

2939

2940

2941

2944 bool IsKeyDecl) {

2947 RedeclarableResult Result(

2948 ExistingPattern,

2949 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);

2950

2951 if (auto *DClass = dyn_cast(DPattern)) {

2952

2953

2954 auto *ExistingClass =

2956 if (auto *DDD = DClass->DefinitionData) {

2957 if (ExistingClass->DefinitionData) {

2959 } else {

2960 ExistingClass->DefinitionData = DClass->DefinitionData;

2961

2962

2963 Reader.PendingDefinitions.insert(DClass);

2964 }

2965 }

2966 DClass->DefinitionData = ExistingClass->DefinitionData;

2967

2970 }

2971 if (auto *DFunction = dyn_cast(DPattern))

2974 if (auto *DVar = dyn_cast(DPattern))

2976 if (auto *DAlias = dyn_cast(DPattern))

2979 llvm_unreachable("merged an unknown kind of redeclarable template");

2980}

2981

2982

2983

2984template

2987 auto *D = static_cast<T *>(DBase);

2988 T *ExistingCanon = Existing->getCanonicalDecl();

2990 if (ExistingCanon != DCanon) {

2991

2992

2993

2995 D->First = ExistingCanon;

2996 ExistingCanon->Used |= D->Used;

2997 D->Used = false;

2998

2999 bool IsKeyDecl = KeyDeclID.isValid();

3000

3001

3002 if (auto *DTemplate = dyn_cast(D))

3005 IsKeyDecl);

3006

3007

3008 if (IsKeyDecl)

3009 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);

3010 }

3011}

3012

3013

3014

3015

3016

3017

3019 if (!ND)

3020 return false;

3021

3023 return true;

3024 return false;

3025}

3026

3027

3028

3030

3031 if (!Reader.getContext().getLangOpts().Modules)

3032 return;

3033

3035

3037 Reader.LETemporaryForMerging[std::make_pair(

3040 Reader.getContext().setPrimaryMergedDecl(LETDecl,

3042 else

3044}

3045

3046

3047

3048

3049

3050template

3052

3053 if (!Reader.getContext().getLangOpts().Modules)

3054 return;

3055

3056

3057

3058

3059

3060 if (!Reader.getContext().getLangOpts().CPlusPlus &&

3062 return;

3063

3064 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))

3065 if (T *Existing = ExistingRes)

3066 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),

3067 Existing->getCanonicalDecl());

3068}

3069

3071 Record.readOMPChildren(D->Data);

3073}

3074

3076 Record.readOMPChildren(D->Data);

3078}

3079

3081 Record.readOMPChildren(D->Data);

3083}

3084

3088 Expr *In = Record.readExpr();

3089 Expr *Out = Record.readExpr();

3091 Expr *Combiner = Record.readExpr();

3093 Expr *Orig = Record.readExpr();

3094 Expr *Priv = Record.readExpr();

3096 Expr *Init = Record.readExpr();

3099 D->PrevDeclInScope = readDeclID().getRawValue();

3100}

3101

3103 Record.readOMPChildren(D->Data);

3105 D->VarName = Record.readDeclarationName();

3106 D->PrevDeclInScope = readDeclID().getRawValue();

3107}

3108

3112

3116 D->DirectiveLoc = Record.readSourceLocation();

3117 D->EndLoc = Record.readSourceLocation();

3118 Record.readOpenACCClauseList(D->Clauses);

3119}

3123 D->DirectiveLoc = Record.readSourceLocation();

3124 D->EndLoc = Record.readSourceLocation();

3125 D->ParensLoc = Record.readSourceRange();

3126 D->FuncRef = Record.readExpr();

3127 Record.readOpenACCClauseList(D->Clauses);

3128}

3129

3130

3131

3132

3133

3134namespace {

3135class AttrReader {

3137

3138public:

3140

3141 uint64_t readInt() {

3142 return Reader.readInt();

3143 }

3144

3145 bool readBool() { return Reader.readBool(); }

3146

3147 SourceRange readSourceRange() {

3149 }

3150

3151 SourceLocation readSourceLocation() {

3153 }

3154

3155 Expr *readExpr() { return Reader.readExpr(); }

3156

3157 Attr *readAttr() { return Reader.readAttr(); }

3158

3159 std::string readString() {

3161 }

3162

3163 TypeSourceInfo *readTypeSourceInfo() {

3165 }

3166

3167 IdentifierInfo *readIdentifier() {

3169 }

3170

3171 VersionTuple readVersionTuple() {

3173 }

3174

3175 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }

3176

3177 template T *readDeclAs() { return Reader.readDeclAs<T>(); }

3178};

3179}

3180

3182 AttrReader Record(*this);

3183 auto V = Record.readInt();

3184 if (V)

3185 return nullptr;

3186

3188

3189

3190 auto Kind = static_cast<attr::Kind>(V - 1);

3192

3194 IdentifierInfo *ScopeName = Record.readIdentifier();

3195 SourceRange AttrRange = Record.readSourceRange();

3196 SourceLocation ScopeLoc = Record.readSourceLocation();

3197 unsigned ParsedKind = Record.readInt();

3198 unsigned Syntax = Record.readInt();

3199 unsigned SpellingIndex = Record.readInt();

3200 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&

3202 SpellingIndex == AlignedAttr::Keyword_alignas);

3203 bool IsRegularKeywordAttribute = Record.readBool();

3204

3208 IsAlignas, IsRegularKeywordAttribute});

3209

3210#include "clang/Serialization/AttrPCHRead.inc"

3211

3212 assert(New && "Unable to decode attribute?");

3213 return New;

3214}

3215

3216

3218 for (unsigned I = 0, E = readInt(); I != E; ++I)

3220 Attrs.push_back(A);

3221}

3222

3223

3224

3225

3226

3227

3228

3229

3230

3231

3232

3233inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {

3234 assert(!DeclsLoaded[Index] && "Decl loaded twice?");

3235 DeclsLoaded[Index] = D;

3236}

3237

3238

3239

3240

3241

3242

3243

3244bool ASTReader::isConsumerInterestedIn(Decl *D) {

3245

3246

3247

3248

3249

3254 return false;

3255 }

3256

3257 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,

3258 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))

3259 return true;

3260 if (isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,

3261 OMPAllocateDecl, OMPRequiresDecl>(D))

3263 if (const auto *Var = dyn_cast(D))

3264 return Var->isFileVarDecl() &&

3266 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));

3267 if (const auto *Func = dyn_cast(D))

3268 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);

3269

3272 return true;

3273

3274 return false;

3275}

3276

3277

3278ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,

3281 assert(M);

3282 unsigned LocalDeclIndex = ID.getLocalDeclIndex();

3283 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];

3286}

3287

3288ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {

3289 auto I = GlobalBitOffsetsMap.find(GlobalOffset);

3290

3291 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");

3292 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);

3293}

3294

3295uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {

3297}

3298

3300ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,

3302

3303 auto *DD = RD->DefinitionData;

3304 if (!DD)

3306

3307

3308

3309

3310

3311 if (!DD) {

3312 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);

3314 RD->DefinitionData = DD;

3316

3317

3318 Reader.PendingFakeDefinitionData.insert(

3319 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));

3320 }

3321

3322 return DD->Definition;

3323}

3324

3325

3326

3329 if (auto *ND = dyn_cast(DC))

3330 return ND->getFirstDecl();

3331

3332 if (auto *RD = dyn_cast(DC))

3333 return getOrFakePrimaryClassDefinition(Reader, RD);

3334

3335 if (auto *RD = dyn_cast(DC))

3337

3338 if (auto *ED = dyn_cast(DC))

3340

3341 if (auto *OID = dyn_cast(DC))

3343

3344

3345

3346 if (auto *TU = dyn_cast(DC))

3348

3349 return nullptr;

3350}

3351

3352ASTDeclReader::FindExistingResult::~FindExistingResult() {

3353

3354

3355 if (TypedefNameForLinkage) {

3356 DeclContext *DC = New->getDeclContext()->getRedeclContext();

3357 Reader.ImportedTypedefNamesForLinkage.insert(

3358 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));

3359 return;

3360 }

3361

3362 if (!AddResult || Existing)

3363 return;

3364

3365 DeclarationName Name = New->getDeclName();

3366 DeclContext *DC = New->getDeclContext()->getRedeclContext();

3368 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),

3369 AnonymousDeclNumber, New);

3371 !Reader.getContext().getLangOpts().CPlusPlus) {

3372 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))

3374 .push_back(New);

3375 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {

3376

3377

3378 MergeDC->makeDeclVisibleInContextImpl(New, true);

3379 }

3380}

3381

3382

3383

3384

3386 bool IsTypedefNameForLinkage) {

3387 if (!IsTypedefNameForLinkage)

3389

3390

3391

3392

3393 if (Found->isFromASTFile())

3394 return nullptr;

3395

3396 if (auto *TND = dyn_cast(Found))

3397 return TND->getAnonDeclWithTypedefName(true);

3398

3399 return nullptr;

3400}

3401

3402

3403

3404

3405DeclContext *

3406ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {

3407

3408 if (auto *RD = dyn_cast(LexicalDC)) {

3410 return DD ? DD->Definition : nullptr;

3411 } else if (auto *OID = dyn_cast(LexicalDC)) {

3412 return OID->getCanonicalDecl()->getDefinition();

3413 }

3414

3415

3416

3417

3419 if (auto *FD = dyn_cast(D))

3420 if (FD->isThisDeclarationADefinition())

3421 return FD;

3422 if (auto *MD = dyn_cast(D))

3423 if (MD->isThisDeclarationADefinition())

3424 return MD;

3425 if (auto *RD = dyn_cast(D))

3427 return RD;

3428 }

3429

3430

3431 return nullptr;

3432}

3433

3434NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,

3435 DeclContext *DC,

3436 unsigned Index) {

3437

3438

3439 auto *CanonDC = cast(DC)->getCanonicalDecl();

3440

3441

3442 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];

3445

3446

3447

3448 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);

3449 auto needToNumberAnonymousDeclsWithin = [](Decl *D) {

3451 return true;

3452

3453

3454

3455

3456

3457 auto *CTSD = dyn_cast(D);

3458 return CTSD && !CTSD->noload_field_empty() &&

3459 !CTSD->hasLoadedFieldsFromExternalStorage();

3460 };

3461 if (PrimaryDC && needToNumberAnonymousDeclsWithin(cast(PrimaryDC))) {

3463 if (Previous.size() == Number)

3465 else

3467 });

3468 }

3469

3471}

3472

3473void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,

3474 DeclContext *DC, unsigned Index,

3475 NamedDecl *D) {

3476 auto *CanonDC = cast(DC)->getCanonicalDecl();

3477

3478 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];

3479 if (Index >= Previous.size())

3483}

3484

3485ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {

3486 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage

3488

3490

3491

3492 FindExistingResult Result(Reader, D, nullptr,

3493 AnonymousDeclNumber, TypedefNameForLinkage);

3496 }

3497

3498 ASTContext &C = Reader.getContext();

3500 if (TypedefNameForLinkage) {

3501 auto It = Reader.ImportedTypedefNamesForLinkage.find(

3502 std::make_pair(DC, TypedefNameForLinkage));

3503 if (It != Reader.ImportedTypedefNamesForLinkage.end())

3504 if (C.isSameEntity(It->second, D))

3505 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,

3506 TypedefNameForLinkage);

3507

3508

3509 }

3510

3512

3513

3514 if (auto *Existing = getAnonymousDeclForMerging(

3516 if (C.isSameEntity(Existing, D))

3517 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,

3518 TypedefNameForLinkage);

3520 !Reader.getContext().getLangOpts().CPlusPlus) {

3521 IdentifierResolver &IdResolver = Reader.getIdResolver();

3522

3523

3524

3525 class UpToDateIdentifierRAII {

3526 IdentifierInfo *II;

3527 bool WasOutToDate = false;

3528

3529 public:

3530 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {

3531 if (II) {

3533 if (WasOutToDate)

3535 }

3536 }

3537

3538 ~UpToDateIdentifierRAII() {

3539 if (WasOutToDate)

3541 }

3543

3544 for (IdentifierResolver::iterator I = IdResolver.begin(Name),

3545 IEnd = IdResolver.end();

3546 I != IEnd; ++I) {

3547 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))

3548 if (C.isSameEntity(Existing, D))

3549 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,

3550 TypedefNameForLinkage);

3551 }

3552 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {

3555 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))

3556 if (C.isSameEntity(Existing, D))

3557 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,

3558 TypedefNameForLinkage);

3559 }

3560 } else {

3561

3562 return FindExistingResult(Reader);

3563 }

3564

3565

3566

3567

3568

3569

3570

3571

3572

3574 if (MergedDCIt != Reader.MergedDeclContexts.end() &&

3577 Reader.PendingOdrMergeChecks.push_back(D);

3578

3579 return FindExistingResult(Reader, D, nullptr,

3580 AnonymousDeclNumber, TypedefNameForLinkage);

3581}

3582

3583template

3587

3589 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");

3590}

3591

3593 assert(D);

3594

3596#define ABSTRACT_DECL(TYPE)

3597#define DECL(TYPE, BASE) \

3598 case Decl::TYPE: \

3599 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));

3600#include "clang/AST/DeclNodes.inc"

3601 }

3602 llvm_unreachable("unknown decl kind");

3603}

3604

3605Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {

3607}

3608

3609namespace {

3613 const auto *IA = Previous->getAttr();

3614

3615 if (IA && !D->hasAttr()) {

3619 }

3620

3621 const auto *AA = Previous->getAttr();

3622 if (AA && !D->hasAttr()) {

3623 NewAttr = AA->clone(Context);

3626 }

3627}

3628}

3629

3630template

3637

3638namespace clang {

3639

3640template<>

3644 auto *VD = static_cast<VarDecl *>(D);

3647 D->First = PrevVD->First;

3648

3649

3650

3651

3655 Reader.mergeDefinitionVisibility(CurD, VD);

3656 VD->demoteThisDefinitionToDeclaration();

3657 break;

3658 }

3659 }

3660 }

3661}

3662

3664 auto *DT = T->getContainedDeducedType();

3665 return DT && !DT->isDeduced();

3666}

3667

3668template<>

3674

3675 FD->RedeclLink.setPrevious(PrevFD);

3676 FD->First = PrevFD->First;

3677

3678

3679

3680 if (PrevFD->isInlined() != FD->isInlined()) {

3681

3682

3683

3684

3685

3686

3687

3688

3689

3690

3691

3692

3693

3694

3695

3696 FD->setImplicitlyInline(true);

3697 }

3698

3701 if (FPT && PrevFPT) {

3702

3703

3705 bool WasUnresolved =

3707 if (IsUnresolved != WasUnresolved)

3708 Reader.PendingExceptionSpecUpdates.insert(

3709 {Canon, IsUnresolved ? PrevFD : FD});

3710

3711

3712

3715 if (IsUndeduced != WasUndeduced)

3716 Reader.PendingDeducedTypeUpdates.insert(

3718 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});

3719 }

3720}

3721

3722}

3723

3725 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");

3726}

3727

3728

3729

3730template

3732 Decl *ToD) {

3734 if (!From->hasDefaultArgument())

3735 return false;

3736 To->setInheritedDefaultArgument(Context, From);

3737 return true;

3738}

3739

3745 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");

3746

3747 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {

3748 NamedDecl *FromParam = FromTP->getParam(I);

3749 NamedDecl *ToParam = ToTP->getParam(I);

3750

3751 if (auto *FTTP = dyn_cast(FromParam))

3753 else if (auto *FNTTP = dyn_cast(FromParam))

3755 else

3758 }

3759}

3760

3761

3762

3763

3767

3768

3770 return;

3771

3772

3773

3774

3776 return;

3777

3778

3779

3780

3781

3782

3784 return;

3786 return;

3787 if (auto *Func = dyn_cast(Previous);

3788 Func && Func->getTemplateSpecializationInfo())

3789 return;

3790

3791

3792

3794 return;

3795

3796

3797 if (Previous->getLexicalDeclContext()

3798 ->getNonTransparentContext()

3799 ->isFileContext() ||

3801 return;

3802

3804 if (!M)

3805 return;

3806

3807

3809

3811 return;

3812

3815 return;

3816

3817 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(

3819 return;

3820 }

3821

3822

3823 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))

3824 return;

3825

3826 Reader.Diag(Previous->getLocation(),

3827 diag::err_multiple_decl_in_different_modules)

3829 Reader.Diag(D->getLocation(), diag::note_also_found);

3830}

3831

3835

3837#define ABSTRACT_DECL(TYPE)

3838#define DECL(TYPE, BASE) \

3839 case Decl::TYPE: \

3840 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \

3841 break;

3842#include "clang/AST/DeclNodes.inc"

3843 }

3844

3846

3847

3848

3849

3850

3851

3853 Previous->IdentifierNamespace &

3855

3856

3857

3858 if (auto *TD = dyn_cast(D))

3861

3862

3863

3864

3865

3866 mergeInheritableAttributes(Reader, D, Previous);

3867}

3868

3869template

3873

3875 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");

3876}

3877

3879 assert(D && Latest);

3880

3882#define ABSTRACT_DECL(TYPE)

3883#define DECL(TYPE, BASE) \

3884 case Decl::TYPE: \

3885 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \

3886 break;

3887#include "clang/AST/DeclNodes.inc"

3888 }

3889}

3890

3891template

3895

3897 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");

3898}

3899

3900void ASTReader::markIncompleteDeclChain(Decl *D) {

3902#define ABSTRACT_DECL(TYPE)

3903#define DECL(TYPE, BASE) \

3904 case Decl::TYPE: \

3905 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \

3906 break;

3907#include "clang/AST/DeclNodes.inc"

3908 }

3909}

3910

3911

3913 SourceLocation DeclLoc;

3914 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);

3915 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;

3916

3917

3918 SavedStreamPosition SavedPosition(DeclsCursor);

3919

3920 ReadingKindTracker ReadingKind(Read_Decl, *this);

3921

3922

3924

3925 auto Fail = [](const char *what, llvm::Error &&Err) {

3926 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +

3927 ": " + toString(std::move(Err)));

3928 };

3929

3930 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))

3931 Fail("jumping", std::move(JumpFailed));

3934 Expected MaybeCode = DeclsCursor.ReadCode();

3935 if (!MaybeCode)

3936 Fail("reading code", MaybeCode.takeError());

3937 unsigned Code = MaybeCode.get();

3938

3940 Decl *D = nullptr;

3941 Expected MaybeDeclCode = Record.readRecord(DeclsCursor, Code);

3942 if (!MaybeDeclCode)

3943 llvm::report_fatal_error(

3944 Twine("ASTReader::readDeclRecord failed reading decl code: ") +

3945 toString(MaybeDeclCode.takeError()));

3946

3947 switch ((DeclCode)MaybeDeclCode.get()) {

3954 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");

3957 break;

3960 break;

3963 break;

3966 break;

3969 break;

3972 break;

3975 break;

3978 break;

3981 break;

3984 break;

3987 break;

3990 break;

3993 break;

3996 break;

3999 break;

4002 break;

4005 break;

4008 break;

4011 break;

4014 break;

4017 break;

4020 break;

4023 break;

4026 break;

4029 break;

4032 break;

4035 break;

4038 break;

4041 break;

4044 break;

4047 break;

4050 break;

4053 break;

4056 break;

4059 break;

4062 break;

4064 bool HasTypeConstraint = Record.readInt();

4066 HasTypeConstraint);

4067 break;

4068 }

4070 bool HasTypeConstraint = Record.readInt();

4072 HasTypeConstraint);

4073 break;

4074 }

4076 bool HasTypeConstraint = Record.readInt();

4078 Context, ID, Record.readInt(), HasTypeConstraint);

4079 break;

4080 }

4083 break;

4087 break;

4090 break;

4093 break;

4096 break;

4099 break;

4102 break;

4105 break;

4108 break;

4111 break;

4114 break;

4117 break;

4120 break;

4123 break;

4126 break;

4129 break;

4132 break;

4135 break;

4138 break;

4141 break;

4144 break;

4147 break;

4150 break;

4153 break;

4156 break;

4159 break;

4162 break;

4165 break;

4167 D = MSGuidDecl::CreateDeserialized(Context, ID);

4168 break;

4170 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);

4171 break;

4173 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);

4174 break;

4177 break;

4180 break;

4182 Error("attempt to read a C++ base-specifier record as a declaration");

4183 return nullptr;

4185 Error("attempt to read a C++ ctor initializer record as a declaration");

4186 return nullptr;

4188

4189

4191 break;

4194 unsigned NumChildren = Record.readInt();

4197 break;

4198 }

4200 unsigned NumClauses = Record.readInt();

4201 unsigned NumVars = Record.readInt();

4204 break;

4205 }

4207 unsigned NumClauses = Record.readInt();

4210 break;

4211 }

4214 break;

4216 unsigned NumClauses = Record.readInt();

4219 break;

4220 }

4223 break;

4226 break;

4230 break;

4233 break;

4236 break;

4239 break;

4242 break;

4246 break;

4249 break;

4252 break;

4253 }

4254

4255 assert(D && "Unknown declaration reading AST file");

4256 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);

4257

4258

4259

4261

4262

4264

4265

4266

4267 if (auto *DC = dyn_cast(D)) {

4268 LookupBlockOffsets Offsets;

4269

4270 Reader.VisitDeclContext(DC, Offsets);

4271

4272

4273

4274

4276 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);

4277 Iter != DelayedNamespaceOffsetMap.end())

4278 Offsets = Iter->second;

4279

4281 ReadVisibleDeclContextStorage(

4283 VisibleDeclContextStorageKind::GenerallyVisible))

4284 return nullptr;

4286 ReadVisibleDeclContextStorage(

4288 VisibleDeclContextStorageKind::ModuleLocalVisible))

4289 return nullptr;

4291 ReadVisibleDeclContextStorage(

4293 VisibleDeclContextStorageKind::TULocalVisible))

4294 return nullptr;

4295

4297 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,

4299 return nullptr;

4300 }

4302

4303

4304 PendingUpdateRecords.push_back(

4305 PendingUpdateRecord(ID, D, true));

4306

4307

4308 if (auto *Class = dyn_cast(D))

4309

4310

4311 if (Class->isThisDeclarationADefinition() ||

4312 PendingDefinitions.count(Class))

4313 loadObjCCategories(ID, Class);

4314

4315

4316

4317

4318

4319 PotentiallyInterestingDecls.push_back(D);

4320

4321 return D;

4322}

4323

4324void ASTReader::PassInterestingDeclsToConsumer() {

4325 assert(Consumer);

4326

4327 if (!CanPassDeclsToConsumer)

4328 return;

4329

4330

4331

4332 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,

4333 false);

4334

4335

4336

4337 for (auto ID : EagerlyDeserializedDecls)

4339 EagerlyDeserializedDecls.clear();

4340

4341 auto ConsumingPotentialInterestingDecls = [this]() {

4342 while (!PotentiallyInterestingDecls.empty()) {

4343 Decl *D = PotentiallyInterestingDecls.front();

4344 PotentiallyInterestingDecls.pop_front();

4345 if (isConsumerInterestedIn(D))

4346 PassInterestingDeclToConsumer(D);

4347 }

4348 };

4349 std::deque<Decl *> MaybeInterestingDecls =

4350 std::move(PotentiallyInterestingDecls);

4351 PotentiallyInterestingDecls.clear();

4352 assert(PotentiallyInterestingDecls.empty());

4353 while (!MaybeInterestingDecls.empty()) {

4354 Decl *D = MaybeInterestingDecls.front();

4355 MaybeInterestingDecls.pop_front();

4356

4357

4358

4359

4360

4361 if (auto *VD = dyn_cast(D);

4362 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())

4363 VD->getInit();

4364 ConsumingPotentialInterestingDecls();

4365 if (isConsumerInterestedIn(D))

4366 PassInterestingDeclToConsumer(D);

4367 }

4368

4369

4370 ConsumingPotentialInterestingDecls();

4371

4372 for (GlobalDeclID ID : VTablesToEmit) {

4375 PassVTableToConsumer(RD);

4376 }

4377 VTablesToEmit.clear();

4378}

4379

4380void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {

4381

4382

4383

4384 GlobalDeclID ID = Record.ID;

4386 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);

4387 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);

4388

4389 if (UpdI != DeclUpdateOffsets.end()) {

4390 auto UpdateOffsets = std::move(UpdI->second);

4391 DeclUpdateOffsets.erase(UpdI);

4392

4393

4394

4395

4396

4397 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);

4398 for (auto &FileAndOffset : UpdateOffsets) {

4399 ModuleFile *F = FileAndOffset.first;

4400 uint64_t Offset = FileAndOffset.second;

4402 SavedStreamPosition SavedPosition(Cursor);

4403 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))

4404

4405 llvm::report_fatal_error(

4406 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +

4407 toString(std::move(JumpFailed)));

4408 Expected MaybeCode = Cursor.ReadCode();

4409 if (!MaybeCode)

4410 llvm::report_fatal_error(

4411 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +

4412 toString(MaybeCode.takeError()));

4413 unsigned Code = MaybeCode.get();

4415 if (Expected MaybeRecCode = Record.readRecord(Cursor, Code))

4416 assert(MaybeRecCode.get() == DECL_UPDATES &&

4417 "Expected DECL_UPDATES record!");

4418 else

4419 llvm::report_fatal_error(

4420 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +

4421 toString(MaybeCode.takeError()));

4422

4424 SourceLocation());

4425 Reader.UpdateDecl(D);

4426

4427

4428

4429 if (!WasInteresting && isConsumerInterestedIn(D)) {

4430 PotentiallyInterestingDecls.push_back(D);

4431 WasInteresting = true;

4432 }

4433 }

4434 }

4435

4436

4437 if (auto I = PendingVisibleUpdates.find(ID);

4438 I != PendingVisibleUpdates.end()) {

4439 auto VisibleUpdates = std::move(I->second);

4440 PendingVisibleUpdates.erase(I);

4441

4443 for (const auto &Update : VisibleUpdates)

4444 Lookups[DC].Table.add(

4446 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));

4448 }

4449

4450 if (auto I = PendingModuleLocalVisibleUpdates.find(ID);

4451 I != PendingModuleLocalVisibleUpdates.end()) {

4452 auto ModuleLocalVisibleUpdates = std::move(I->second);

4453 PendingModuleLocalVisibleUpdates.erase(I);

4454

4456 for (const auto &Update : ModuleLocalVisibleUpdates)

4457 ModuleLocalLookups[DC].Table.add(

4459 reader::ModuleLocalNameLookupTrait(*this, *Update.Mod));

4460

4461

4463 }

4464

4465 if (auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {

4466 auto Updates = std::move(I->second);

4467 TULocalUpdates.erase(I);

4468

4470 for (const auto &Update : Updates)

4471 TULocalLookups[DC].Table.add(

4473 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));

4475 }

4476

4477

4479 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {

4480 for (auto LID : IT->second)

4482 RelatedDeclsMap.erase(IT);

4483 }

4484 }

4485

4486

4487 if (auto I = PendingSpecializationsUpdates.find(ID);

4488 I != PendingSpecializationsUpdates.end()) {

4489 auto SpecializationUpdates = std::move(I->second);

4490 PendingSpecializationsUpdates.erase(I);

4491

4492 for (const auto &Update : SpecializationUpdates)

4493 AddSpecializations(D, Update.Data, *Update.Mod, false);

4494 }

4495

4496

4497 if (auto I = PendingPartialSpecializationsUpdates.find(ID);

4498 I != PendingPartialSpecializationsUpdates.end()) {

4499 auto SpecializationUpdates = std::move(I->second);

4500 PendingPartialSpecializationsUpdates.erase(I);

4501

4502 for (const auto &Update : SpecializationUpdates)

4503 AddSpecializations(D, Update.Data, *Update.Mod, true);

4504 }

4505}

4506

4507void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {

4508

4510 if (FirstLocal != CanonDecl) {

4513 *this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,

4514 CanonDecl);

4515 }

4516

4517 if (!LocalOffset) {

4519 return;

4520 }

4521

4522

4524 assert(M && "imported decl from no module file");

4525

4527 SavedStreamPosition SavedPosition(Cursor);

4528 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))

4529 llvm::report_fatal_error(

4530 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +

4531 toString(std::move(JumpFailed)));

4532

4534 Expected MaybeCode = Cursor.ReadCode();

4535 if (!MaybeCode)

4536 llvm::report_fatal_error(

4537 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +

4538 toString(MaybeCode.takeError()));

4539 unsigned Code = MaybeCode.get();

4540 if (Expected MaybeRecCode = Cursor.readRecord(Code, Record))

4542 "expected LOCAL_REDECLARATIONS record!");

4543 else

4544 llvm::report_fatal_error(

4545 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +

4546 toString(MaybeCode.takeError()));

4547

4548

4549

4550 Decl *MostRecent = FirstLocal;

4551 for (unsigned I = 0, N = Record.size(); I != N; ++I) {

4552 unsigned Idx = N - I - 1;

4555 MostRecent = D;

4556 }

4558}

4559

4560namespace {

4561

4562

4563

4564 class ObjCCategoriesVisitor {

4565 ASTReader &Reader;

4567 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;

4568 ObjCCategoryDecl *Tail = nullptr;

4569 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;

4570 GlobalDeclID InterfaceID;

4571 unsigned PreviousGeneration;

4572

4573 void add(ObjCCategoryDecl *Cat) {

4574

4575 if (!Deserialized.erase(Cat))

4576 return;

4577

4578

4580 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];

4584 StructuralEquivalenceContext Ctx(

4587 StructuralEquivalenceKind::Default,

4588 false,

4589 false,

4590 true);

4591 if (!Ctx.IsEquivalent(Cat, Existing)) {

4592

4593 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)

4596 diag::note_previous_definition);

4597 }

4598 } else if (!Existing) {

4599

4600 Existing = Cat;

4601 }

4602 }

4603

4604

4605 if (Tail)

4607 else

4608 Interface->setCategoryListRaw(Cat);

4609 Tail = Cat;

4610 }

4611

4612 public:

4613 ObjCCategoriesVisitor(

4614 ASTReader &Reader, ObjCInterfaceDecl *Interface,

4615 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,

4616 GlobalDeclID InterfaceID, unsigned PreviousGeneration)

4618 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {

4619

4620 for (auto *Cat : Interface->known_categories()) {

4621 if (Cat->getDeclName())

4622 NameCategoryMap[Cat->getDeclName()] = Cat;

4623

4624

4625 Tail = Cat;

4626 }

4627 }

4628

4629 bool operator()(ModuleFile &M) {

4630

4631

4632 if (M.Generation <= PreviousGeneration)

4633 return true;

4634

4635

4636

4637

4638 LocalDeclID LocalID =

4641 return true;

4642

4643

4644

4645 const ObjCCategoriesInfo Compare = {LocalID, 0};

4646 const ObjCCategoriesInfo *Result = std::lower_bound(

4650 LocalID != Result->getDefinitionID()) {

4651

4652

4653

4655 }

4656

4657

4658 unsigned Offset = Result->Offset;

4660 M.ObjCCategories[Offset++] = 0;

4661 for (unsigned I = 0; I != N; ++I)

4663 return true;

4664 }

4665 };

4666

4667}

4668

4670 unsigned PreviousGeneration) {

4671 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,

4672 PreviousGeneration);

4673 ModuleMgr.visit(Visitor);

4674}

4675

4676template<typename DeclT, typename Fn>

4678 F(D);

4679

4680

4681

4682

4684 bool Found = false;

4685 for (auto *Redecl = MostRecent; Redecl && Found;

4686 Redecl = Redecl->getPreviousDecl())

4687 Found = (Redecl == D);

4688

4689

4691 for (auto *Redecl = MostRecent; Redecl != D;

4693 F(Redecl);

4694 }

4695}

4696

4698 while (Record.getIdx() < Record.size()) {

4702 Decl *MD = Record.readDecl();

4703 assert(MD && "couldn't read decl from update record");

4704 Reader.PendingAddedClassMembers.push_back({RD, MD});

4705 break;

4706 }

4707

4709 auto *Anon = readDeclAs();

4710

4711

4712

4713

4714 if (!Record.isModule()) {

4715 if (auto *TU = dyn_cast(D))

4716 TU->setAnonymousNamespace(Anon);

4717 else

4719 }

4720 break;

4721 }

4722

4725 VD->NonParmVarDeclBits.IsInline = Record.readInt();

4726 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();

4728 break;

4729 }

4730

4733 if (auto *VTSD = dyn_cast(D)) {

4734 VTSD->setPointOfInstantiation(POI);

4735 } else if (auto *VD = dyn_cast(D)) {

4737 assert(MSInfo && "No member specialization information");

4739 } else {

4741 if (auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(

4742 FD->TemplateOrSpecialization))

4743 FTSInfo->setPointOfInstantiation(POI);

4744 else

4746 ->setPointOfInstantiation(POI);

4747 }

4748 break;

4749 }

4750

4753

4754

4755

4756

4757 auto *DefaultArg = Record.readExpr();

4758

4759

4760

4761 if (Param->hasUninstantiatedDefaultArg())

4762 Param->setDefaultArg(DefaultArg);

4763 break;

4764 }

4765

4768 auto *DefaultInit = Record.readExpr();

4769

4770

4771

4772 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {

4773 if (DefaultInit)

4774 FD->setInClassInitializer(DefaultInit);

4775 else

4776

4777

4778 FD->removeInClassInitializer();

4779 }

4780 break;

4781 }

4782

4785 if (Reader.PendingBodies[FD]) {

4786

4787

4788 return;

4789 }

4790

4791 if (Record.readInt()) {

4792

4793

4794

4797 });

4798 }

4799 FD->setInnerLocStart(readSourceLocation());

4801 assert(Record.getIdx() == Record.size() && "lazy body must be last");

4802 break;

4803 }

4804

4808 bool HadRealDefinition =

4809 OldDD && (OldDD->Definition != RD ||

4810 !Reader.PendingFakeDefinitionData.count(OldDD));

4814 ReadCXXRecordDefinition(RD, true);

4815

4816

4817 uint64_t LexicalOffset = ReadLocalOffset();

4818 if (!HadRealDefinition && LexicalOffset) {

4819 Record.readLexicalDeclContextStorage(LexicalOffset, RD);

4820 Reader.PendingFakeDefinitionData.erase(OldDD);

4821 }

4822

4827 MSInfo->setTemplateSpecializationKind(TSK);

4828 MSInfo->setPointOfInstantiation(POI);

4829 } else {

4831 Spec->setTemplateSpecializationKind(TSK);

4832 Spec->setPointOfInstantiation(POI);

4833

4834 if (Record.readInt()) {

4835 auto *PartialSpec =

4836 readDeclAs();

4838 Record.readTemplateArgumentList(TemplArgs);

4840 Reader.getContext(), TemplArgs);

4841

4842

4843

4845 Spec->getSpecializedTemplateOrPartial()))

4846 Spec->setInstantiationOf(PartialSpec, TemplArgList);

4847 }

4848 }

4849

4854

4855 if (Record.readInt()) {

4857 Record.readAttributes(Attrs);

4858

4859

4861 D->setAttrsImpl(Attrs, Reader.getContext());

4862 }

4863 break;

4864 }

4865

4867

4868

4871 auto *Del = readDeclAs();

4872 auto *ThisArg = Record.readExpr();

4874

4875 if (C.dtorHasOperatorDelete(Dtor,

4877 C.addOperatorDeleteForVDtor(Dtor, Del,

4879 Canon->OperatorDeleteThisArg = ThisArg;

4880 }

4881 break;

4882 }

4883

4885 auto *Del = readDeclAs();

4888 if (C.dtorHasOperatorDelete(

4890 C.addOperatorDeleteForVDtor(

4892 break;

4893 }

4895 auto *Del = readDeclAs();

4899 C.addOperatorDeleteForVDtor(Dtor, Del,

4901 break;

4902 }

4904 auto *Del = readDeclAs();

4907 if (C.dtorHasOperatorDelete(Dtor,

4909 C.addOperatorDeleteForVDtor(

4911 break;

4912 }

4913

4916 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);

4917

4918

4921

4922

4924 FD->setType(Reader.getContext().getFunctionType(

4925 FPT->getReturnType(), FPT->getParamTypes(),

4926 FPT->getExtProtoInfo().withExceptionSpec(ESI)));

4927

4928

4929

4930 Reader.PendingExceptionSpecUpdates.insert(

4931 std::make_pair(FD->getCanonicalDecl(), FD));

4932 }

4933 break;

4934 }

4935

4938 QualType DeducedResultType = Record.readType();

4939 Reader.PendingDeducedTypeUpdates.insert(

4940 {FD->getCanonicalDecl(), DeducedResultType});

4941 break;

4942 }

4943

4945

4946 D->markUsed(Reader.getContext());

4947 break;

4948

4950 Reader.getContext().setManglingNumber(cast(D),

4951 Record.readInt());

4952 break;

4953

4955 Reader.getContext().setStaticLocalNumber(cast(D),

4956 Record.readInt());

4957 break;

4958

4960 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),

4961 readSourceRange()));

4962 break;

4963

4965 auto AllocatorKind =

4966 static_castOMPAllocateDeclAttr::AllocatorTypeTy\(Record.readInt());

4967 Expr *Allocator = Record.readExpr();

4968 Expr *Alignment = Record.readExpr();

4970 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(

4971 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));

4972 break;

4973 }

4974

4976 unsigned SubmoduleID = readSubmoduleID();

4979 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);

4980 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);

4981 break;

4982 }

4983

4985 auto MapType = Record.readEnumOMPDeclareTargetDeclAttr::MapTypeTy();

4986 auto DevType = Record.readEnumOMPDeclareTargetDeclAttr::DevTypeTy();

4987 Expr *IndirectE = Record.readExpr();

4988 bool Indirect = Record.readBool();

4989 unsigned Level = Record.readInt();

4990 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(

4991 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,

4992 readSourceRange()));

4993 break;

4994 }

4995

4998 Record.readAttributes(Attrs);

4999 assert(Attrs.size() == 1);

5001 break;

5002 }

5003 }

5004}

This file provides AST data structures related to concepts.

Defines the clang::ASTContext interface.

static T assert_cast(T t)

"Cast" to type T, asserting if we don't have an implicit conversion.

Definition ASTReaderDecl.cpp:2935

static bool allowODRLikeMergeInC(NamedDecl *ND)

ODR-like semantics for C/ObjC allow us to merge tag types and a structural check in Sema guarantees t...

Definition ASTReaderDecl.cpp:3018

static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)

Find the declaration that should be merged into, given the declaration found by name lookup.

Definition ASTReaderDecl.cpp:3385

static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)

Inherit the default template argument from From to To.

Definition ASTReaderDecl.cpp:3731

static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)

Definition ASTReaderDecl.cpp:3740

static void forAllLaterRedecls(DeclT *D, Fn F)

Definition ASTReaderDecl.cpp:4677

static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)

Definition ASTReaderDecl.cpp:499

Defines the clang::attr::Kind enum.

clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)

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.

FormatToken * Previous

The previous token in the unwrapped line.

FormatToken * Next

The next token in the unwrapped line.

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

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

Defines the LambdaCapture class.

Defines several types used to describe C++ lambda expressions that are shared between the parser and ...

Defines the clang::LangOptions interface.

llvm::MachO::Record Record

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

This file defines OpenMP AST classes for clauses.

static std::string toString(const clang::SanitizerSet &Sanitizers)

Produce a string containing comma-separated names of sanitizers in Sanitizers set.

Defines the clang::SourceLocation class and associated facilities.

Defines various enumerations that describe declaration and type specifiers.

C Language Family Type Representation.

__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)

bool needsCleanup() const

Returns whether the object performed allocations.

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

TranslationUnitDecl * getTranslationUnitDecl() const

const LangOptions & getLangOpts() const

void addDestruction(T *Ptr) const

If T isn't trivially destructible, calls AddDeallocation to register it for destruction.

ExternalASTSource * getExternalSource() const

Retrieve a pointer to the external AST source associated with this AST context, if any.

Definition ASTReaderDecl.cpp:103

void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)

Merge together the pattern declarations from two template declarations.

Definition ASTReaderDecl.cpp:2942

ASTDeclMerger(ASTReader &Reader)

Definition ASTReaderDecl.cpp:107

void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)

Definition ASTReaderDecl.cpp:121

void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)

Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...

Definition ASTReaderDecl.cpp:2899

void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)

Definition ASTReaderDecl.cpp:2080

void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)

Attempts to merge the given declaration (D) with another declaration of the same entity.

Definition ASTReaderDecl.cpp:2985

void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)

Definition ASTReaderDecl.cpp:1587

void VisitObjCImplementationDecl(ObjCImplementationDecl *D)

Definition ASTReaderDecl.cpp:1512

void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)

Definition ASTReaderDecl.cpp:2923

void VisitImportDecl(ImportDecl *D)

Definition ASTReaderDecl.cpp:2377

void VisitBindingDecl(BindingDecl *BD)

Definition ASTReaderDecl.cpp:1764

void VisitNamespaceDecl(NamespaceDecl *D)

Definition ASTReaderDecl.cpp:1852

void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)

Definition ASTReaderDecl.cpp:1775

RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)

Definition ASTReaderDecl.cpp:2459

void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)

Definition ASTReaderDecl.cpp:2707

void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)

Definition ASTReaderDecl.cpp:1981

void ReadFunctionDefinition(FunctionDecl *FD)

Definition ASTReaderDecl.cpp:508

void VisitLabelDecl(LabelDecl *LD)

Definition ASTReaderDecl.cpp:1847

void VisitObjCCategoryDecl(ObjCCategoryDecl *D)

Definition ASTReaderDecl.cpp:1442

void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)

Definition ASTReaderDecl.cpp:1954

RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)

Definition ASTReaderDecl.cpp:2520

void VisitFunctionDecl(FunctionDecl *FD)

Definition ASTReaderDecl.cpp:917

void VisitObjCMethodDecl(ObjCMethodDecl *D)

Definition ASTReaderDecl.cpp:1167

void VisitUsingShadowDecl(UsingShadowDecl *D)

Definition ASTReaderDecl.cpp:1934

void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)

Definition ASTReaderDecl.cpp:351

void VisitVarDecl(VarDecl *VD)

Definition ASTReaderDecl.cpp:376

RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)

Definition ASTReaderDecl.cpp:2812

void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)

Definition ASTReaderDecl.cpp:2803

void VisitMSGuidDecl(MSGuidDecl *D)

Definition ASTReaderDecl.cpp:1563

void VisitPragmaCommentDecl(PragmaCommentDecl *D)

Definition ASTReaderDecl.cpp:666

void VisitRecordDecl(RecordDecl *RD)

Definition ASTReaderDecl.cpp:850

void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)

Definition ASTReaderDecl.cpp:2790

void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)

Definition ASTReaderDecl.cpp:2773

void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)

Definition ASTReaderDecl.cpp:2445

void ReadVarDeclInit(VarDecl *VD)

Definition ASTReaderDecl.cpp:1702

static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)

Definition ASTReaderDecl.cpp:3584

void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)

Definition ASTReaderDecl.cpp:1892

void VisitIndirectFieldDecl(IndirectFieldDecl *FD)

Definition ASTReaderDecl.cpp:1598

void VisitObjCContainerDecl(ObjCContainerDecl *D)

Definition ASTReaderDecl.cpp:1222

void VisitBlockDecl(BlockDecl *BD)

Definition ASTReaderDecl.cpp:1780

void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)

Definition ASTReaderDecl.cpp:3120

void UpdateDecl(Decl *D)

Definition ASTReaderDecl.cpp:4697

void VisitExportDecl(ExportDecl *D)

Definition ASTReaderDecl.cpp:1842

static void attachLatestDecl(Decl *D, Decl *latest)

Definition ASTReaderDecl.cpp:3878

void VisitStaticAssertDecl(StaticAssertDecl *D)

Definition ASTReaderDecl.cpp:2778

void VisitEmptyDecl(EmptyDecl *D)

Definition ASTReaderDecl.cpp:2786

void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)

Definition ASTReaderDecl.cpp:3109

void VisitValueDecl(ValueDecl *VD)

Definition ASTReaderDecl.cpp:881

void VisitEnumDecl(EnumDecl *ED)

Definition ASTReaderDecl.cpp:774

void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)

Attempts to merge the given declaration (D) with another declaration of the same entity.

Definition ASTReaderDecl.cpp:2873

void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)

Definition ASTReaderDecl.cpp:1972

void VisitFriendTemplateDecl(FriendTemplateDecl *D)

Definition ASTReaderDecl.cpp:2406

void VisitObjCProtocolDecl(ObjCProtocolDecl *D)

Definition ASTReaderDecl.cpp:1409

void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)

Definition ASTReaderDecl.cpp:2594

void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)

Definition ASTReaderDecl.cpp:1213

void VisitDeclaratorDecl(DeclaratorDecl *DD)

Definition ASTReaderDecl.cpp:900

RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)

Definition ASTReaderDecl.cpp:706

void VisitFriendDecl(FriendDecl *D)

Definition ASTReaderDecl.cpp:2392

void VisitLinkageSpecDecl(LinkageSpecDecl *D)

Definition ASTReaderDecl.cpp:1835

void VisitCXXRecordDecl(CXXRecordDecl *D)

Definition ASTReaderDecl.cpp:337

ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)

Definition ASTReaderDecl.cpp:273

void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)

Definition ASTReaderDecl.cpp:1769

void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)

Definition ASTReaderDecl.cpp:2434

void VisitNamedDecl(NamedDecl *ND)

Definition ASTReaderDecl.cpp:692

void mergeMergeable(Mergeable< T > *D)

Attempts to merge the given declaration (D) with another declaration of the same entity,...

Definition ASTReaderDecl.cpp:3051

void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)

Definition ASTReaderDecl.cpp:2501

static Decl * getMostRecentDecl(Decl *D)

Definition ASTReaderDecl.cpp:3592

void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)

Definition ASTReaderDecl.cpp:1474

void VisitCXXConstructorDecl(CXXConstructorDecl *D)

Definition ASTReaderDecl.cpp:2325

void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)

Definition ASTReaderDecl.cpp:675

void VisitImplicitParamDecl(ImplicitParamDecl *PD)

Definition ASTReaderDecl.cpp:1723

void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)

Definition ASTReaderDecl.cpp:1963

void Visit(Decl *D)

Definition ASTReaderDecl.cpp:526

static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)

Definition ASTReaderDecl.cpp:311

void VisitMSPropertyDecl(MSPropertyDecl *FD)

Definition ASTReaderDecl.cpp:1557

void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)

Definition ASTReaderDecl.cpp:342

void VisitFieldDecl(FieldDecl *FD)

Definition ASTReaderDecl.cpp:1537

RedeclarableResult VisitVarDeclImpl(VarDecl *D)

Definition ASTReaderDecl.cpp:1611

void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)

Definition ASTReaderDecl.cpp:3102

void VisitCapturedDecl(CapturedDecl *CD)

Definition ASTReaderDecl.cpp:1822

void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)

Definition ASTReaderDecl.cpp:2729

void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)

Definition ASTReaderDecl.cpp:1298

RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)

Definition ASTReaderDecl.cpp:2222

void VisitAccessSpecDecl(AccessSpecDecl *D)

Definition ASTReaderDecl.cpp:2387

void VisitCXXMethodDecl(CXXMethodDecl *D)

Definition ASTReaderDecl.cpp:2307

void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)

Definition ASTReaderDecl.cpp:3113

void VisitOMPAllocateDecl(OMPAllocateDecl *D)

Definition ASTReaderDecl.cpp:3075

void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)

Definition ASTReaderDecl.cpp:1525

static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)

Definition ASTReaderDecl.cpp:3870

static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)

Definition ASTReaderDecl.cpp:3892

RedeclarableResult VisitTagDecl(TagDecl *TD)

Definition ASTReaderDecl.cpp:737

ObjCTypeParamList * ReadObjCTypeParamList()

Definition ASTReaderDecl.cpp:1228

void VisitHLSLBufferDecl(HLSLBufferDecl *D)

Definition ASTReaderDecl.cpp:1882

void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)

Definition ASTReaderDecl.cpp:3070

void VisitDecl(Decl *D)

Definition ASTReaderDecl.cpp:568

void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)

Definition ASTReaderDecl.cpp:2295

void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)

Definition ASTReaderDecl.cpp:1946

void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)

Definition ASTReaderDecl.cpp:2752

static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)

Definition ASTReaderDecl.cpp:3764

void VisitUsingEnumDecl(UsingEnumDecl *D)

Definition ASTReaderDecl.cpp:1914

void VisitObjCImplDecl(ObjCImplDecl *D)

Definition ASTReaderDecl.cpp:1502

void VisitTranslationUnitDecl(TranslationUnitDecl *TU)

Definition ASTReaderDecl.cpp:688

void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)

Definition ASTReaderDecl.cpp:1576

void VisitTypeDecl(TypeDecl *TD)

Definition ASTReaderDecl.cpp:698

void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)

Definition ASTReaderDecl.cpp:1507

void VisitEnumConstantDecl(EnumConstantDecl *ECD)

Definition ASTReaderDecl.cpp:892

void VisitTypeAliasDecl(TypeAliasDecl *TD)

Definition ASTReaderDecl.cpp:728

static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)

Definition ASTReaderDecl.cpp:3631

void VisitConceptDecl(ConceptDecl *D)

Definition ASTReaderDecl.cpp:2428

void VisitObjCPropertyDecl(ObjCPropertyDecl *D)

Definition ASTReaderDecl.cpp:1479

void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)

Definition ASTReaderDecl.cpp:1813

void VisitObjCIvarDecl(ObjCIvarDecl *D)

Definition ASTReaderDecl.cpp:1335

void VisitUsingPackDecl(UsingPackDecl *D)

Definition ASTReaderDecl.cpp:1925

void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)

Definition ASTReaderDecl.cpp:2611

void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)

Definition ASTReaderDecl.cpp:3085

RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)

TODO: Unify with ClassTemplateSpecializationDecl version?

Definition ASTReaderDecl.cpp:2625

void VisitUsingDecl(UsingDecl *D)

Definition ASTReaderDecl.cpp:1902

void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)

Definition ASTReaderDecl.cpp:1438

void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)

TODO: Unify with ClassTemplatePartialSpecializationDecl version?

Definition ASTReaderDecl.cpp:2692

void VisitParmVarDecl(ParmVarDecl *PD)

Definition ASTReaderDecl.cpp:1727

void VisitVarTemplateDecl(VarTemplateDecl *D)

TODO: Unify with ClassTemplateDecl version?

Definition ASTReaderDecl.cpp:2508

static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)

Definition ASTReaderDecl.cpp:3832

void VisitClassTemplateDecl(ClassTemplateDecl *D)

Definition ASTReaderDecl.cpp:2489

void VisitCXXDestructorDecl(CXXDestructorDecl *D)

Definition ASTReaderDecl.cpp:2339

void VisitTemplateDecl(TemplateDecl *D)

Definition ASTReaderDecl.cpp:2420

void VisitCXXConversionDecl(CXXConversionDecl *D)

Definition ASTReaderDecl.cpp:2372

void VisitTypedefDecl(TypedefDecl *TD)

Definition ASTReaderDecl.cpp:723

void VisitOMPRequiresDecl(OMPRequiresDecl *D)

Definition ASTReaderDecl.cpp:3080

RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)

Definition ASTReaderDecl.cpp:828

void VisitDecompositionDecl(DecompositionDecl *DD)

Definition ASTReaderDecl.cpp:1755

void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)

Definition ASTReaderDecl.cpp:2448

Reads an AST files chain containing the contents of a translation unit.

bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const

Returns true if global DeclID ID originated from module M.

DiagnosticBuilder Diag(unsigned DiagID) const

Report a diagnostic.

ASTContext & getContext()

Retrieve the AST context that this AST reader supplements.

Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)

Reads a declaration from the given position in a record in the given module.

ModuleFile * getOwningModuleFile(const Decl *D) const

Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...

T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)

Reads a declaration from the given position in a record in the given module.

LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)

Map a global declaration ID into the declaration ID used to refer to this declaration within the give...

friend class ASTDeclReader

Decl * GetDecl(GlobalDeclID ID)

Resolve a declaration ID into a declaration, potentially building a new declaration.

SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const

Read a source location from raw form.

void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)

friend class ASTRecordReader

SmallVector< uint64_t, 64 > RecordData

serialization::ModuleFile ModuleFile

An object for streaming information from a record.

bool readBool()

Read a boolean value, advancing Idx.

std::string readString()

Read a string, advancing Idx.

SourceRange readSourceRange()

Read a source range, advancing Idx.

SourceLocation readSourceLocation()

Read a source location, advancing Idx.

void readAttributes(AttrVec &Attrs)

Reads attributes from the current stream position, advancing Idx.

Definition ASTReaderDecl.cpp:3217

T * readDeclAs()

Reads a declaration from the given position in the record, advancing Idx.

IdentifierInfo * readIdentifier()

ASTContext & getContext()

Retrieve the AST context that this AST reader supplements.

TypeSourceInfo * readTypeSourceInfo()

Reads a declarator info from the given record, advancing Idx.

OMPTraitInfo * readOMPTraitInfo()

Read an OMPTraitInfo object, advancing Idx.

VersionTuple readVersionTuple()

Read a version tuple, advancing Idx.

uint64_t readInt()

Returns the current value in this record, and advances to the next value.

Attr * readAttr()

Reads one attribute from the current stream position, advancing Idx.

Definition ASTReaderDecl.cpp:3181

Expr * readExpr()

Reads an expression.

Represents an access specifier followed by colon ':'.

static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setColonLoc(SourceLocation CLoc)

Sets the location of the colon.

Attr - This represents one attribute.

Attr * clone(ASTContext &C) const

Syntax

The style used to specify an attribute.

@ AS_Keyword

__ptr16, alignas(...), etc.

A binding in a decomposition declaration.

static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

A simple helper class to unpack an integer to bits and consuming the bits in order.

uint32_t getNextBits(uint32_t Width)

A class which contains all the information about a particular captured value.

Represents a block literal declaration, which is like an unnamed FunctionDecl.

void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)

void setDoesNotEscape(bool B=true)

void setSignatureAsWritten(TypeSourceInfo *Sig)

void setCanAvoidCopyToHeap(bool B=true)

void setIsConversionFromLambda(bool val=true)

void setBlockMissingReturnType(bool val=true)

static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setIsVariadic(bool value)

void setBody(CompoundStmt *B)

void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)

Represents the builtin template declaration which is used to implement __make_integer_seq and other b...

Represents a C++ constructor within a class.

static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)

void setExplicitSpecifier(ExplicitSpecifier ES)

bool isInheritingConstructor() const

Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...

Represents a C++ conversion function within a class.

void setExplicitSpecifier(ExplicitSpecifier ES)

static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a C++ deduction guide declaration.

void setDeductionCandidateKind(DeductionCandidate K)

void setSourceDeductionGuide(CXXDeductionGuideDecl *DG)

static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setSourceDeductionGuideKind(SourceDeductionGuideKind SK)

Represents a C++ destructor within a class.

static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

CXXDestructorDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

Represents a static or instance method of a struct/union/class.

static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

CXXMethodDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

Represents a C++ struct/union/class.

CXXRecordDecl * getDefinition() const

static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)

unsigned getODRHash() const

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this class is an instantiation of a member class of a class template specialization,...

CXXRecordDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

Represents the body of a CapturedStmt, and serves as its DeclContext.

static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)

void setContextParam(unsigned i, ImplicitParamDecl *P)

void setNothrow(bool Nothrow=true)

void setParam(unsigned i, ImplicitParamDecl *P)

Declaration of a class template.

static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Create an empty class template node.

static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a class template specialization, which refers to a class template with a given set of temp...

static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)

Set the template argument list as written in the sources.

Declaration of a C++20 concept.

static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

A reference to a concept and its template args, as it appears in the code.

Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...

static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)

DeclContext - This is used only as base class of specific decl types that can act as declaration cont...

lookup_result::iterator lookup_iterator

bool isFileContext() const

void setHasExternalVisibleStorage(bool ES=true) const

State whether this DeclContext has external storage for declarations visible in this context.

DeclContextLookupResult lookup_result

lookup_result lookup(DeclarationName Name) const

lookup - Find the declarations (if any) with the given Name in this context.

bool isTranslationUnit() const

DeclContext * getRedeclContext()

getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...

DeclContext * getPrimaryContext()

getPrimaryContext - There may be many different declarations of the same entity (including forward de...

bool isFunctionOrMethod() const

DeclContext * getNonTransparentContext()

DeclID getRawValue() const

A simple visitor class that helps create declaration visitors.

Decl - This represents one declaration (or definition), e.g.

Decl * getPreviousDecl()

Retrieve the previous declaration that declares the same entity as this declaration,...

Decl * getMostRecentDecl()

Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...

FriendObjectKind getFriendObjectKind() const

Determines whether this declaration is the object of a friend declaration and, if so,...

ASTContext & getASTContext() const LLVM_READONLY

void setOwningModuleID(unsigned ID)

Set the owning module ID.

void setLocalExternDecl()

Changes the namespace of this declaration to reflect that it's a function-local extern declaration.

void setTopLevelDeclInObjCContainer(bool V=true)

void markUsed(ASTContext &C)

Mark the declaration used, in the sense of odr-use.

bool isCanonicalDecl() const

Whether this particular Decl is a canonical one.

Module * getOwningModule() const

Get the module that owns this declaration (for visibility purposes).

Module * getImportedOwningModule() const

Get the imported owning module, if this decl is from an imported (non-local) module.

ObjCDeclQualifier

ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...

bool isFromASTFile() const

Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...

bool isTemplateParameter() const

isTemplateParameter - Determines whether this declaration is a template parameter.

bool isInvalidDecl() const

unsigned FromASTFile

Whether this declaration was loaded from an AST file.

void setAccess(AccessSpecifier AS)

SourceLocation getLocation() const

IdentifierNamespace

IdentifierNamespace - The different namespaces in which declarations may appear.

@ IDNS_Ordinary

Ordinary names.

@ IDNS_Type

Types, declared with 'struct foo', typedefs, etc.

@ IDNS_Tag

Tags, declared with 'struct foo;' and referenced with 'struct foo'.

bool isTemplateParameterPack() const

isTemplateParameter - Determines whether this declaration is a template parameter pack.

void setImplicit(bool I=true)

void setReferenced(bool R=true)

void setLocation(SourceLocation L)

DeclContext * getDeclContext()

void setCachedLinkage(Linkage L) const

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.

ModuleOwnershipKind

The kind of ownership a declaration has, for visibility purposes.

@ VisibleWhenImported

This declaration has an owning module, and is visible when that module is imported.

@ Unowned

This declaration is not owned by a module.

@ ReachableWhenImported

This declaration has an owning module, and is visible to lookups that occurs within that module.

@ ModulePrivate

This declaration has an owning module, but is only visible to lookups that occur within that module.

@ Visible

This declaration has an owning module, but is globally visible (typically because its owning module i...

void setModuleOwnershipKind(ModuleOwnershipKind MOK)

Set whether this declaration is hidden from name lookup.

bool shouldEmitInExternalSource() const

Whether the definition of the declaration should be emitted in external sources.

void setVisibleDespiteOwningModule()

Set that this declaration is globally visible, even if it came from a module that is not visible.

The name of a declaration.

IdentifierInfo * getAsIdentifierInfo() const

Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...

Selector getObjCSelector() const

Get the Objective-C selector stored in this declaration name.

Represents a ValueDecl that came out of a declarator.

void setInnerLocStart(SourceLocation L)

void setTypeSourceInfo(TypeSourceInfo *TI)

TypeSourceInfo * getTypeSourceInfo() const

A decomposition declaration.

static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)

Represents an empty-declaration.

static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

An instance of this object exists for each enum constant that is defined.

static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setInitExpr(Expr *E)

void setInitVal(const ASTContext &C, const llvm::APSInt &V)

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this enumeration is an instantiation of a member enumeration of a class template specialization,...

void setFixed(bool Fixed=true)

True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.

void setIntegerType(QualType T)

Set the underlying integer type.

void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)

Set the underlying integer type source info.

static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setScoped(bool Scoped=true)

True if this tag declaration is a scoped enumeration.

void setPromotionType(QualType T)

Set the promotion type.

EnumDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

void setScopedUsingClassTag(bool ScopedUCT=true)

If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...

Represents a standard C++ module export declaration.

static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

This represents one expression.

RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.

Represents a member of a struct/union/class.

void setBitWidth(Expr *Width)

Set the bit-field width for this member.

static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

const VariableArrayType * CapturedVLAType

void setRParenLoc(SourceLocation L)

void setAsmString(Expr *Asm)

static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

FriendDecl - Represents the declaration of a friend entity, which can be a function,...

static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned FriendTypeNumTPLists)

Declaration of a friend template.

static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)

Represents a function declaration or definition.

void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)

FunctionTemplateDecl * getDescribedFunctionTemplate() const

Retrieves the function template that is described by this function declaration.

void setIsPureVirtual(bool P=true)

void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)

void setFriendConstraintRefersToEnclosingTemplate(bool V=true)

void setHasSkippedBody(bool Skipped=true)

static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setUsesSEHTry(bool UST)

void setIsMultiVersion(bool V=true)

Sets the multiversion state for this declaration and all of its redeclarations.

void setHasWrittenPrototype(bool P=true)

State that this function has a written prototype.

bool isExplicitlyDefaulted() const

Whether this function is explicitly defaulted.

MemberSpecializationInfo * getMemberSpecializationInfo() const

If this function is an instantiation of a member function of a class template specialization,...

FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const

If this function is actually a function template specialization, retrieve information about this func...

void setDefaultLoc(SourceLocation NewLoc)

void setInstantiatedFromMemberTemplate(bool Val=true)

void setInlineSpecified(bool I)

Set whether the "inline" keyword was specified for this function.

TemplatedKind

The kind of templated function a FunctionDecl can be.

@ TK_MemberSpecialization

@ TK_DependentNonTemplate

@ TK_FunctionTemplateSpecialization

@ TK_DependentFunctionTemplateSpecialization

TemplatedKind getTemplatedKind() const

What kind of templated function this is.

void setInstantiatedFromDecl(FunctionDecl *FD)

Specify that this function declaration was instantiated from a FunctionDecl FD.

bool isDeletedAsWritten() const

void setHasInheritedPrototype(bool P=true)

State that this function inherited its prototype from a previous declaration.

void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)

Specifies that this function declaration is actually a dependent function template specialization.

void setVirtualAsWritten(bool V)

State that this function is marked as virtual explicitly.

void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)

void setLateTemplateParsed(bool ILT=true)

State that this templated function will be late parsed.

void setImplicitlyInline(bool I=true)

Flag that this function is implicitly inline.

void setTrivialForCall(bool IT)

void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)

bool isDefaulted() const

Whether this function is defaulted.

void setIneligibleOrNotSelected(bool II)

void setConstexprKind(ConstexprSpecKind CSK)

void setDefaulted(bool D=true)

void setStorageClass(StorageClass SClass)

Sets the storage class as written in the source.

void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)

void setExplicitlyDefaulted(bool ED=true)

State that this function is explicitly defaulted.

void setHasImplicitReturnZero(bool IRZ)

State that falling off this function implicitly returns null/zero.

Represents a prototype with parameter type info, e.g.

ExceptionSpecificationType getExceptionSpecType() const

Get the kind of exception specification on this function.

Declaration of a template function.

static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Create an empty function template node.

Provides information about a function template specialization, which is a FunctionDecl that has been ...

FunctionTemplateDecl * getTemplate() const

Retrieve the template from which this function was specialized.

static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)

void Profile(llvm::FoldingSetNodeID &ID)

FunctionDecl * getFunction() const

Retrieve the declaration of the function template specialization.

FunctionType - C99 6.7.5.3 - Function Declarators.

QualType getReturnType() const

HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.

static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

One of these records is kept for each identifier that is lexed.

void setOutOfDate(bool OOD)

Set whether the information for this identifier is out of date with respect to the external source.

bool isOutOfDate() const

Determine whether the information for this identifier is out of date with respect to the external sou...

iterator begin(DeclarationName Name)

Returns an iterator over decls with the name 'Name'.

iterator end()

Returns the end iterator.

void setTemplateArguments(ArrayRef< TemplateArgument > Converted)

static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)

static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Describes a module import declaration, which makes the contents of the named module visible in the cu...

static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)

Create a new, deserialized module import declaration.

Represents a field injected from an anonymous union/struct into the parent scope.

static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setInherited(bool I)

Description of a constructor that was inherited from a base class.

Represents the declaration of a label.

void setLocStart(SourceLocation L)

static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Describes the capture of a variable or of this, or of a C++1y init-capture.

LambdaCaptureKind getCaptureKind() const

Determine the kind of capture.

Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...

unsigned getManglingNumber() const

static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

ValueDecl * getExtendingDecl()

Represents a linkage specification.

void setExternLoc(SourceLocation L)

void setLanguage(LinkageSpecLanguageIDs L)

Set the language specified by this linkage specification.

void setRBraceLoc(SourceLocation L)

static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents the results of name lookup.

An instance of this class represents the declaration of a property member.

static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Provides information a specialization of a member of a class template, which may be a member function...

void setPointOfInstantiation(SourceLocation POI)

Set the first point of instantiation.

Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...

Describes a module or submodule.

@ AllVisible

All of the names in this module are visible.

std::string Name

The name of this module.

bool isGlobalModule() const

Does this Module scope describe a fragment of the global module within some C++ module.

@ ModuleMapModule

This is a module that was defined by a module map and built out of header files.

bool isNamedModule() const

Does this Module is a named module of a standard named module?

Module * getTopLevelModule()

Retrieve the top-level module for this (sub)module, which may be this 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.

void setDeclName(DeclarationName N)

Set the name of this declaration.

Represents a C++ namespace alias.

static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represent a C++ namespace.

void setAnonymousNamespace(NamespaceDecl *D)

void setNested(bool Nested)

Set whether this is a nested namespace declaration.

void setInline(bool Inline)

Set whether this is an inline namespace declaration.

static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.

static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)

unsigned getNumExpansionTypes() const

Retrieves the number of expansion types in an expanded parameter pack.

bool isExpandedParameterPack() const

Whether this parameter is a non-type template parameter pack that has a known list of different types...

void setPosition(unsigned P)

void setDepth(unsigned D)

bool hasPlaceholderTypeConstraint() const

Determine whether this non-type template parameter's type has a placeholder with a type-constraint.

void setPlaceholderTypeConstraint(Expr *E)

void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)

Set the default argument for this template parameter, and whether that default argument was inherited...

This represents 'pragma omp allocate ...' directive.

static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)

Pseudo declaration for capturing expressions.

static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

OMPChildren * Data

Data, associated with the directive.

This represents 'pragma omp declare mapper ...' directive.

static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)

Creates deserialized declare mapper node.

This represents 'pragma omp declare reduction ...' directive.

void setInitializerData(Expr *OrigE, Expr *PrivE)

Set initializer Orig and Priv vars.

void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)

Set initializer expression for the declare reduction construct.

void setCombiner(Expr *E)

Set combiner expression for the declare reduction construct.

void setCombinerData(Expr *InE, Expr *OutE)

Set combiner In and Out vars.

static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Create deserialized declare reduction node.

This represents 'pragma omp requires...' directive.

static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)

Create deserialized requires node.

This represents 'pragma omp threadprivate ...' directive.

static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)

Represents a field declaration created by an @defs(...).

static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

ObjCCategoryDecl - Represents a category declaration.

void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)

setProtocolList - Set the list of protocols that this interface implements.

static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setIvarLBraceLoc(SourceLocation Loc)

void setCategoryNameLoc(SourceLocation Loc)

void setIvarRBraceLoc(SourceLocation Loc)

bool IsClassExtension() const

ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.

static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

ObjCCompatibleAliasDecl - Represents alias of a class.

static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setClassInterface(ObjCInterfaceDecl *D)

ObjCContainerDecl - Represents a container for method declarations.

void setAtStartLoc(SourceLocation Loc)

void setAtEndRange(SourceRange atEnd)

void setClassInterface(ObjCInterfaceDecl *IFace)

ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...

static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setIvarLBraceLoc(SourceLocation Loc)

void setSuperClass(ObjCInterfaceDecl *superCls)

void setIvarRBraceLoc(SourceLocation Loc)

void setHasDestructors(bool val)

void setHasNonZeroConstructors(bool val)

Represents an ObjC class declaration.

void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)

mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...

ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)

unsigned getODRHash()

Get precomputed ODRHash or add a new one.

static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)

ObjCInterfaceDecl * getCanonicalDecl() override

Retrieves the canonical declaration of this Objective-C class.

ObjCIvarDecl - Represents an ObjC instance variable.

void setAccessControl(AccessControl ac)

void setNextIvar(ObjCIvarDecl *ivar)

ObjCInterfaceDecl * getContainingInterface()

Return the class interface that this ivar is logically contained in; this is either the interface whe...

void setSynthesize(bool synth)

static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

ObjCMethodDecl - Represents an instance or class method declaration.

void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)

void setObjCDeclQualifier(ObjCDeclQualifier QV)

void setDefined(bool isDefined)

void setSelfDecl(ImplicitParamDecl *SD)

void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)

void setHasRedeclaration(bool HRD) const

void setIsRedeclaration(bool RD)

void setCmdDecl(ImplicitParamDecl *CD)

bool hasRedeclaration() const

True if redeclared in the same interface.

void setRelatedResultType(bool RRT=true)

Note whether this method has a related result type.

void setOverriding(bool IsOver)

void setPropertyAccessor(bool isAccessor)

void setDeclImplementation(ObjCImplementationControl ic)

void setReturnType(QualType T)

static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setHasSkippedBody(bool Skipped=true)

void setInstanceMethod(bool isInst)

void setVariadic(bool isVar)

Represents one property declaration in an Objective-C interface.

void setAtLoc(SourceLocation L)

void setPropertyImplementation(PropertyControl pc)

void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())

void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)

static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)

void setLParenLoc(SourceLocation L)

void setPropertyIvarDecl(ObjCIvarDecl *Ivar)

void setSetterMethodDecl(ObjCMethodDecl *gDecl)

void setType(QualType T, TypeSourceInfo *TSI)

void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())

void setGetterMethodDecl(ObjCMethodDecl *gDecl)

ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...

void setSetterMethodDecl(ObjCMethodDecl *MD)

void setSetterCXXAssignment(Expr *setterCXXAssignment)

static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setGetterMethodDecl(ObjCMethodDecl *MD)

void setAtLoc(SourceLocation Loc)

void setPropertyDecl(ObjCPropertyDecl *Prop)

void setGetterCXXConstructor(Expr *getterCXXConstructor)

Represents an Objective-C protocol declaration.

static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

ObjCProtocolDecl * getCanonicalDecl() override

Retrieves the canonical declaration of this Objective-C protocol.

unsigned getODRHash()

Get precomputed ODRHash or add a new one.

Represents the declaration of an Objective-C type parameter.

static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)

Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...

static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)

Create a new Objective-C type parameter list.

static OpenACCDeclareDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)

static OpenACCRoutineDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)

Represents a partial function definition.

void setNothrow(bool Nothrow=true)

static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)

void setParam(unsigned i, ImplicitParamDecl *P)

Represents a parameter to a function.

static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setUninstantiatedDefaultArg(Expr *arg)

void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)

void setObjCMethodScopeInfo(unsigned parameterIndex)

Represents a #pragma detect_mismatch line.

static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)

A (possibly-)qualified type.

bool isNull() const

Return true if this QualType doesn't point to a type yet.

Represents a struct/union/class.

unsigned getODRHash()

Get precomputed ODRHash or add a new one.

void setAnonymousStructOrUnion(bool Anon)

void setArgPassingRestrictions(RecordArgPassingKind Kind)

void setNonTrivialToPrimitiveCopy(bool V)

void setHasNonTrivialToPrimitiveCopyCUnion(bool V)

void setHasNonTrivialToPrimitiveDestructCUnion(bool V)

void setHasFlexibleArrayMember(bool V)

void setParamDestroyedInCallee(bool V)

void setNonTrivialToPrimitiveDestroy(bool V)

void setHasObjectMember(bool val)

void setHasVolatileMember(bool val)

void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)

static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)

void setHasUninitializedExplicitInitFields(bool V)

void setNonTrivialToPrimitiveDefaultInitialize(bool V)

Declaration of a redeclarable template.

CommonBase * Common

Pointer to the common data shared by all declarations of this template.

virtual CommonBase * newCommon(ASTContext &C) const =0

RedeclarableTemplateDecl * getCanonicalDecl() override

Retrieves the canonical declaration of this template.

void setMemberSpecialization()

Note that this member template is a specialization.

void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)

void setPrevious(decl_type *D)

Decl * getLatestNotUpdated() const

void setLatest(decl_type *D)

Provides common interface for the Decls that can be redeclared.

DeclLink RedeclLink

Points to the next redeclaration in the chain.

bool isFirstDecl() const

True if this is the first declaration in its redeclaration chain.

static DeclLink PreviousDeclLink(decl_type *D)

Represents the body of a requires-expression.

static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

const FunctionDecl * getKernelEntryPointDecl() const

Encodes a location in the source.

A trivial tuple used to represent a source range.

Represents a C++11 static_assert declaration.

static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

StringLiteral - This represents a string literal expression, e.g.

Represents the declaration of a struct/union/class/enum.

void setTagKind(TagKind TK)

void setCompleteDefinitionRequired(bool V=true)

True if this complete decl is required to be complete for some existing use.

void demoteThisDefinitionToDeclaration()

Mark a definition as a declaration and maintain information it was a definition.

redecl_range redecls() const

Returns an iterator range for all the redeclarations of the same decl.

bool isThisDeclarationADefinition() const

Return true if this declaration is a completion definition of the type.

void setEmbeddedInDeclarator(bool isInDeclarator)

True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...

bool isCompleteDefinition() const

Return true if this decl has its body fully specified.

bool isFirstDecl() const

True if this is the first declaration in its redeclaration chain.

TagDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

void setFreeStanding(bool isFreeStanding=true)

True if this tag is free standing, e.g. "struct foo;".

void setBraceRange(SourceRange R)

void setCompleteDefinition(bool V=true)

True if this decl has its body fully specified.

A convenient class for passing around template argument information.

A template argument list.

static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)

Create a new template argument list that copies the given set of template arguments.

The base class of all kinds of template declarations (e.g., class, function, etc.).

TemplateParameterList * TemplateParams

void init(NamedDecl *NewTemplatedDecl)

Initialize the underlying templated declaration.

NamedDecl * getTemplatedDecl() const

Get the underlying, templated declaration.

TemplateParameterList * getTemplateParameters() const

Get the list of template parameters.

A template parameter object.

TemplateParamObjectDecl * getCanonicalDecl() override

Retrieves the "canonical" declaration of the given declaration.

Stores a list of template parameters for a TemplateDecl and its derived classes.

TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.

unsigned getNumExpansionTemplateParameters() const

Retrieves the number of expansion template parameters in an expanded parameter pack.

static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setPosition(unsigned P)

void setDepth(unsigned D)

void setDeclaredWithTypename(bool withTypename)

Set whether this template template parameter was declared with the 'typename' or 'class' keyword.

void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)

Set the default argument for this template parameter, and whether that default argument was inherited...

bool isExpandedParameterPack() const

Whether this parameter is a template template parameter pack that has a known list of different templ...

Declaration of a template type parameter.

void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)

static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)

bool hasTypeConstraint() const

Determine whether this template parameter has a type-constraint.

void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)

Set the default argument for this template parameter.

void setDeclaredWithTypename(bool withTypename)

Set whether this template type parameter was declared with the 'typename' or 'class' keyword.

A declaration that models statements at global scope.

static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

The top declaration context.

Represents the declaration of a typedef-name via a C++11 alias-declaration.

static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)

Declaration of an alias template.

static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Create an empty alias template node.

Represents a declaration of a type.

void setLocStart(SourceLocation L)

A container of type source information.

QualType getType() const

Return the type wrapped by this type source info.

const T * castAs() const

Member-template castAs.

AutoType * getContainedAutoType() const

Get the AutoType whose type will be deduced for a variable with an initializer of this type.

const T * getAs() const

Member-template getAs'.

Represents the declaration of a typedef-name via the 'typedef' type specifier.

static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Base class for declarations which introduce a typedef-name.

void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)

void setTypeSourceInfo(TypeSourceInfo *newType)

An artificial decl, representing a global anonymous constant value which is uniquified by value withi...

void addDecl(NamedDecl *D)

A set of unresolved declarations.

This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...

static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)

Represents a dependent using declaration which was marked with typename.

static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a dependent using declaration which was not marked with typename.

void setUsingLoc(SourceLocation L)

Set the source location of the 'using' keyword.

static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a C++ using-declaration.

void setTypename(bool TN)

Sets whether the using declaration has 'typename'.

void setUsingLoc(SourceLocation L)

Set the source location of the 'using' keyword.

static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents C++ using-directive.

static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a C++ using-enum-declaration.

void setEnumType(TypeSourceInfo *TSI)

void setEnumLoc(SourceLocation L)

void setUsingLoc(SourceLocation L)

static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a pack of using declarations that a single using-declarator pack-expanded into.

static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)

Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...

static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...

void setType(QualType newType)

Represents a variable declaration or definition.

ParmVarDeclBitfields ParmVarDeclBits

static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

VarDeclBitfields VarDeclBits

EvaluatedStmt * ensureEvaluatedStmt() const

Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...

NonParmVarDeclBitfields NonParmVarDeclBits

@ Definition

This declaration is definitely a definition.

void setDescribedVarTemplate(VarTemplateDecl *Template)

StorageClass getStorageClass() const

Returns the storage class as written in the source.

VarDecl * getPreviousDecl()

Return the previous declaration of this declaration or NULL if this is the first declaration.

Declaration of a variable template.

static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Create an empty variable template node.

static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

Represents a variable template specialization, which refers to a variable template with a given set o...

void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)

Set the template argument list as written in the sources.

static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)

RawLocEncoding getRawLoc() const

uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const

Information about a module that has been loaded by the ASTReader.

const serialization::ObjCCategoriesInfo * ObjCCategoriesMap

Array of category list location information within this module file, sorted by the definition ID.

unsigned LocalNumObjCCategoriesInMap

The number of redeclaration info entries in ObjCCategoriesMap.

llvm::BitstreamCursor DeclsCursor

DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.

uint64_t GlobalBitOffset

The global bit offset (or base) of this module.

const DeclOffset * DeclOffsets

Offset of each declaration within the bitstream, indexed by the declaration ID (-1).

unsigned Generation

The generation of which this module file is a part.

uint64_t DeclsBlockStartOffset

The offset to the start of the DECLTYPES_BLOCK block.

ModuleKind Kind

The type of this module.

SmallVector< uint64_t, 1 > ObjCCategories

The Objective-C category lists for categories known to this module.

const unsigned int LOCAL_REDECLARATIONS

Record code for a list of local redeclarations of a declaration.

DeclCode

Record codes for each kind of declaration.

const unsigned int DECL_UPDATES

Record of updates for a declaration that was modified after being deserialized.

@ DECL_EMPTY

An EmptyDecl record.

@ DECL_CAPTURED

A CapturedDecl record.

@ DECL_CXX_BASE_SPECIFIERS

A record containing CXXBaseSpecifiers.

@ DECL_CXX_RECORD

A CXXRecordDecl record.

@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION

A VarTemplatePartialSpecializationDecl record.

@ DECL_OMP_ALLOCATE

An OMPAllocateDcl record.

@ DECL_MS_PROPERTY

A MSPropertyDecl record.

@ DECL_OMP_DECLARE_MAPPER

An OMPDeclareMapperDecl record.

@ DECL_TOP_LEVEL_STMT_DECL

A TopLevelStmtDecl record.

@ DECL_REQUIRES_EXPR_BODY

A RequiresExprBodyDecl record.

@ DECL_STATIC_ASSERT

A StaticAssertDecl record.

@ DECL_INDIRECTFIELD

A IndirectFieldDecl record.

@ DECL_TEMPLATE_TEMPLATE_PARM

A TemplateTemplateParmDecl record.

@ DECL_IMPORT

An ImportDecl recording a module import.

@ DECL_UNNAMED_GLOBAL_CONSTANT

A UnnamedGlobalConstantDecl record.

@ DECL_ACCESS_SPEC

An AccessSpecDecl record.

@ DECL_OBJC_TYPE_PARAM

An ObjCTypeParamDecl record.

@ DECL_OBJC_CATEGORY_IMPL

A ObjCCategoryImplDecl record.

@ DECL_ENUM_CONSTANT

An EnumConstantDecl record.

@ DECL_PARM_VAR

A ParmVarDecl record.

@ DECL_TYPEDEF

A TypedefDecl record.

@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK

A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.

@ DECL_HLSL_BUFFER

A HLSLBufferDecl record.

@ DECL_NAMESPACE_ALIAS

A NamespaceAliasDecl record.

@ DECL_TYPEALIAS

A TypeAliasDecl record.

@ DECL_FUNCTION_TEMPLATE

A FunctionTemplateDecl record.

@ DECL_MS_GUID

A MSGuidDecl record.

@ DECL_UNRESOLVED_USING_TYPENAME

An UnresolvedUsingTypenameDecl record.

@ DECL_CLASS_TEMPLATE_SPECIALIZATION

A ClassTemplateSpecializationDecl record.

@ DECL_FILE_SCOPE_ASM

A FileScopeAsmDecl record.

@ DECL_PARTIAL_SPECIALIZATIONS

@ DECL_CXX_CONSTRUCTOR

A CXXConstructorDecl record.

@ DECL_CXX_CONVERSION

A CXXConversionDecl record.

@ DECL_FIELD

A FieldDecl record.

@ DECL_LINKAGE_SPEC

A LinkageSpecDecl record.

@ DECL_CONTEXT_TU_LOCAL_VISIBLE

A record that stores the set of declarations that are only visible to the TU.

@ DECL_NAMESPACE

A NamespaceDecl record.

@ DECL_NON_TYPE_TEMPLATE_PARM

A NonTypeTemplateParmDecl record.

@ DECL_USING_PACK

A UsingPackDecl record.

@ DECL_FUNCTION

A FunctionDecl record.

@ DECL_USING_DIRECTIVE

A UsingDirecitveDecl record.

@ DECL_RECORD

A RecordDecl record.

@ DECL_CONTEXT_LEXICAL

A record that stores the set of declarations that are lexically stored within a given DeclContext.

@ DECL_OUTLINEDFUNCTION

A OutlinedFunctionDecl record.

@ DECL_BLOCK

A BlockDecl record.

@ DECL_UNRESOLVED_USING_VALUE

An UnresolvedUsingValueDecl record.

@ DECL_TYPE_ALIAS_TEMPLATE

A TypeAliasTemplateDecl record.

@ DECL_CXX_CTOR_INITIALIZERS

A record containing CXXCtorInitializers.

@ DECL_OBJC_CATEGORY

A ObjCCategoryDecl record.

@ DECL_VAR

A VarDecl record.

@ DECL_UNRESOLVED_USING_IF_EXISTS

An UnresolvedUsingIfExistsDecl record.

@ DECL_USING

A UsingDecl record.

@ DECL_OBJC_PROTOCOL

A ObjCProtocolDecl record.

@ DECL_TEMPLATE_TYPE_PARM

A TemplateTypeParmDecl record.

@ DECL_VAR_TEMPLATE_SPECIALIZATION

A VarTemplateSpecializationDecl record.

@ DECL_OBJC_IMPLEMENTATION

A ObjCImplementationDecl record.

@ DECL_LABEL

A LabelDecl record.

@ DECL_OBJC_COMPATIBLE_ALIAS

A ObjCCompatibleAliasDecl record.

@ DECL_CONSTRUCTOR_USING_SHADOW

A ConstructorUsingShadowDecl record.

@ DECL_USING_ENUM

A UsingEnumDecl record.

@ DECL_FRIEND_TEMPLATE

A FriendTemplateDecl record.

@ DECL_PRAGMA_DETECT_MISMATCH

A PragmaDetectMismatchDecl record.

@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK

A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.

@ DECL_OBJC_AT_DEFS_FIELD

A ObjCAtDefsFieldDecl record.

@ DECL_IMPLICIT_PARAM

An ImplicitParamDecl record.

@ DECL_FRIEND

A FriendDecl record.

@ DECL_CXX_METHOD

A CXXMethodDecl record.

@ DECL_EXPORT

An ExportDecl record.

@ DECL_BINDING

A BindingDecl record.

@ DECL_PRAGMA_COMMENT

A PragmaCommentDecl record.

@ DECL_ENUM

An EnumDecl record.

@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE

A record containing the set of declarations that are only visible from DeclContext in the same module...

@ DECL_DECOMPOSITION

A DecompositionDecl record.

@ DECL_OMP_DECLARE_REDUCTION

An OMPDeclareReductionDecl record.

@ DECL_OMP_THREADPRIVATE

An OMPThreadPrivateDecl record.

@ DECL_OBJC_METHOD

A ObjCMethodDecl record.

@ DECL_CXX_DESTRUCTOR

A CXXDestructorDecl record.

@ DECL_OMP_CAPTUREDEXPR

An OMPCapturedExprDecl record.

@ DECL_CLASS_TEMPLATE

A ClassTemplateDecl record.

@ DECL_USING_SHADOW

A UsingShadowDecl record.

@ DECL_CONCEPT

A ConceptDecl record.

@ DECL_CXX_DEDUCTION_GUIDE

A CXXDeductionGuideDecl record.

@ DECL_OMP_REQUIRES

An OMPRequiresDecl record.

@ DECL_OBJC_IVAR

A ObjCIvarDecl record.

@ DECL_OBJC_PROPERTY

A ObjCPropertyDecl record.

@ DECL_TEMPLATE_PARAM_OBJECT

A TemplateParamObjectDecl record.

@ DECL_OBJC_INTERFACE

A ObjCInterfaceDecl record.

@ DECL_VAR_TEMPLATE

A VarTemplateDecl record.

@ DECL_LIFETIME_EXTENDED_TEMPORARY

An LifetimeExtendedTemporaryDecl record.

@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION

A ClassTemplatePartialSpecializationDecl record.

@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION

An ImplicitConceptSpecializationDecl record.

@ DECL_CONTEXT_VISIBLE

A record that stores the set of declarations that are visible from a given DeclContext.

@ DECL_OBJC_PROPERTY_IMPL

A ObjCPropertyImplDecl record.

Defines the Linkage enumeration and various utility functions.

const internal::VariadicAllOfMatcher< Decl > decl

Matches declarations.

ComparisonCategoryResult Compare(const T &X, const T &Y)

Helper to compare two comparable types.

std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl

All declarations that can appear in a module declaration.

bool needsAnonymousDeclarationNumber(const NamedDecl *D)

Determine whether the given declaration needs an anonymous declaration number.

void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)

Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...

uint64_t TypeID

An ID number that refers to a type in an AST file.

@ MK_MainFile

File is a PCH file treated as the actual main file.

uint32_t SubmoduleID

An ID number that refers to a submodule in a module file.

bool isPartOfPerModuleInitializer(const Decl *D)

Determine whether the given declaration will be included in the per-module initializer if it needs to...

@ DeclMarkedOpenMPThreadPrivate

@ CXXResolvedDtorGlobArrayDelete

@ CXXInstantiatedClassDefinition

@ CXXResolvedExceptionSpec

@ CXXResolvedDtorArrayDelete

@ CXXInstantiatedDefaultArgument

@ CXXInstantiatedDefaultMemberInitializer

@ CXXAddedAnonymousNamespace

@ CXXResolvedDtorGlobDelete

@ CXXAddedFunctionDefinition

@ CXXPointOfInstantiation

@ DeclMarkedOpenMPDeclareTarget

@ DeclMarkedOpenMPAllocate

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

bool isa(CodeGen::Address addr)

SelectorLocationsKind

Whether all locations of the selector identifiers are in a "standard" position.

LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr

A lazy pointer to a statement.

bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)

ConstexprSpecKind

Define the kind of constexpr specifier.

LinkageSpecLanguageIDs

Represents the language in a linkage specification.

LambdaCaptureKind

The different capture forms in a lambda introducer.

@ LCK_ByCopy

Capturing by copy (a.k.a., by value)

@ LCK_ByRef

Capturing by reference.

@ LCK_VLAType

Capturing variable-length array type.

@ LCK_StarThis

Capturing the *this object by copy.

@ LCK_This

Capturing the *this object by reference.

AccessSpecifier

A C++ access specifier (public, private, protected), plus the special value "none" which means differ...

SmallVector< Attr *, 4 > AttrVec

AttrVec - A vector of Attr, which is how they are stored on the AST.

OMPDeclareReductionInitKind

StorageClass

Storage classes.

Linkage

Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.

@ None

No linkage, which means that the entity is unique and can only be referred to from within its scope.

@ Result

The result type of a method or function.

const FunctionProtoType * T

@ Template

We are parsing a template declaration.

TagTypeKind

The kind of a tag type.

@ VarTemplate

The name was classified as a variable template name.

ObjCImplementationControl

RecordArgPassingKind

Enum that represents the different ways arguments are passed to and returned from function calls.

static bool isUndeducedReturnType(QualType T)

Definition ASTReaderDecl.cpp:3663

bool operator!=(CanQual< T > x, CanQual< U > y)

TemplateNameKind

Specifies the kind of template name that an identifier refers to.

DeductionCandidate

Only used by CXXDeductionGuideDecl.

bool shouldSkipCheckingODR(const Decl *D)

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...

U cast(CodeGen::Address addr)

@ Interface

The "__interface" keyword introduces the elaborated-type-specifier.

@ Class

The "class" keyword introduces the elaborated-type-specifier.

@ Other

Other implicit parameter.

Structure used to store a statement, the constant value to which it was evaluated (if any),...

bool HasConstantDestruction

Whether this variable is known to have constant destruction.

bool WasEvaluated

Whether this statement was already evaluated.

bool CheckedForSideEffects

bool HasConstantInitialization

Whether this variable is known to have constant initialization.

Provides information about an explicit instantiation of a variable or class template.

SourceLocation ExternKeywordLoc

The location of the extern keyword.

Data that is common to all of the declarations of a given function template.

llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations

The function template specializations for this function template, including explicit specializations ...

uint16_t Part2

...-89ab-...

uint32_t Part1

{01234567-...

uint16_t Part3

...-cdef-...

uint8_t Part4And5[8]

...-0123-456789abcdef}

llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet

Store declaration pairs already found to be non-equivalent.

static constexpr UnsignedOrNone fromInternalRepresentation(unsigned Rep)

uint64_t ModuleLocalOffset