Bug Summary

File:clang/lib/ARCMigrate/ObjCMT.cpp
Warning:line 1375, column 7
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ObjCMT.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=none -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -D CLANG_VENDOR="Debian " -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/build-llvm/tools/clang/lib/ARCMigrate -I /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate -I /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include -I /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/build-llvm/include -I /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/llvm/include -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/build-llvm/tools/clang/lib/ARCMigrate -fdebug-prefix-map=/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809=. -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fno-common -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -o /tmp/scan-build-2019-12-07-102640-14763-1 -x c++ /build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp

/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp

1//===--- ObjCMT.cpp - ObjC Migrate Tool -----------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "Transforms.h"
10#include "clang/Analysis/RetainSummaryManager.h"
11#include "clang/ARCMigrate/ARCMT.h"
12#include "clang/ARCMigrate/ARCMTActions.h"
13#include "clang/AST/ASTConsumer.h"
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/Attr.h"
16#include "clang/AST/NSAPI.h"
17#include "clang/AST/ParentMap.h"
18#include "clang/AST/RecursiveASTVisitor.h"
19#include "clang/Analysis/DomainSpecific/CocoaConventions.h"
20#include "clang/Basic/FileManager.h"
21#include "clang/Edit/Commit.h"
22#include "clang/Edit/EditedSource.h"
23#include "clang/Edit/EditsReceiver.h"
24#include "clang/Edit/Rewriters.h"
25#include "clang/Frontend/CompilerInstance.h"
26#include "clang/Frontend/MultiplexConsumer.h"
27#include "clang/Lex/PPConditionalDirectiveRecord.h"
28#include "clang/Lex/Preprocessor.h"
29#include "clang/Rewrite/Core/Rewriter.h"
30#include "llvm/ADT/SmallString.h"
31#include "llvm/ADT/StringSet.h"
32#include "llvm/Support/Path.h"
33#include "llvm/Support/SourceMgr.h"
34#include "llvm/Support/YAMLParser.h"
35
36using namespace clang;
37using namespace arcmt;
38using namespace ento;
39
40namespace {
41
42class ObjCMigrateASTConsumer : public ASTConsumer {
43 enum CF_BRIDGING_KIND {
44 CF_BRIDGING_NONE,
45 CF_BRIDGING_ENABLE,
46 CF_BRIDGING_MAY_INCLUDE
47 };
48
49 void migrateDecl(Decl *D);
50 void migrateObjCContainerDecl(ASTContext &Ctx, ObjCContainerDecl *D);
51 void migrateProtocolConformance(ASTContext &Ctx,
52 const ObjCImplementationDecl *ImpDecl);
53 void CacheObjCNSIntegerTypedefed(const TypedefDecl *TypedefDcl);
54 bool migrateNSEnumDecl(ASTContext &Ctx, const EnumDecl *EnumDcl,
55 const TypedefDecl *TypedefDcl);
56 void migrateAllMethodInstaceType(ASTContext &Ctx, ObjCContainerDecl *CDecl);
57 void migrateMethodInstanceType(ASTContext &Ctx, ObjCContainerDecl *CDecl,
58 ObjCMethodDecl *OM);
59 bool migrateProperty(ASTContext &Ctx, ObjCContainerDecl *D, ObjCMethodDecl *OM);
60 void migrateNsReturnsInnerPointer(ASTContext &Ctx, ObjCMethodDecl *OM);
61 void migratePropertyNsReturnsInnerPointer(ASTContext &Ctx, ObjCPropertyDecl *P);
62 void migrateFactoryMethod(ASTContext &Ctx, ObjCContainerDecl *CDecl,
63 ObjCMethodDecl *OM,
64 ObjCInstanceTypeFamily OIT_Family = OIT_None);
65
66 void migrateCFAnnotation(ASTContext &Ctx, const Decl *Decl);
67 void AddCFAnnotations(ASTContext &Ctx,
68 const RetainSummary *RS,
69 const FunctionDecl *FuncDecl, bool ResultAnnotated);
70 void AddCFAnnotations(ASTContext &Ctx,
71 const RetainSummary *RS,
72 const ObjCMethodDecl *MethodDecl, bool ResultAnnotated);
73
74 void AnnotateImplicitBridging(ASTContext &Ctx);
75
76 CF_BRIDGING_KIND migrateAddFunctionAnnotation(ASTContext &Ctx,
77 const FunctionDecl *FuncDecl);
78
79 void migrateARCSafeAnnotation(ASTContext &Ctx, ObjCContainerDecl *CDecl);
80
81 void migrateAddMethodAnnotation(ASTContext &Ctx,
82 const ObjCMethodDecl *MethodDecl);
83
84 void inferDesignatedInitializers(ASTContext &Ctx,
85 const ObjCImplementationDecl *ImplD);
86
87 bool InsertFoundation(ASTContext &Ctx, SourceLocation Loc);
88
89 std::unique_ptr<RetainSummaryManager> Summaries;
90
91public:
92 std::string MigrateDir;
93 unsigned ASTMigrateActions;
94 FileID FileId;
95 const TypedefDecl *NSIntegerTypedefed;
96 const TypedefDecl *NSUIntegerTypedefed;
97 std::unique_ptr<NSAPI> NSAPIObj;
98 std::unique_ptr<edit::EditedSource> Editor;
99 FileRemapper &Remapper;
100 FileManager &FileMgr;
101 const PPConditionalDirectiveRecord *PPRec;
102 Preprocessor &PP;
103 bool IsOutputFile;
104 bool FoundationIncluded;
105 llvm::SmallPtrSet<ObjCProtocolDecl *, 32> ObjCProtocolDecls;
106 llvm::SmallVector<const Decl *, 8> CFFunctionIBCandidates;
107 llvm::StringSet<> WhiteListFilenames;
108
109 RetainSummaryManager &getSummaryManager(ASTContext &Ctx) {
110 if (!Summaries)
111 Summaries.reset(new RetainSummaryManager(Ctx,
112 /*TrackNSCFObjects=*/true,
113 /*trackOSObjects=*/false));
114 return *Summaries;
115 }
116
117 ObjCMigrateASTConsumer(StringRef migrateDir,
118 unsigned astMigrateActions,
119 FileRemapper &remapper,
120 FileManager &fileMgr,
121 const PPConditionalDirectiveRecord *PPRec,
122 Preprocessor &PP,
123 bool isOutputFile,
124 ArrayRef<std::string> WhiteList)
125 : MigrateDir(migrateDir),
126 ASTMigrateActions(astMigrateActions),
127 NSIntegerTypedefed(nullptr), NSUIntegerTypedefed(nullptr),
128 Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP),
129 IsOutputFile(isOutputFile),
130 FoundationIncluded(false){
131
132 // FIXME: StringSet should have insert(iter, iter) to use here.
133 for (const std::string &Val : WhiteList)
134 WhiteListFilenames.insert(Val);
135 }
136
137protected:
138 void Initialize(ASTContext &Context) override {
139 NSAPIObj.reset(new NSAPI(Context));
140 Editor.reset(new edit::EditedSource(Context.getSourceManager(),
141 Context.getLangOpts(),
142 PPRec));
143 }
144
145 bool HandleTopLevelDecl(DeclGroupRef DG) override {
146 for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
147 migrateDecl(*I);
148 return true;
149 }
150 void HandleInterestingDecl(DeclGroupRef DG) override {
151 // Ignore decls from the PCH.
152 }
153 void HandleTopLevelDeclInObjCContainer(DeclGroupRef DG) override {
154 ObjCMigrateASTConsumer::HandleTopLevelDecl(DG);
155 }
156
157 void HandleTranslationUnit(ASTContext &Ctx) override;
158
159 bool canModifyFile(StringRef Path) {
160 if (WhiteListFilenames.empty())
161 return true;
162 return WhiteListFilenames.find(llvm::sys::path::filename(Path))
163 != WhiteListFilenames.end();
164 }
165 bool canModifyFile(const FileEntry *FE) {
166 if (!FE)
167 return false;
168 return canModifyFile(FE->getName());
169 }
170 bool canModifyFile(FileID FID) {
171 if (FID.isInvalid())
172 return false;
173 return canModifyFile(PP.getSourceManager().getFileEntryForID(FID));
174 }
175
176 bool canModify(const Decl *D) {
177 if (!D)
178 return false;
179 if (const ObjCCategoryImplDecl *CatImpl = dyn_cast<ObjCCategoryImplDecl>(D))
180 return canModify(CatImpl->getCategoryDecl());
181 if (const ObjCImplementationDecl *Impl = dyn_cast<ObjCImplementationDecl>(D))
182 return canModify(Impl->getClassInterface());
183 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
184 return canModify(cast<Decl>(MD->getDeclContext()));
185
186 FileID FID = PP.getSourceManager().getFileID(D->getLocation());
187 return canModifyFile(FID);
188 }
189};
190
191} // end anonymous namespace
192
193ObjCMigrateAction::ObjCMigrateAction(
194 std::unique_ptr<FrontendAction> WrappedAction,
195 StringRef migrateDir,
196 unsigned migrateAction)
197 : WrapperFrontendAction(std::move(WrappedAction)), MigrateDir(migrateDir),
198 ObjCMigAction(migrateAction),
199 CompInst(nullptr) {
200 if (MigrateDir.empty())
201 MigrateDir = "."; // user current directory if none is given.
202}
203
204std::unique_ptr<ASTConsumer>
205ObjCMigrateAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
206 PPConditionalDirectiveRecord *
207 PPRec = new PPConditionalDirectiveRecord(CompInst->getSourceManager());
208 CI.getPreprocessor().addPPCallbacks(std::unique_ptr<PPCallbacks>(PPRec));
209 std::vector<std::unique_ptr<ASTConsumer>> Consumers;
210 Consumers.push_back(WrapperFrontendAction::CreateASTConsumer(CI, InFile));
211 Consumers.push_back(std::make_unique<ObjCMigrateASTConsumer>(
212 MigrateDir, ObjCMigAction, Remapper, CompInst->getFileManager(), PPRec,
213 CompInst->getPreprocessor(), false, None));
214 return std::make_unique<MultiplexConsumer>(std::move(Consumers));
215}
216
217bool ObjCMigrateAction::BeginInvocation(CompilerInstance &CI) {
218 Remapper.initFromDisk(MigrateDir, CI.getDiagnostics(),
219 /*ignoreIfFilesChanged=*/true);
220 CompInst = &CI;
221 CI.getDiagnostics().setIgnoreAllWarnings(true);
222 return true;
223}
224
225namespace {
226 // FIXME. This duplicates one in RewriteObjCFoundationAPI.cpp
227 bool subscriptOperatorNeedsParens(const Expr *FullExpr) {
228 const Expr* Expr = FullExpr->IgnoreImpCasts();
229 return !(isa<ArraySubscriptExpr>(Expr) || isa<CallExpr>(Expr) ||
230 isa<DeclRefExpr>(Expr) || isa<CXXNamedCastExpr>(Expr) ||
231 isa<CXXConstructExpr>(Expr) || isa<CXXThisExpr>(Expr) ||
232 isa<CXXTypeidExpr>(Expr) ||
233 isa<CXXUnresolvedConstructExpr>(Expr) ||
234 isa<ObjCMessageExpr>(Expr) || isa<ObjCPropertyRefExpr>(Expr) ||
235 isa<ObjCProtocolExpr>(Expr) || isa<MemberExpr>(Expr) ||
236 isa<ObjCIvarRefExpr>(Expr) || isa<ParenExpr>(FullExpr) ||
237 isa<ParenListExpr>(Expr) || isa<SizeOfPackExpr>(Expr));
238 }
239
240 /// - Rewrite message expression for Objective-C setter and getters into
241 /// property-dot syntax.
242 bool rewriteToPropertyDotSyntax(const ObjCMessageExpr *Msg,
243 Preprocessor &PP,
244 const NSAPI &NS, edit::Commit &commit,
245 const ParentMap *PMap) {
246 if (!Msg || Msg->isImplicit() ||
247 (Msg->getReceiverKind() != ObjCMessageExpr::Instance &&
248 Msg->getReceiverKind() != ObjCMessageExpr::SuperInstance))
249 return false;
250 if (const Expr *Receiver = Msg->getInstanceReceiver())
251 if (Receiver->getType()->isObjCBuiltinType())
252 return false;
253
254 const ObjCMethodDecl *Method = Msg->getMethodDecl();
255 if (!Method)
256 return false;
257 if (!Method->isPropertyAccessor())
258 return false;
259
260 const ObjCPropertyDecl *Prop = Method->findPropertyDecl();
261 if (!Prop)
262 return false;
263
264 SourceRange MsgRange = Msg->getSourceRange();
265 bool ReceiverIsSuper =
266 (Msg->getReceiverKind() == ObjCMessageExpr::SuperInstance);
267 // for 'super' receiver is nullptr.
268 const Expr *receiver = Msg->getInstanceReceiver();
269 bool NeedsParen =
270 ReceiverIsSuper ? false : subscriptOperatorNeedsParens(receiver);
271 bool IsGetter = (Msg->getNumArgs() == 0);
272 if (IsGetter) {
273 // Find space location range between receiver expression and getter method.
274 SourceLocation BegLoc =
275 ReceiverIsSuper ? Msg->getSuperLoc() : receiver->getEndLoc();
276 BegLoc = PP.getLocForEndOfToken(BegLoc);
277 SourceLocation EndLoc = Msg->getSelectorLoc(0);
278 SourceRange SpaceRange(BegLoc, EndLoc);
279 std::string PropertyDotString;
280 // rewrite getter method expression into: receiver.property or
281 // (receiver).property
282 if (NeedsParen) {
283 commit.insertBefore(receiver->getBeginLoc(), "(");
284 PropertyDotString = ").";
285 }
286 else
287 PropertyDotString = ".";
288 PropertyDotString += Prop->getName();
289 commit.replace(SpaceRange, PropertyDotString);
290
291 // remove '[' ']'
292 commit.replace(SourceRange(MsgRange.getBegin(), MsgRange.getBegin()), "");
293 commit.replace(SourceRange(MsgRange.getEnd(), MsgRange.getEnd()), "");
294 } else {
295 if (NeedsParen)
296 commit.insertWrap("(", receiver->getSourceRange(), ")");
297 std::string PropertyDotString = ".";
298 PropertyDotString += Prop->getName();
299 PropertyDotString += " =";
300 const Expr*const* Args = Msg->getArgs();
301 const Expr *RHS = Args[0];
302 if (!RHS)
303 return false;
304 SourceLocation BegLoc =
305 ReceiverIsSuper ? Msg->getSuperLoc() : receiver->getEndLoc();
306 BegLoc = PP.getLocForEndOfToken(BegLoc);
307 SourceLocation EndLoc = RHS->getBeginLoc();
308 EndLoc = EndLoc.getLocWithOffset(-1);
309 const char *colon = PP.getSourceManager().getCharacterData(EndLoc);
310 // Add a space after '=' if there is no space between RHS and '='
311 if (colon && colon[0] == ':')
312 PropertyDotString += " ";
313 SourceRange Range(BegLoc, EndLoc);
314 commit.replace(Range, PropertyDotString);
315 // remove '[' ']'
316 commit.replace(SourceRange(MsgRange.getBegin(), MsgRange.getBegin()), "");
317 commit.replace(SourceRange(MsgRange.getEnd(), MsgRange.getEnd()), "");
318 }
319 return true;
320 }
321
322class ObjCMigrator : public RecursiveASTVisitor<ObjCMigrator> {
323 ObjCMigrateASTConsumer &Consumer;
324 ParentMap &PMap;
325
326public:
327 ObjCMigrator(ObjCMigrateASTConsumer &consumer, ParentMap &PMap)
328 : Consumer(consumer), PMap(PMap) { }
329
330 bool shouldVisitTemplateInstantiations() const { return false; }
331 bool shouldWalkTypesOfTypeLocs() const { return false; }
332
333 bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
334 if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_Literals) {
335 edit::Commit commit(*Consumer.Editor);
336 edit::rewriteToObjCLiteralSyntax(E, *Consumer.NSAPIObj, commit, &PMap);
337 Consumer.Editor->commit(commit);
338 }
339
340 if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_Subscripting) {
341 edit::Commit commit(*Consumer.Editor);
342 edit::rewriteToObjCSubscriptSyntax(E, *Consumer.NSAPIObj, commit);
343 Consumer.Editor->commit(commit);
344 }
345
346 if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_PropertyDotSyntax) {
347 edit::Commit commit(*Consumer.Editor);
348 rewriteToPropertyDotSyntax(E, Consumer.PP, *Consumer.NSAPIObj,
349 commit, &PMap);
350 Consumer.Editor->commit(commit);
351 }
352
353 return true;
354 }
355
356 bool TraverseObjCMessageExpr(ObjCMessageExpr *E) {
357 // Do depth first; we want to rewrite the subexpressions first so that if
358 // we have to move expressions we will move them already rewritten.
359 for (Stmt *SubStmt : E->children())
360 if (!TraverseStmt(SubStmt))
361 return false;
362
363 return WalkUpFromObjCMessageExpr(E);
364 }
365};
366
367class BodyMigrator : public RecursiveASTVisitor<BodyMigrator> {
368 ObjCMigrateASTConsumer &Consumer;
369 std::unique_ptr<ParentMap> PMap;
370
371public:
372 BodyMigrator(ObjCMigrateASTConsumer &consumer) : Consumer(consumer) { }
373
374 bool shouldVisitTemplateInstantiations() const { return false; }
375 bool shouldWalkTypesOfTypeLocs() const { return false; }
376
377 bool TraverseStmt(Stmt *S) {
378 PMap.reset(new ParentMap(S));
379 ObjCMigrator(Consumer, *PMap).TraverseStmt(S);
380 return true;
381 }
382};
383} // end anonymous namespace
384
385void ObjCMigrateASTConsumer::migrateDecl(Decl *D) {
386 if (!D)
387 return;
388 if (isa<ObjCMethodDecl>(D))
389 return; // Wait for the ObjC container declaration.
390
391 BodyMigrator(*this).TraverseDecl(D);
392}
393
394static void append_attr(std::string &PropertyString, const char *attr,
395 bool &LParenAdded) {
396 if (!LParenAdded) {
397 PropertyString += "(";
398 LParenAdded = true;
399 }
400 else
401 PropertyString += ", ";
402 PropertyString += attr;
403}
404
405static
406void MigrateBlockOrFunctionPointerTypeVariable(std::string & PropertyString,
407 const std::string& TypeString,
408 const char *name) {
409 const char *argPtr = TypeString.c_str();
410 int paren = 0;
411 while (*argPtr) {
412 switch (*argPtr) {
413 case '(':
414 PropertyString += *argPtr;
415 paren++;
416 break;
417 case ')':
418 PropertyString += *argPtr;
419 paren--;
420 break;
421 case '^':
422 case '*':
423 PropertyString += (*argPtr);
424 if (paren == 1) {
425 PropertyString += name;
426 name = "";
427 }
428 break;
429 default:
430 PropertyString += *argPtr;
431 break;
432 }
433 argPtr++;
434 }
435}
436
437static const char *PropertyMemoryAttribute(ASTContext &Context, QualType ArgType) {
438 Qualifiers::ObjCLifetime propertyLifetime = ArgType.getObjCLifetime();
439 bool RetainableObject = ArgType->isObjCRetainableType();
440 if (RetainableObject &&
441 (propertyLifetime == Qualifiers::OCL_Strong
442 || propertyLifetime == Qualifiers::OCL_None)) {
443 if (const ObjCObjectPointerType *ObjPtrTy =
444 ArgType->getAs<ObjCObjectPointerType>()) {
445 ObjCInterfaceDecl *IDecl = ObjPtrTy->getObjectType()->getInterface();
446 if (IDecl &&
447 IDecl->lookupNestedProtocol(&Context.Idents.get("NSCopying")))
448 return "copy";
449 else
450 return "strong";
451 }
452 else if (ArgType->isBlockPointerType())
453 return "copy";
454 } else if (propertyLifetime == Qualifiers::OCL_Weak)
455 // TODO. More precise determination of 'weak' attribute requires
456 // looking into setter's implementation for backing weak ivar.
457 return "weak";
458 else if (RetainableObject)
459 return ArgType->isBlockPointerType() ? "copy" : "strong";
460 return nullptr;
461}
462
463static void rewriteToObjCProperty(const ObjCMethodDecl *Getter,
464 const ObjCMethodDecl *Setter,
465 const NSAPI &NS, edit::Commit &commit,
466 unsigned LengthOfPrefix,
467 bool Atomic, bool UseNsIosOnlyMacro,
468 bool AvailabilityArgsMatch) {
469 ASTContext &Context = NS.getASTContext();
470 bool LParenAdded = false;
471 std::string PropertyString = "@property ";
472 if (UseNsIosOnlyMacro && NS.isMacroDefined("NS_NONATOMIC_IOSONLY")) {
473 PropertyString += "(NS_NONATOMIC_IOSONLY";
474 LParenAdded = true;
475 } else if (!Atomic) {
476 PropertyString += "(nonatomic";
477 LParenAdded = true;
478 }
479
480 std::string PropertyNameString = Getter->getNameAsString();
481 StringRef PropertyName(PropertyNameString);
482 if (LengthOfPrefix > 0) {
483 if (!LParenAdded) {
484 PropertyString += "(getter=";
485 LParenAdded = true;
486 }
487 else
488 PropertyString += ", getter=";
489 PropertyString += PropertyNameString;
490 }
491 // Property with no setter may be suggested as a 'readonly' property.
492 if (!Setter)
493 append_attr(PropertyString, "readonly", LParenAdded);
494
495
496 // Short circuit 'delegate' properties that contain the name "delegate" or
497 // "dataSource", or have exact name "target" to have 'assign' attribute.
498 if (PropertyName.equals("target") ||
499 (PropertyName.find("delegate") != StringRef::npos) ||
500 (PropertyName.find("dataSource") != StringRef::npos)) {
501 QualType QT = Getter->getReturnType();
502 if (!QT->isRealType())
503 append_attr(PropertyString, "assign", LParenAdded);
504 } else if (!Setter) {
505 QualType ResType = Context.getCanonicalType(Getter->getReturnType());
506 if (const char *MemoryManagementAttr = PropertyMemoryAttribute(Context, ResType))
507 append_attr(PropertyString, MemoryManagementAttr, LParenAdded);
508 } else {
509 const ParmVarDecl *argDecl = *Setter->param_begin();
510 QualType ArgType = Context.getCanonicalType(argDecl->getType());
511 if (const char *MemoryManagementAttr = PropertyMemoryAttribute(Context, ArgType))
512 append_attr(PropertyString, MemoryManagementAttr, LParenAdded);
513 }
514 if (LParenAdded)
515 PropertyString += ')';
516 QualType RT = Getter->getReturnType();
517 if (!isa<TypedefType>(RT)) {
518 // strip off any ARC lifetime qualifier.
519 QualType CanResultTy = Context.getCanonicalType(RT);
520 if (CanResultTy.getQualifiers().hasObjCLifetime()) {
521 Qualifiers Qs = CanResultTy.getQualifiers();
522 Qs.removeObjCLifetime();
523 RT = Context.getQualifiedType(CanResultTy.getUnqualifiedType(), Qs);
524 }
525 }
526 PropertyString += " ";
527 PrintingPolicy SubPolicy(Context.getPrintingPolicy());
528 SubPolicy.SuppressStrongLifetime = true;
529 SubPolicy.SuppressLifetimeQualifiers = true;
530 std::string TypeString = RT.getAsString(SubPolicy);
531 if (LengthOfPrefix > 0) {
532 // property name must strip off "is" and lower case the first character
533 // after that; e.g. isContinuous will become continuous.
534 StringRef PropertyNameStringRef(PropertyNameString);
535 PropertyNameStringRef = PropertyNameStringRef.drop_front(LengthOfPrefix);
536 PropertyNameString = PropertyNameStringRef;
537 bool NoLowering = (isUppercase(PropertyNameString[0]) &&
538 PropertyNameString.size() > 1 &&
539 isUppercase(PropertyNameString[1]));
540 if (!NoLowering)
541 PropertyNameString[0] = toLowercase(PropertyNameString[0]);
542 }
543 if (RT->isBlockPointerType() || RT->isFunctionPointerType())
544 MigrateBlockOrFunctionPointerTypeVariable(PropertyString,
545 TypeString,
546 PropertyNameString.c_str());
547 else {
548 char LastChar = TypeString[TypeString.size()-1];
549 PropertyString += TypeString;
550 if (LastChar != '*')
551 PropertyString += ' ';
552 PropertyString += PropertyNameString;
553 }
554 SourceLocation StartGetterSelectorLoc = Getter->getSelectorStartLoc();
555 Selector GetterSelector = Getter->getSelector();
556
557 SourceLocation EndGetterSelectorLoc =
558 StartGetterSelectorLoc.getLocWithOffset(GetterSelector.getNameForSlot(0).size());
559 commit.replace(CharSourceRange::getCharRange(Getter->getBeginLoc(),
560 EndGetterSelectorLoc),
561 PropertyString);
562 if (Setter && AvailabilityArgsMatch) {
563 SourceLocation EndLoc = Setter->getDeclaratorEndLoc();
564 // Get location past ';'
565 EndLoc = EndLoc.getLocWithOffset(1);
566 SourceLocation BeginOfSetterDclLoc = Setter->getBeginLoc();
567 // FIXME. This assumes that setter decl; is immediately preceded by eoln.
568 // It is trying to remove the setter method decl. line entirely.
569 BeginOfSetterDclLoc = BeginOfSetterDclLoc.getLocWithOffset(-1);
570 commit.remove(SourceRange(BeginOfSetterDclLoc, EndLoc));
571 }
572}
573
574static bool IsCategoryNameWithDeprecatedSuffix(ObjCContainerDecl *D) {
575 if (ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(D)) {
576 StringRef Name = CatDecl->getName();
577 return Name.endswith("Deprecated");
578 }
579 return false;
580}
581
582void ObjCMigrateASTConsumer::migrateObjCContainerDecl(ASTContext &Ctx,
583 ObjCContainerDecl *D) {
584 if (D->isDeprecated() || IsCategoryNameWithDeprecatedSuffix(D))
585 return;
586
587 for (auto *Method : D->methods()) {
588 if (Method->isDeprecated())
589 continue;
590 bool PropertyInferred = migrateProperty(Ctx, D, Method);
591 // If a property is inferred, do not attempt to attach NS_RETURNS_INNER_POINTER to
592 // the getter method as it ends up on the property itself which we don't want
593 // to do unless -objcmt-returns-innerpointer-property option is on.
594 if (!PropertyInferred ||
595 (ASTMigrateActions & FrontendOptions::ObjCMT_ReturnsInnerPointerProperty))
596 if (ASTMigrateActions & FrontendOptions::ObjCMT_Annotation)
597 migrateNsReturnsInnerPointer(Ctx, Method);
598 }
599 if (!(ASTMigrateActions & FrontendOptions::ObjCMT_ReturnsInnerPointerProperty))
600 return;
601
602 for (auto *Prop : D->instance_properties()) {
603 if ((ASTMigrateActions & FrontendOptions::ObjCMT_Annotation) &&
604 !Prop->isDeprecated())
605 migratePropertyNsReturnsInnerPointer(Ctx, Prop);
606 }
607}
608
609static bool
610ClassImplementsAllMethodsAndProperties(ASTContext &Ctx,
611 const ObjCImplementationDecl *ImpDecl,
612 const ObjCInterfaceDecl *IDecl,
613 ObjCProtocolDecl *Protocol) {
614 // In auto-synthesis, protocol properties are not synthesized. So,
615 // a conforming protocol must have its required properties declared
616 // in class interface.
617 bool HasAtleastOneRequiredProperty = false;
618 if (const ObjCProtocolDecl *PDecl = Protocol->getDefinition())
619 for (const auto *Property : PDecl->instance_properties()) {
620 if (Property->getPropertyImplementation() == ObjCPropertyDecl::Optional)
621 continue;
622 HasAtleastOneRequiredProperty = true;
623 DeclContext::lookup_result R = IDecl->lookup(Property->getDeclName());
624 if (R.size() == 0) {
625 // Relax the rule and look into class's implementation for a synthesize
626 // or dynamic declaration. Class is implementing a property coming from
627 // another protocol. This still makes the target protocol as conforming.
628 if (!ImpDecl->FindPropertyImplDecl(
629 Property->getDeclName().getAsIdentifierInfo(),
630 Property->getQueryKind()))
631 return false;
632 }
633 else if (ObjCPropertyDecl *ClassProperty = dyn_cast<ObjCPropertyDecl>(R[0])) {
634 if ((ClassProperty->getPropertyAttributes()
635 != Property->getPropertyAttributes()) ||
636 !Ctx.hasSameType(ClassProperty->getType(), Property->getType()))
637 return false;
638 }
639 else
640 return false;
641 }
642
643 // At this point, all required properties in this protocol conform to those
644 // declared in the class.
645 // Check that class implements the required methods of the protocol too.
646 bool HasAtleastOneRequiredMethod = false;
647 if (const ObjCProtocolDecl *PDecl = Protocol->getDefinition()) {
648 if (PDecl->meth_begin() == PDecl->meth_end())
649 return HasAtleastOneRequiredProperty;
650 for (const auto *MD : PDecl->methods()) {
651 if (MD->isImplicit())
652 continue;
653 if (MD->getImplementationControl() == ObjCMethodDecl::Optional)
654 continue;
655 DeclContext::lookup_result R = ImpDecl->lookup(MD->getDeclName());
656 if (R.size() == 0)
657 return false;
658 bool match = false;
659 HasAtleastOneRequiredMethod = true;
660 for (unsigned I = 0, N = R.size(); I != N; ++I)
661 if (ObjCMethodDecl *ImpMD = dyn_cast<ObjCMethodDecl>(R[0]))
662 if (Ctx.ObjCMethodsAreEqual(MD, ImpMD)) {
663 match = true;
664 break;
665 }
666 if (!match)
667 return false;
668 }
669 }
670 return HasAtleastOneRequiredProperty || HasAtleastOneRequiredMethod;
671}
672
673static bool rewriteToObjCInterfaceDecl(const ObjCInterfaceDecl *IDecl,
674 llvm::SmallVectorImpl<ObjCProtocolDecl*> &ConformingProtocols,
675 const NSAPI &NS, edit::Commit &commit) {
676 const ObjCList<ObjCProtocolDecl> &Protocols = IDecl->getReferencedProtocols();
677 std::string ClassString;
678 SourceLocation EndLoc =
679 IDecl->getSuperClass() ? IDecl->getSuperClassLoc() : IDecl->getLocation();
680
681 if (Protocols.empty()) {
682 ClassString = '<';
683 for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) {
684 ClassString += ConformingProtocols[i]->getNameAsString();
685 if (i != (e-1))
686 ClassString += ", ";
687 }
688 ClassString += "> ";
689 }
690 else {
691 ClassString = ", ";
692 for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) {
693 ClassString += ConformingProtocols[i]->getNameAsString();
694 if (i != (e-1))
695 ClassString += ", ";
696 }
697 ObjCInterfaceDecl::protocol_loc_iterator PL = IDecl->protocol_loc_end() - 1;
698 EndLoc = *PL;
699 }
700
701 commit.insertAfterToken(EndLoc, ClassString);
702 return true;
703}
704
705static StringRef GetUnsignedName(StringRef NSIntegerName) {
706 StringRef UnsignedName = llvm::StringSwitch<StringRef>(NSIntegerName)
707 .Case("int8_t", "uint8_t")
708 .Case("int16_t", "uint16_t")
709 .Case("int32_t", "uint32_t")
710 .Case("NSInteger", "NSUInteger")
711 .Case("int64_t", "uint64_t")
712 .Default(NSIntegerName);
713 return UnsignedName;
714}
715
716static bool rewriteToNSEnumDecl(const EnumDecl *EnumDcl,
717 const TypedefDecl *TypedefDcl,
718 const NSAPI &NS, edit::Commit &commit,
719 StringRef NSIntegerName,
720 bool NSOptions) {
721 std::string ClassString;
722 if (NSOptions) {
723 ClassString = "typedef NS_OPTIONS(";
724 ClassString += GetUnsignedName(NSIntegerName);
725 }
726 else {
727 ClassString = "typedef NS_ENUM(";
728 ClassString += NSIntegerName;
729 }
730 ClassString += ", ";
731
732 ClassString += TypedefDcl->getIdentifier()->getName();
733 ClassString += ')';
734 SourceRange R(EnumDcl->getBeginLoc(), EnumDcl->getBeginLoc());
735 commit.replace(R, ClassString);
736 SourceLocation EndOfEnumDclLoc = EnumDcl->getEndLoc();
737 EndOfEnumDclLoc = trans::findSemiAfterLocation(EndOfEnumDclLoc,
738 NS.getASTContext(), /*IsDecl*/true);
739 if (EndOfEnumDclLoc.isValid()) {
740 SourceRange EnumDclRange(EnumDcl->getBeginLoc(), EndOfEnumDclLoc);
741 commit.insertFromRange(TypedefDcl->getBeginLoc(), EnumDclRange);
742 }
743 else
744 return false;
745
746 SourceLocation EndTypedefDclLoc = TypedefDcl->getEndLoc();
747 EndTypedefDclLoc = trans::findSemiAfterLocation(EndTypedefDclLoc,
748 NS.getASTContext(), /*IsDecl*/true);
749 if (EndTypedefDclLoc.isValid()) {
750 SourceRange TDRange(TypedefDcl->getBeginLoc(), EndTypedefDclLoc);
751 commit.remove(TDRange);
752 }
753 else
754 return false;
755
756 EndOfEnumDclLoc =
757 trans::findLocationAfterSemi(EnumDcl->getEndLoc(), NS.getASTContext(),
758 /*IsDecl*/ true);
759 if (EndOfEnumDclLoc.isValid()) {
760 SourceLocation BeginOfEnumDclLoc = EnumDcl->getBeginLoc();
761 // FIXME. This assumes that enum decl; is immediately preceded by eoln.
762 // It is trying to remove the enum decl. lines entirely.
763 BeginOfEnumDclLoc = BeginOfEnumDclLoc.getLocWithOffset(-1);
764 commit.remove(SourceRange(BeginOfEnumDclLoc, EndOfEnumDclLoc));
765 return true;
766 }
767 return false;
768}
769
770static void rewriteToNSMacroDecl(ASTContext &Ctx,
771 const EnumDecl *EnumDcl,
772 const TypedefDecl *TypedefDcl,
773 const NSAPI &NS, edit::Commit &commit,
774 bool IsNSIntegerType) {
775 QualType DesignatedEnumType = EnumDcl->getIntegerType();
776 assert(!DesignatedEnumType.isNull()((!DesignatedEnumType.isNull() && "rewriteToNSMacroDecl - underlying enum type is null"
) ? static_cast<void> (0) : __assert_fail ("!DesignatedEnumType.isNull() && \"rewriteToNSMacroDecl - underlying enum type is null\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 777, __PRETTY_FUNCTION__))
777 && "rewriteToNSMacroDecl - underlying enum type is null")((!DesignatedEnumType.isNull() && "rewriteToNSMacroDecl - underlying enum type is null"
) ? static_cast<void> (0) : __assert_fail ("!DesignatedEnumType.isNull() && \"rewriteToNSMacroDecl - underlying enum type is null\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 777, __PRETTY_FUNCTION__))
;
778
779 PrintingPolicy Policy(Ctx.getPrintingPolicy());
780 std::string TypeString = DesignatedEnumType.getAsString(Policy);
781 std::string ClassString = IsNSIntegerType ? "NS_ENUM(" : "NS_OPTIONS(";
782 ClassString += TypeString;
783 ClassString += ", ";
784
785 ClassString += TypedefDcl->getIdentifier()->getName();
786 ClassString += ") ";
787 SourceLocation EndLoc = EnumDcl->getBraceRange().getBegin();
788 if (EndLoc.isInvalid())
789 return;
790 CharSourceRange R =
791 CharSourceRange::getCharRange(EnumDcl->getBeginLoc(), EndLoc);
792 commit.replace(R, ClassString);
793 // This is to remove spaces between '}' and typedef name.
794 SourceLocation StartTypedefLoc = EnumDcl->getEndLoc();
795 StartTypedefLoc = StartTypedefLoc.getLocWithOffset(+1);
796 SourceLocation EndTypedefLoc = TypedefDcl->getEndLoc();
797
798 commit.remove(SourceRange(StartTypedefLoc, EndTypedefLoc));
799}
800
801static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
802 const EnumDecl *EnumDcl) {
803 bool PowerOfTwo = true;
804 bool AllHexdecimalEnumerator = true;
805 uint64_t MaxPowerOfTwoVal = 0;
806 for (auto Enumerator : EnumDcl->enumerators()) {
807 const Expr *InitExpr = Enumerator->getInitExpr();
808 if (!InitExpr) {
809 PowerOfTwo = false;
810 AllHexdecimalEnumerator = false;
811 continue;
812 }
813 InitExpr = InitExpr->IgnoreParenCasts();
814 if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(InitExpr))
815 if (BO->isShiftOp() || BO->isBitwiseOp())
816 return true;
817
818 uint64_t EnumVal = Enumerator->getInitVal().getZExtValue();
819 if (PowerOfTwo && EnumVal) {
820 if (!llvm::isPowerOf2_64(EnumVal))
821 PowerOfTwo = false;
822 else if (EnumVal > MaxPowerOfTwoVal)
823 MaxPowerOfTwoVal = EnumVal;
824 }
825 if (AllHexdecimalEnumerator && EnumVal) {
826 bool FoundHexdecimalEnumerator = false;
827 SourceLocation EndLoc = Enumerator->getEndLoc();
828 Token Tok;
829 if (!PP.getRawToken(EndLoc, Tok, /*IgnoreWhiteSpace=*/true))
830 if (Tok.isLiteral() && Tok.getLength() > 2) {
831 if (const char *StringLit = Tok.getLiteralData())
832 FoundHexdecimalEnumerator =
833 (StringLit[0] == '0' && (toLowercase(StringLit[1]) == 'x'));
834 }
835 if (!FoundHexdecimalEnumerator)
836 AllHexdecimalEnumerator = false;
837 }
838 }
839 return AllHexdecimalEnumerator || (PowerOfTwo && (MaxPowerOfTwoVal > 2));
840}
841
842void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,
843 const ObjCImplementationDecl *ImpDecl) {
844 const ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface();
845 if (!IDecl || ObjCProtocolDecls.empty() || IDecl->isDeprecated())
846 return;
847 // Find all implicit conforming protocols for this class
848 // and make them explicit.
849 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> ExplicitProtocols;
850 Ctx.CollectInheritedProtocols(IDecl, ExplicitProtocols);
851 llvm::SmallVector<ObjCProtocolDecl *, 8> PotentialImplicitProtocols;
852
853 for (ObjCProtocolDecl *ProtDecl : ObjCProtocolDecls)
854 if (!ExplicitProtocols.count(ProtDecl))
855 PotentialImplicitProtocols.push_back(ProtDecl);
856
857 if (PotentialImplicitProtocols.empty())
858 return;
859
860 // go through list of non-optional methods and properties in each protocol
861 // in the PotentialImplicitProtocols list. If class implements every one of the
862 // methods and properties, then this class conforms to this protocol.
863 llvm::SmallVector<ObjCProtocolDecl*, 8> ConformingProtocols;
864 for (unsigned i = 0, e = PotentialImplicitProtocols.size(); i != e; i++)
865 if (ClassImplementsAllMethodsAndProperties(Ctx, ImpDecl, IDecl,
866 PotentialImplicitProtocols[i]))
867 ConformingProtocols.push_back(PotentialImplicitProtocols[i]);
868
869 if (ConformingProtocols.empty())
870 return;
871
872 // Further reduce number of conforming protocols. If protocol P1 is in the list
873 // protocol P2 (P2<P1>), No need to include P1.
874 llvm::SmallVector<ObjCProtocolDecl*, 8> MinimalConformingProtocols;
875 for (unsigned i = 0, e = ConformingProtocols.size(); i != e; i++) {
876 bool DropIt = false;
877 ObjCProtocolDecl *TargetPDecl = ConformingProtocols[i];
878 for (unsigned i1 = 0, e1 = ConformingProtocols.size(); i1 != e1; i1++) {
879 ObjCProtocolDecl *PDecl = ConformingProtocols[i1];
880 if (PDecl == TargetPDecl)
881 continue;
882 if (PDecl->lookupProtocolNamed(
883 TargetPDecl->getDeclName().getAsIdentifierInfo())) {
884 DropIt = true;
885 break;
886 }
887 }
888 if (!DropIt)
889 MinimalConformingProtocols.push_back(TargetPDecl);
890 }
891 if (MinimalConformingProtocols.empty())
892 return;
893 edit::Commit commit(*Editor);
894 rewriteToObjCInterfaceDecl(IDecl, MinimalConformingProtocols,
895 *NSAPIObj, commit);
896 Editor->commit(commit);
897}
898
899void ObjCMigrateASTConsumer::CacheObjCNSIntegerTypedefed(
900 const TypedefDecl *TypedefDcl) {
901
902 QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
903 if (NSAPIObj->isObjCNSIntegerType(qt))
904 NSIntegerTypedefed = TypedefDcl;
905 else if (NSAPIObj->isObjCNSUIntegerType(qt))
906 NSUIntegerTypedefed = TypedefDcl;
907}
908
909bool ObjCMigrateASTConsumer::migrateNSEnumDecl(ASTContext &Ctx,
910 const EnumDecl *EnumDcl,
911 const TypedefDecl *TypedefDcl) {
912 if (!EnumDcl->isCompleteDefinition() || EnumDcl->getIdentifier() ||
913 EnumDcl->isDeprecated())
914 return false;
915 if (!TypedefDcl) {
916 if (NSIntegerTypedefed) {
917 TypedefDcl = NSIntegerTypedefed;
918 NSIntegerTypedefed = nullptr;
919 }
920 else if (NSUIntegerTypedefed) {
921 TypedefDcl = NSUIntegerTypedefed;
922 NSUIntegerTypedefed = nullptr;
923 }
924 else
925 return false;
926 FileID FileIdOfTypedefDcl =
927 PP.getSourceManager().getFileID(TypedefDcl->getLocation());
928 FileID FileIdOfEnumDcl =
929 PP.getSourceManager().getFileID(EnumDcl->getLocation());
930 if (FileIdOfTypedefDcl != FileIdOfEnumDcl)
931 return false;
932 }
933 if (TypedefDcl->isDeprecated())
934 return false;
935
936 QualType qt = TypedefDcl->getTypeSourceInfo()->getType();
937 StringRef NSIntegerName = NSAPIObj->GetNSIntegralKind(qt);
938
939 if (NSIntegerName.empty()) {
940 // Also check for typedef enum {...} TD;
941 if (const EnumType *EnumTy = qt->getAs<EnumType>()) {
942 if (EnumTy->getDecl() == EnumDcl) {
943 bool NSOptions = UseNSOptionsMacro(PP, Ctx, EnumDcl);
944 if (!InsertFoundation(Ctx, TypedefDcl->getBeginLoc()))
945 return false;
946 edit::Commit commit(*Editor);
947 rewriteToNSMacroDecl(Ctx, EnumDcl, TypedefDcl, *NSAPIObj, commit, !NSOptions);
948 Editor->commit(commit);
949 return true;
950 }
951 }
952 return false;
953 }
954
955 // We may still use NS_OPTIONS based on what we find in the enumertor list.
956 bool NSOptions = UseNSOptionsMacro(PP, Ctx, EnumDcl);
957 if (!InsertFoundation(Ctx, TypedefDcl->getBeginLoc()))
958 return false;
959 edit::Commit commit(*Editor);
960 bool Res = rewriteToNSEnumDecl(EnumDcl, TypedefDcl, *NSAPIObj,
961 commit, NSIntegerName, NSOptions);
962 Editor->commit(commit);
963 return Res;
964}
965
966static void ReplaceWithInstancetype(ASTContext &Ctx,
967 const ObjCMigrateASTConsumer &ASTC,
968 ObjCMethodDecl *OM) {
969 if (OM->getReturnType() == Ctx.getObjCInstanceType())
970 return; // already has instancetype.
971
972 SourceRange R;
973 std::string ClassString;
974 if (TypeSourceInfo *TSInfo = OM->getReturnTypeSourceInfo()) {
975 TypeLoc TL = TSInfo->getTypeLoc();
976 R = SourceRange(TL.getBeginLoc(), TL.getEndLoc());
977 ClassString = "instancetype";
978 }
979 else {
980 R = SourceRange(OM->getBeginLoc(), OM->getBeginLoc());
981 ClassString = OM->isInstanceMethod() ? '-' : '+';
982 ClassString += " (instancetype)";
983 }
984 edit::Commit commit(*ASTC.Editor);
985 commit.replace(R, ClassString);
986 ASTC.Editor->commit(commit);
987}
988
989static void ReplaceWithClasstype(const ObjCMigrateASTConsumer &ASTC,
990 ObjCMethodDecl *OM) {
991 ObjCInterfaceDecl *IDecl = OM->getClassInterface();
992 SourceRange R;
993 std::string ClassString;
994 if (TypeSourceInfo *TSInfo = OM->getReturnTypeSourceInfo()) {
995 TypeLoc TL = TSInfo->getTypeLoc();
996 R = SourceRange(TL.getBeginLoc(), TL.getEndLoc()); {
997 ClassString = IDecl->getName();
998 ClassString += "*";
999 }
1000 }
1001 else {
1002 R = SourceRange(OM->getBeginLoc(), OM->getBeginLoc());
1003 ClassString = "+ (";
1004 ClassString += IDecl->getName(); ClassString += "*)";
1005 }
1006 edit::Commit commit(*ASTC.Editor);
1007 commit.replace(R, ClassString);
1008 ASTC.Editor->commit(commit);
1009}
1010
1011void ObjCMigrateASTConsumer::migrateMethodInstanceType(ASTContext &Ctx,
1012 ObjCContainerDecl *CDecl,
1013 ObjCMethodDecl *OM) {
1014 ObjCInstanceTypeFamily OIT_Family =
1015 Selector::getInstTypeMethodFamily(OM->getSelector());
1016
1017 std::string ClassName;
1018 switch (OIT_Family) {
1019 case OIT_None:
1020 migrateFactoryMethod(Ctx, CDecl, OM);
1021 return;
1022 case OIT_Array:
1023 ClassName = "NSArray";
1024 break;
1025 case OIT_Dictionary:
1026 ClassName = "NSDictionary";
1027 break;
1028 case OIT_Singleton:
1029 migrateFactoryMethod(Ctx, CDecl, OM, OIT_Singleton);
1030 return;
1031 case OIT_Init:
1032 if (OM->getReturnType()->isObjCIdType())
1033 ReplaceWithInstancetype(Ctx, *this, OM);
1034 return;
1035 case OIT_ReturnsSelf:
1036 migrateFactoryMethod(Ctx, CDecl, OM, OIT_ReturnsSelf);
1037 return;
1038 }
1039 if (!OM->getReturnType()->isObjCIdType())
1040 return;
1041
1042 ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl);
1043 if (!IDecl) {
1044 if (ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(CDecl))
1045 IDecl = CatDecl->getClassInterface();
1046 else if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(CDecl))
1047 IDecl = ImpDecl->getClassInterface();
1048 }
1049 if (!IDecl ||
1050 !IDecl->lookupInheritedClass(&Ctx.Idents.get(ClassName))) {
1051 migrateFactoryMethod(Ctx, CDecl, OM);
1052 return;
1053 }
1054 ReplaceWithInstancetype(Ctx, *this, OM);
1055}
1056
1057static bool TypeIsInnerPointer(QualType T) {
1058 if (!T->isAnyPointerType())
1059 return false;
1060 if (T->isObjCObjectPointerType() || T->isObjCBuiltinType() ||
1061 T->isBlockPointerType() || T->isFunctionPointerType() ||
1062 ento::coreFoundation::isCFObjectRef(T))
1063 return false;
1064 // Also, typedef-of-pointer-to-incomplete-struct is something that we assume
1065 // is not an innter pointer type.
1066 QualType OrigT = T;
1067 while (const TypedefType *TD = dyn_cast<TypedefType>(T.getTypePtr()))
1068 T = TD->getDecl()->getUnderlyingType();
1069 if (OrigT == T || !T->isPointerType())
1070 return true;
1071 const PointerType* PT = T->getAs<PointerType>();
1072 QualType UPointeeT = PT->getPointeeType().getUnqualifiedType();
1073 if (UPointeeT->isRecordType()) {
1074 const RecordType *RecordTy = UPointeeT->getAs<RecordType>();
1075 if (!RecordTy->getDecl()->isCompleteDefinition())
1076 return false;
1077 }
1078 return true;
1079}
1080
1081/// Check whether the two versions match.
1082static bool versionsMatch(const VersionTuple &X, const VersionTuple &Y) {
1083 return (X == Y);
1084}
1085
1086/// AvailabilityAttrsMatch - This routine checks that if comparing two
1087/// availability attributes, all their components match. It returns
1088/// true, if not dealing with availability or when all components of
1089/// availability attributes match. This routine is only called when
1090/// the attributes are of the same kind.
1091static bool AvailabilityAttrsMatch(Attr *At1, Attr *At2) {
1092 const AvailabilityAttr *AA1 = dyn_cast<AvailabilityAttr>(At1);
1093 if (!AA1)
1094 return true;
1095 const AvailabilityAttr *AA2 = dyn_cast<AvailabilityAttr>(At2);
1096
1097 VersionTuple Introduced1 = AA1->getIntroduced();
1098 VersionTuple Deprecated1 = AA1->getDeprecated();
1099 VersionTuple Obsoleted1 = AA1->getObsoleted();
1100 bool IsUnavailable1 = AA1->getUnavailable();
1101 VersionTuple Introduced2 = AA2->getIntroduced();
1102 VersionTuple Deprecated2 = AA2->getDeprecated();
1103 VersionTuple Obsoleted2 = AA2->getObsoleted();
1104 bool IsUnavailable2 = AA2->getUnavailable();
1105 return (versionsMatch(Introduced1, Introduced2) &&
1106 versionsMatch(Deprecated1, Deprecated2) &&
1107 versionsMatch(Obsoleted1, Obsoleted2) &&
1108 IsUnavailable1 == IsUnavailable2);
1109}
1110
1111static bool MatchTwoAttributeLists(const AttrVec &Attrs1, const AttrVec &Attrs2,
1112 bool &AvailabilityArgsMatch) {
1113 // This list is very small, so this need not be optimized.
1114 for (unsigned i = 0, e = Attrs1.size(); i != e; i++) {
1115 bool match = false;
1116 for (unsigned j = 0, f = Attrs2.size(); j != f; j++) {
1117 // Matching attribute kind only. Except for Availability attributes,
1118 // we are not getting into details of the attributes. For all practical purposes
1119 // this is sufficient.
1120 if (Attrs1[i]->getKind() == Attrs2[j]->getKind()) {
1121 if (AvailabilityArgsMatch)
1122 AvailabilityArgsMatch = AvailabilityAttrsMatch(Attrs1[i], Attrs2[j]);
1123 match = true;
1124 break;
1125 }
1126 }
1127 if (!match)
1128 return false;
1129 }
1130 return true;
1131}
1132
1133/// AttributesMatch - This routine checks list of attributes for two
1134/// decls. It returns false, if there is a mismatch in kind of
1135/// attributes seen in the decls. It returns true if the two decls
1136/// have list of same kind of attributes. Furthermore, when there
1137/// are availability attributes in the two decls, it sets the
1138/// AvailabilityArgsMatch to false if availability attributes have
1139/// different versions, etc.
1140static bool AttributesMatch(const Decl *Decl1, const Decl *Decl2,
1141 bool &AvailabilityArgsMatch) {
1142 if (!Decl1->hasAttrs() || !Decl2->hasAttrs()) {
1143 AvailabilityArgsMatch = (Decl1->hasAttrs() == Decl2->hasAttrs());
1144 return true;
1145 }
1146 AvailabilityArgsMatch = true;
1147 const AttrVec &Attrs1 = Decl1->getAttrs();
1148 const AttrVec &Attrs2 = Decl2->getAttrs();
1149 bool match = MatchTwoAttributeLists(Attrs1, Attrs2, AvailabilityArgsMatch);
1150 if (match && (Attrs2.size() > Attrs1.size()))
1151 return MatchTwoAttributeLists(Attrs2, Attrs1, AvailabilityArgsMatch);
1152 return match;
1153}
1154
1155static bool IsValidIdentifier(ASTContext &Ctx,
1156 const char *Name) {
1157 if (!isIdentifierHead(Name[0]))
1158 return false;
1159 std::string NameString = Name;
1160 NameString[0] = toLowercase(NameString[0]);
1161 IdentifierInfo *II = &Ctx.Idents.get(NameString);
1162 return II->getTokenID() == tok::identifier;
1163}
1164
1165bool ObjCMigrateASTConsumer::migrateProperty(ASTContext &Ctx,
1166 ObjCContainerDecl *D,
1167 ObjCMethodDecl *Method) {
1168 if (Method->isPropertyAccessor() || !Method->isInstanceMethod() ||
1169 Method->param_size() != 0)
1170 return false;
1171 // Is this method candidate to be a getter?
1172 QualType GRT = Method->getReturnType();
1173 if (GRT->isVoidType())
1174 return false;
1175
1176 Selector GetterSelector = Method->getSelector();
1177 ObjCInstanceTypeFamily OIT_Family =
1178 Selector::getInstTypeMethodFamily(GetterSelector);
1179
1180 if (OIT_Family != OIT_None)
1181 return false;
1182
1183 IdentifierInfo *getterName = GetterSelector.getIdentifierInfoForSlot(0);
1184 Selector SetterSelector =
1185 SelectorTable::constructSetterSelector(PP.getIdentifierTable(),
1186 PP.getSelectorTable(),
1187 getterName);
1188 ObjCMethodDecl *SetterMethod = D->getInstanceMethod(SetterSelector);
1189 unsigned LengthOfPrefix = 0;
1190 if (!SetterMethod) {
1191 // try a different naming convention for getter: isXxxxx
1192 StringRef getterNameString = getterName->getName();
1193 bool IsPrefix = getterNameString.startswith("is");
1194 // Note that we don't want to change an isXXX method of retainable object
1195 // type to property (readonly or otherwise).
1196 if (IsPrefix && GRT->isObjCRetainableType())
1197 return false;
1198 if (IsPrefix || getterNameString.startswith("get")) {
1199 LengthOfPrefix = (IsPrefix ? 2 : 3);
1200 const char *CGetterName = getterNameString.data() + LengthOfPrefix;
1201 // Make sure that first character after "is" or "get" prefix can
1202 // start an identifier.
1203 if (!IsValidIdentifier(Ctx, CGetterName))
1204 return false;
1205 if (CGetterName[0] && isUppercase(CGetterName[0])) {
1206 getterName = &Ctx.Idents.get(CGetterName);
1207 SetterSelector =
1208 SelectorTable::constructSetterSelector(PP.getIdentifierTable(),
1209 PP.getSelectorTable(),
1210 getterName);
1211 SetterMethod = D->getInstanceMethod(SetterSelector);
1212 }
1213 }
1214 }
1215
1216 if (SetterMethod) {
1217 if ((ASTMigrateActions & FrontendOptions::ObjCMT_ReadwriteProperty) == 0)
1218 return false;
1219 bool AvailabilityArgsMatch;
1220 if (SetterMethod->isDeprecated() ||
1221 !AttributesMatch(Method, SetterMethod, AvailabilityArgsMatch))
1222 return false;
1223
1224 // Is this a valid setter, matching the target getter?
1225 QualType SRT = SetterMethod->getReturnType();
1226 if (!SRT->isVoidType())
1227 return false;
1228 const ParmVarDecl *argDecl = *SetterMethod->param_begin();
1229 QualType ArgType = argDecl->getType();
1230 if (!Ctx.hasSameUnqualifiedType(ArgType, GRT))
1231 return false;
1232 edit::Commit commit(*Editor);
1233 rewriteToObjCProperty(Method, SetterMethod, *NSAPIObj, commit,
1234 LengthOfPrefix,
1235 (ASTMigrateActions &
1236 FrontendOptions::ObjCMT_AtomicProperty) != 0,
1237 (ASTMigrateActions &
1238 FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty) != 0,
1239 AvailabilityArgsMatch);
1240 Editor->commit(commit);
1241 return true;
1242 }
1243 else if (ASTMigrateActions & FrontendOptions::ObjCMT_ReadonlyProperty) {
1244 // Try a non-void method with no argument (and no setter or property of same name
1245 // as a 'readonly' property.
1246 edit::Commit commit(*Editor);
1247 rewriteToObjCProperty(Method, nullptr /*SetterMethod*/, *NSAPIObj, commit,
1248 LengthOfPrefix,
1249 (ASTMigrateActions &
1250 FrontendOptions::ObjCMT_AtomicProperty) != 0,
1251 (ASTMigrateActions &
1252 FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty) != 0,
1253 /*AvailabilityArgsMatch*/false);
1254 Editor->commit(commit);
1255 return true;
1256 }
1257 return false;
1258}
1259
1260void ObjCMigrateASTConsumer::migrateNsReturnsInnerPointer(ASTContext &Ctx,
1261 ObjCMethodDecl *OM) {
1262 if (OM->isImplicit() ||
1263 !OM->isInstanceMethod() ||
1264 OM->hasAttr<ObjCReturnsInnerPointerAttr>())
1265 return;
1266
1267 QualType RT = OM->getReturnType();
1268 if (!TypeIsInnerPointer(RT) ||
1269 !NSAPIObj->isMacroDefined("NS_RETURNS_INNER_POINTER"))
1270 return;
1271
1272 edit::Commit commit(*Editor);
1273 commit.insertBefore(OM->getEndLoc(), " NS_RETURNS_INNER_POINTER");
1274 Editor->commit(commit);
1275}
1276
1277void ObjCMigrateASTConsumer::migratePropertyNsReturnsInnerPointer(ASTContext &Ctx,
1278 ObjCPropertyDecl *P) {
1279 QualType T = P->getType();
1280
1281 if (!TypeIsInnerPointer(T) ||
1282 !NSAPIObj->isMacroDefined("NS_RETURNS_INNER_POINTER"))
1283 return;
1284 edit::Commit commit(*Editor);
1285 commit.insertBefore(P->getEndLoc(), " NS_RETURNS_INNER_POINTER ");
1286 Editor->commit(commit);
1287}
1288
1289void ObjCMigrateASTConsumer::migrateAllMethodInstaceType(ASTContext &Ctx,
1290 ObjCContainerDecl *CDecl) {
1291 if (CDecl->isDeprecated() || IsCategoryNameWithDeprecatedSuffix(CDecl))
1292 return;
1293
1294 // migrate methods which can have instancetype as their result type.
1295 for (auto *Method : CDecl->methods()) {
1296 if (Method->isDeprecated())
1297 continue;
1298 migrateMethodInstanceType(Ctx, CDecl, Method);
1299 }
1300}
1301
1302void ObjCMigrateASTConsumer::migrateFactoryMethod(ASTContext &Ctx,
1303 ObjCContainerDecl *CDecl,
1304 ObjCMethodDecl *OM,
1305 ObjCInstanceTypeFamily OIT_Family) {
1306 if (OM->isInstanceMethod() ||
1307 OM->getReturnType() == Ctx.getObjCInstanceType() ||
1308 !OM->getReturnType()->isObjCIdType())
1309 return;
1310
1311 // Candidate factory methods are + (id) NaMeXXX : ... which belong to a class
1312 // NSYYYNamE with matching names be at least 3 characters long.
1313 ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl);
1314 if (!IDecl) {
1315 if (ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(CDecl))
1316 IDecl = CatDecl->getClassInterface();
1317 else if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(CDecl))
1318 IDecl = ImpDecl->getClassInterface();
1319 }
1320 if (!IDecl)
1321 return;
1322
1323 std::string StringClassName = IDecl->getName();
1324 StringRef LoweredClassName(StringClassName);
1325 std::string StringLoweredClassName = LoweredClassName.lower();
1326 LoweredClassName = StringLoweredClassName;
1327
1328 IdentifierInfo *MethodIdName = OM->getSelector().getIdentifierInfoForSlot(0);
1329 // Handle method with no name at its first selector slot; e.g. + (id):(int)x.
1330 if (!MethodIdName)
1331 return;
1332
1333 std::string MethodName = MethodIdName->getName();
1334 if (OIT_Family == OIT_Singleton || OIT_Family == OIT_ReturnsSelf) {
1335 StringRef STRefMethodName(MethodName);
1336 size_t len = 0;
1337 if (STRefMethodName.startswith("standard"))
1338 len = strlen("standard");
1339 else if (STRefMethodName.startswith("shared"))
1340 len = strlen("shared");
1341 else if (STRefMethodName.startswith("default"))
1342 len = strlen("default");
1343 else
1344 return;
1345 MethodName = STRefMethodName.substr(len);
1346 }
1347 std::string MethodNameSubStr = MethodName.substr(0, 3);
1348 StringRef MethodNamePrefix(MethodNameSubStr);
1349 std::string StringLoweredMethodNamePrefix = MethodNamePrefix.lower();
1350 MethodNamePrefix = StringLoweredMethodNamePrefix;
1351 size_t Ix = LoweredClassName.rfind(MethodNamePrefix);
1352 if (Ix == StringRef::npos)
1353 return;
1354 std::string ClassNamePostfix = LoweredClassName.substr(Ix);
1355 StringRef LoweredMethodName(MethodName);
1356 std::string StringLoweredMethodName = LoweredMethodName.lower();
1357 LoweredMethodName = StringLoweredMethodName;
1358 if (!LoweredMethodName.startswith(ClassNamePostfix))
1359 return;
1360 if (OIT_Family == OIT_ReturnsSelf)
1361 ReplaceWithClasstype(*this, OM);
1362 else
1363 ReplaceWithInstancetype(Ctx, *this, OM);
1364}
1365
1366static bool IsVoidStarType(QualType Ty) {
1367 if (!Ty->isPointerType())
21
Calling 'Type::isPointerType'
24
Returning from 'Type::isPointerType'
25
Taking false branch
1368 return false;
1369
1370 while (const TypedefType *TD = dyn_cast<TypedefType>(Ty.getTypePtr()))
26
Assuming the object is not a 'TypedefType'
27
Loop condition is false. Execution continues on line 1374
1371 Ty = TD->getDecl()->getUnderlyingType();
1372
1373 // Is the type void*?
1374 const PointerType* PT = Ty->getAs<PointerType>();
28
Assuming the object is not a 'PointerType'
29
'PT' initialized to a null pointer value
1375 if (PT->getPointeeType().getUnqualifiedType()->isVoidType())
30
Called C++ object pointer is null
1376 return true;
1377 return IsVoidStarType(PT->getPointeeType());
1378}
1379
1380/// AuditedType - This routine audits the type AT and returns false if it is one of known
1381/// CF object types or of the "void *" variety. It returns true if we don't care about the type
1382/// such as a non-pointer or pointers which have no ownership issues (such as "int *").
1383static bool AuditedType (QualType AT) {
1384 if (!AT->isAnyPointerType() && !AT->isBlockPointerType())
1385 return true;
1386 // FIXME. There isn't much we can say about CF pointer type; or is there?
1387 if (ento::coreFoundation::isCFObjectRef(AT) ||
19
Assuming the condition is false
1388 IsVoidStarType(AT) ||
20
Calling 'IsVoidStarType'
1389 // If an ObjC object is type, assuming that it is not a CF function and
1390 // that it is an un-audited function.
1391 AT->isObjCObjectPointerType() || AT->isObjCBuiltinType())
1392 return false;
1393 // All other pointers are assumed audited as harmless.
1394 return true;
1395}
1396
1397void ObjCMigrateASTConsumer::AnnotateImplicitBridging(ASTContext &Ctx) {
1398 if (CFFunctionIBCandidates.empty())
1399 return;
1400 if (!NSAPIObj->isMacroDefined("CF_IMPLICIT_BRIDGING_ENABLED")) {
1401 CFFunctionIBCandidates.clear();
1402 FileId = FileID();
1403 return;
1404 }
1405 // Insert CF_IMPLICIT_BRIDGING_ENABLE/CF_IMPLICIT_BRIDGING_DISABLED
1406 const Decl *FirstFD = CFFunctionIBCandidates[0];
1407 const Decl *LastFD =
1408 CFFunctionIBCandidates[CFFunctionIBCandidates.size()-1];
1409 const char *PragmaString = "\nCF_IMPLICIT_BRIDGING_ENABLED\n\n";
1410 edit::Commit commit(*Editor);
1411 commit.insertBefore(FirstFD->getBeginLoc(), PragmaString);
1412 PragmaString = "\n\nCF_IMPLICIT_BRIDGING_DISABLED\n";
1413 SourceLocation EndLoc = LastFD->getEndLoc();
1414 // get location just past end of function location.
1415 EndLoc = PP.getLocForEndOfToken(EndLoc);
1416 if (isa<FunctionDecl>(LastFD)) {
1417 // For Methods, EndLoc points to the ending semcolon. So,
1418 // not of these extra work is needed.
1419 Token Tok;
1420 // get locaiton of token that comes after end of function.
1421 bool Failed = PP.getRawToken(EndLoc, Tok, /*IgnoreWhiteSpace=*/true);
1422 if (!Failed)
1423 EndLoc = Tok.getLocation();
1424 }
1425 commit.insertAfterToken(EndLoc, PragmaString);
1426 Editor->commit(commit);
1427 FileId = FileID();
1428 CFFunctionIBCandidates.clear();
1429}
1430
1431void ObjCMigrateASTConsumer::migrateCFAnnotation(ASTContext &Ctx, const Decl *Decl) {
1432 if (Decl->isDeprecated())
4
Taking false branch
1433 return;
1434
1435 if (Decl->hasAttr<CFAuditedTransferAttr>()) {
5
Taking false branch
1436 assert(CFFunctionIBCandidates.empty() &&((CFFunctionIBCandidates.empty() && "Cannot have audited functions/methods inside user "
"provided CF_IMPLICIT_BRIDGING_ENABLE") ? static_cast<void
> (0) : __assert_fail ("CFFunctionIBCandidates.empty() && \"Cannot have audited functions/methods inside user \" \"provided CF_IMPLICIT_BRIDGING_ENABLE\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1438, __PRETTY_FUNCTION__))
1437 "Cannot have audited functions/methods inside user "((CFFunctionIBCandidates.empty() && "Cannot have audited functions/methods inside user "
"provided CF_IMPLICIT_BRIDGING_ENABLE") ? static_cast<void
> (0) : __assert_fail ("CFFunctionIBCandidates.empty() && \"Cannot have audited functions/methods inside user \" \"provided CF_IMPLICIT_BRIDGING_ENABLE\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1438, __PRETTY_FUNCTION__))
1438 "provided CF_IMPLICIT_BRIDGING_ENABLE")((CFFunctionIBCandidates.empty() && "Cannot have audited functions/methods inside user "
"provided CF_IMPLICIT_BRIDGING_ENABLE") ? static_cast<void
> (0) : __assert_fail ("CFFunctionIBCandidates.empty() && \"Cannot have audited functions/methods inside user \" \"provided CF_IMPLICIT_BRIDGING_ENABLE\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1438, __PRETTY_FUNCTION__))
;
1439 return;
1440 }
1441
1442 // Finction must be annotated first.
1443 if (const FunctionDecl *FuncDecl
6.1
'FuncDecl' is null
6.1
'FuncDecl' is null
= dyn_cast<FunctionDecl>(Decl)) {
6
Assuming 'Decl' is not a 'FunctionDecl'
7
Taking false branch
1444 CF_BRIDGING_KIND AuditKind = migrateAddFunctionAnnotation(Ctx, FuncDecl);
1445 if (AuditKind == CF_BRIDGING_ENABLE) {
1446 CFFunctionIBCandidates.push_back(Decl);
1447 if (FileId.isInvalid())
1448 FileId = PP.getSourceManager().getFileID(Decl->getLocation());
1449 }
1450 else if (AuditKind == CF_BRIDGING_MAY_INCLUDE) {
1451 if (!CFFunctionIBCandidates.empty()) {
1452 CFFunctionIBCandidates.push_back(Decl);
1453 if (FileId.isInvalid())
1454 FileId = PP.getSourceManager().getFileID(Decl->getLocation());
1455 }
1456 }
1457 else
1458 AnnotateImplicitBridging(Ctx);
1459 }
1460 else {
1461 migrateAddMethodAnnotation(Ctx, cast<ObjCMethodDecl>(Decl));
8
'Decl' is a 'ObjCMethodDecl'
9
Calling 'ObjCMigrateASTConsumer::migrateAddMethodAnnotation'
1462 AnnotateImplicitBridging(Ctx);
1463 }
1464}
1465
1466void ObjCMigrateASTConsumer::AddCFAnnotations(ASTContext &Ctx,
1467 const RetainSummary *RS,
1468 const FunctionDecl *FuncDecl,
1469 bool ResultAnnotated) {
1470 // Annotate function.
1471 if (!ResultAnnotated) {
1472 RetEffect Ret = RS->getRetEffect();
1473 const char *AnnotationString = nullptr;
1474 if (Ret.getObjKind() == ObjKind::CF) {
1475 if (Ret.isOwned() && NSAPIObj->isMacroDefined("CF_RETURNS_RETAINED"))
1476 AnnotationString = " CF_RETURNS_RETAINED";
1477 else if (Ret.notOwned() &&
1478 NSAPIObj->isMacroDefined("CF_RETURNS_NOT_RETAINED"))
1479 AnnotationString = " CF_RETURNS_NOT_RETAINED";
1480 }
1481 else if (Ret.getObjKind() == ObjKind::ObjC) {
1482 if (Ret.isOwned() && NSAPIObj->isMacroDefined("NS_RETURNS_RETAINED"))
1483 AnnotationString = " NS_RETURNS_RETAINED";
1484 }
1485
1486 if (AnnotationString) {
1487 edit::Commit commit(*Editor);
1488 commit.insertAfterToken(FuncDecl->getEndLoc(), AnnotationString);
1489 Editor->commit(commit);
1490 }
1491 }
1492 unsigned i = 0;
1493 for (FunctionDecl::param_const_iterator pi = FuncDecl->param_begin(),
1494 pe = FuncDecl->param_end(); pi != pe; ++pi, ++i) {
1495 const ParmVarDecl *pd = *pi;
1496 ArgEffect AE = RS->getArg(i);
1497 if (AE.getKind() == DecRef && AE.getObjKind() == ObjKind::CF &&
1498 !pd->hasAttr<CFConsumedAttr>() &&
1499 NSAPIObj->isMacroDefined("CF_CONSUMED")) {
1500 edit::Commit commit(*Editor);
1501 commit.insertBefore(pd->getLocation(), "CF_CONSUMED ");
1502 Editor->commit(commit);
1503 } else if (AE.getKind() == DecRef && AE.getObjKind() == ObjKind::ObjC &&
1504 !pd->hasAttr<NSConsumedAttr>() &&
1505 NSAPIObj->isMacroDefined("NS_CONSUMED")) {
1506 edit::Commit commit(*Editor);
1507 commit.insertBefore(pd->getLocation(), "NS_CONSUMED ");
1508 Editor->commit(commit);
1509 }
1510 }
1511}
1512
1513ObjCMigrateASTConsumer::CF_BRIDGING_KIND
1514 ObjCMigrateASTConsumer::migrateAddFunctionAnnotation(
1515 ASTContext &Ctx,
1516 const FunctionDecl *FuncDecl) {
1517 if (FuncDecl->hasBody())
1518 return CF_BRIDGING_NONE;
1519
1520 const RetainSummary *RS =
1521 getSummaryManager(Ctx).getSummary(AnyCall(FuncDecl));
1522 bool FuncIsReturnAnnotated = (FuncDecl->hasAttr<CFReturnsRetainedAttr>() ||
1523 FuncDecl->hasAttr<CFReturnsNotRetainedAttr>() ||
1524 FuncDecl->hasAttr<NSReturnsRetainedAttr>() ||
1525 FuncDecl->hasAttr<NSReturnsNotRetainedAttr>() ||
1526 FuncDecl->hasAttr<NSReturnsAutoreleasedAttr>());
1527
1528 // Trivial case of when function is annotated and has no argument.
1529 if (FuncIsReturnAnnotated && FuncDecl->getNumParams() == 0)
1530 return CF_BRIDGING_NONE;
1531
1532 bool ReturnCFAudited = false;
1533 if (!FuncIsReturnAnnotated) {
1534 RetEffect Ret = RS->getRetEffect();
1535 if (Ret.getObjKind() == ObjKind::CF &&
1536 (Ret.isOwned() || Ret.notOwned()))
1537 ReturnCFAudited = true;
1538 else if (!AuditedType(FuncDecl->getReturnType()))
1539 return CF_BRIDGING_NONE;
1540 }
1541
1542 // At this point result type is audited for potential inclusion.
1543 unsigned i = 0;
1544 bool ArgCFAudited = false;
1545 for (FunctionDecl::param_const_iterator pi = FuncDecl->param_begin(),
1546 pe = FuncDecl->param_end(); pi != pe; ++pi, ++i) {
1547 const ParmVarDecl *pd = *pi;
1548 ArgEffect AE = RS->getArg(i);
1549 if ((AE.getKind() == DecRef /*CFConsumed annotated*/ ||
1550 AE.getKind() == IncRef) && AE.getObjKind() == ObjKind::CF) {
1551 if (AE.getKind() == DecRef && !pd->hasAttr<CFConsumedAttr>())
1552 ArgCFAudited = true;
1553 else if (AE.getKind() == IncRef)
1554 ArgCFAudited = true;
1555 } else {
1556 QualType AT = pd->getType();
1557 if (!AuditedType(AT)) {
1558 AddCFAnnotations(Ctx, RS, FuncDecl, FuncIsReturnAnnotated);
1559 return CF_BRIDGING_NONE;
1560 }
1561 }
1562 }
1563 if (ReturnCFAudited || ArgCFAudited)
1564 return CF_BRIDGING_ENABLE;
1565
1566 return CF_BRIDGING_MAY_INCLUDE;
1567}
1568
1569void ObjCMigrateASTConsumer::migrateARCSafeAnnotation(ASTContext &Ctx,
1570 ObjCContainerDecl *CDecl) {
1571 if (!isa<ObjCInterfaceDecl>(CDecl) || CDecl->isDeprecated())
1
Assuming 'CDecl' is a 'ObjCInterfaceDecl'
2
Taking false branch
1572 return;
1573
1574 // migrate methods which can have instancetype as their result type.
1575 for (const auto *Method : CDecl->methods())
1576 migrateCFAnnotation(Ctx, Method);
3
Calling 'ObjCMigrateASTConsumer::migrateCFAnnotation'
1577}
1578
1579void ObjCMigrateASTConsumer::AddCFAnnotations(ASTContext &Ctx,
1580 const RetainSummary *RS,
1581 const ObjCMethodDecl *MethodDecl,
1582 bool ResultAnnotated) {
1583 // Annotate function.
1584 if (!ResultAnnotated) {
1585 RetEffect Ret = RS->getRetEffect();
1586 const char *AnnotationString = nullptr;
1587 if (Ret.getObjKind() == ObjKind::CF) {
1588 if (Ret.isOwned() && NSAPIObj->isMacroDefined("CF_RETURNS_RETAINED"))
1589 AnnotationString = " CF_RETURNS_RETAINED";
1590 else if (Ret.notOwned() &&
1591 NSAPIObj->isMacroDefined("CF_RETURNS_NOT_RETAINED"))
1592 AnnotationString = " CF_RETURNS_NOT_RETAINED";
1593 }
1594 else if (Ret.getObjKind() == ObjKind::ObjC) {
1595 ObjCMethodFamily OMF = MethodDecl->getMethodFamily();
1596 switch (OMF) {
1597 case clang::OMF_alloc:
1598 case clang::OMF_new:
1599 case clang::OMF_copy:
1600 case clang::OMF_init:
1601 case clang::OMF_mutableCopy:
1602 break;
1603
1604 default:
1605 if (Ret.isOwned() && NSAPIObj->isMacroDefined("NS_RETURNS_RETAINED"))
1606 AnnotationString = " NS_RETURNS_RETAINED";
1607 break;
1608 }
1609 }
1610
1611 if (AnnotationString) {
1612 edit::Commit commit(*Editor);
1613 commit.insertBefore(MethodDecl->getEndLoc(), AnnotationString);
1614 Editor->commit(commit);
1615 }
1616 }
1617 unsigned i = 0;
1618 for (ObjCMethodDecl::param_const_iterator pi = MethodDecl->param_begin(),
1619 pe = MethodDecl->param_end(); pi != pe; ++pi, ++i) {
1620 const ParmVarDecl *pd = *pi;
1621 ArgEffect AE = RS->getArg(i);
1622 if (AE.getKind() == DecRef
1623 && AE.getObjKind() == ObjKind::CF
1624 && !pd->hasAttr<CFConsumedAttr>() &&
1625 NSAPIObj->isMacroDefined("CF_CONSUMED")) {
1626 edit::Commit commit(*Editor);
1627 commit.insertBefore(pd->getLocation(), "CF_CONSUMED ");
1628 Editor->commit(commit);
1629 }
1630 }
1631}
1632
1633void ObjCMigrateASTConsumer::migrateAddMethodAnnotation(
1634 ASTContext &Ctx,
1635 const ObjCMethodDecl *MethodDecl) {
1636 if (MethodDecl->hasBody() || MethodDecl->isImplicit())
10
Assuming the condition is false
11
Assuming the condition is false
12
Taking false branch
1637 return;
1638
1639 const RetainSummary *RS =
1640 getSummaryManager(Ctx).getSummary(AnyCall(MethodDecl));
1641
1642 bool MethodIsReturnAnnotated =
1643 (MethodDecl->hasAttr<CFReturnsRetainedAttr>() ||
1644 MethodDecl->hasAttr<CFReturnsNotRetainedAttr>() ||
1645 MethodDecl->hasAttr<NSReturnsRetainedAttr>() ||
1646 MethodDecl->hasAttr<NSReturnsNotRetainedAttr>() ||
1647 MethodDecl->hasAttr<NSReturnsAutoreleasedAttr>());
1648
1649 if (RS->getReceiverEffect().getKind() == DecRef &&
13
Assuming the condition is false
14
Taking false branch
1650 !MethodDecl->hasAttr<NSConsumesSelfAttr>() &&
1651 MethodDecl->getMethodFamily() != OMF_init &&
1652 MethodDecl->getMethodFamily() != OMF_release &&
1653 NSAPIObj->isMacroDefined("NS_CONSUMES_SELF")) {
1654 edit::Commit commit(*Editor);
1655 commit.insertBefore(MethodDecl->getEndLoc(), " NS_CONSUMES_SELF");
1656 Editor->commit(commit);
1657 }
1658
1659 // Trivial case of when function is annotated and has no argument.
1660 if (MethodIsReturnAnnotated
14.1
'MethodIsReturnAnnotated' is false
14.1
'MethodIsReturnAnnotated' is false
&&
1661 (MethodDecl->param_begin() == MethodDecl->param_end()))
1662 return;
1663
1664 if (!MethodIsReturnAnnotated
14.2
'MethodIsReturnAnnotated' is false
14.2
'MethodIsReturnAnnotated' is false
) {
15
Taking true branch
1665 RetEffect Ret = RS->getRetEffect();
1666 if ((Ret.getObjKind() == ObjKind::CF ||
16
Assuming the condition is false
1667 Ret.getObjKind() == ObjKind::ObjC) &&
17
Assuming the condition is false
1668 (Ret.isOwned() || Ret.notOwned())) {
1669 AddCFAnnotations(Ctx, RS, MethodDecl, false);
1670 return;
1671 } else if (!AuditedType(MethodDecl->getReturnType()))
18
Calling 'AuditedType'
1672 return;
1673 }
1674
1675 // At this point result type is either annotated or audited.
1676 unsigned i = 0;
1677 for (ObjCMethodDecl::param_const_iterator pi = MethodDecl->param_begin(),
1678 pe = MethodDecl->param_end(); pi != pe; ++pi, ++i) {
1679 const ParmVarDecl *pd = *pi;
1680 ArgEffect AE = RS->getArg(i);
1681 if ((AE.getKind() == DecRef && !pd->hasAttr<CFConsumedAttr>()) ||
1682 AE.getKind() == IncRef || !AuditedType(pd->getType())) {
1683 AddCFAnnotations(Ctx, RS, MethodDecl, MethodIsReturnAnnotated);
1684 return;
1685 }
1686 }
1687}
1688
1689namespace {
1690class SuperInitChecker : public RecursiveASTVisitor<SuperInitChecker> {
1691public:
1692 bool shouldVisitTemplateInstantiations() const { return false; }
1693 bool shouldWalkTypesOfTypeLocs() const { return false; }
1694
1695 bool VisitObjCMessageExpr(ObjCMessageExpr *E) {
1696 if (E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
1697 if (E->getMethodFamily() == OMF_init)
1698 return false;
1699 }
1700 return true;
1701 }
1702};
1703} // end anonymous namespace
1704
1705static bool hasSuperInitCall(const ObjCMethodDecl *MD) {
1706 return !SuperInitChecker().TraverseStmt(MD->getBody());
1707}
1708
1709void ObjCMigrateASTConsumer::inferDesignatedInitializers(
1710 ASTContext &Ctx,
1711 const ObjCImplementationDecl *ImplD) {
1712
1713 const ObjCInterfaceDecl *IFace = ImplD->getClassInterface();
1714 if (!IFace || IFace->hasDesignatedInitializers())
1715 return;
1716 if (!NSAPIObj->isMacroDefined("NS_DESIGNATED_INITIALIZER"))
1717 return;
1718
1719 for (const auto *MD : ImplD->instance_methods()) {
1720 if (MD->isDeprecated() ||
1721 MD->getMethodFamily() != OMF_init ||
1722 MD->isDesignatedInitializerForTheInterface())
1723 continue;
1724 const ObjCMethodDecl *IFaceM = IFace->getMethod(MD->getSelector(),
1725 /*isInstance=*/true);
1726 if (!IFaceM)
1727 continue;
1728 if (hasSuperInitCall(MD)) {
1729 edit::Commit commit(*Editor);
1730 commit.insert(IFaceM->getEndLoc(), " NS_DESIGNATED_INITIALIZER");
1731 Editor->commit(commit);
1732 }
1733 }
1734}
1735
1736bool ObjCMigrateASTConsumer::InsertFoundation(ASTContext &Ctx,
1737 SourceLocation Loc) {
1738 if (FoundationIncluded)
1739 return true;
1740 if (Loc.isInvalid())
1741 return false;
1742 auto *nsEnumId = &Ctx.Idents.get("NS_ENUM");
1743 if (PP.getMacroDefinitionAtLoc(nsEnumId, Loc)) {
1744 FoundationIncluded = true;
1745 return true;
1746 }
1747 edit::Commit commit(*Editor);
1748 if (Ctx.getLangOpts().Modules)
1749 commit.insert(Loc, "#ifndef NS_ENUM\n@import Foundation;\n#endif\n");
1750 else
1751 commit.insert(Loc, "#ifndef NS_ENUM\n#import <Foundation/Foundation.h>\n#endif\n");
1752 Editor->commit(commit);
1753 FoundationIncluded = true;
1754 return true;
1755}
1756
1757namespace {
1758
1759class RewritesReceiver : public edit::EditsReceiver {
1760 Rewriter &Rewrite;
1761
1762public:
1763 RewritesReceiver(Rewriter &Rewrite) : Rewrite(Rewrite) { }
1764
1765 void insert(SourceLocation loc, StringRef text) override {
1766 Rewrite.InsertText(loc, text);
1767 }
1768 void replace(CharSourceRange range, StringRef text) override {
1769 Rewrite.ReplaceText(range.getBegin(), Rewrite.getRangeSize(range), text);
1770 }
1771};
1772
1773class JSONEditWriter : public edit::EditsReceiver {
1774 SourceManager &SourceMgr;
1775 llvm::raw_ostream &OS;
1776
1777public:
1778 JSONEditWriter(SourceManager &SM, llvm::raw_ostream &OS)
1779 : SourceMgr(SM), OS(OS) {
1780 OS << "[\n";
1781 }
1782 ~JSONEditWriter() override { OS << "]\n"; }
1783
1784private:
1785 struct EntryWriter {
1786 SourceManager &SourceMgr;
1787 llvm::raw_ostream &OS;
1788
1789 EntryWriter(SourceManager &SM, llvm::raw_ostream &OS)
1790 : SourceMgr(SM), OS(OS) {
1791 OS << " {\n";
1792 }
1793 ~EntryWriter() {
1794 OS << " },\n";
1795 }
1796
1797 void writeLoc(SourceLocation Loc) {
1798 FileID FID;
1799 unsigned Offset;
1800 std::tie(FID, Offset) = SourceMgr.getDecomposedLoc(Loc);
1801 assert(FID.isValid())((FID.isValid()) ? static_cast<void> (0) : __assert_fail
("FID.isValid()", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1801, __PRETTY_FUNCTION__))
;
1802 SmallString<200> Path =
1803 StringRef(SourceMgr.getFileEntryForID(FID)->getName());
1804 llvm::sys::fs::make_absolute(Path);
1805 OS << " \"file\": \"";
1806 OS.write_escaped(Path.str()) << "\",\n";
1807 OS << " \"offset\": " << Offset << ",\n";
1808 }
1809
1810 void writeRemove(CharSourceRange Range) {
1811 assert(Range.isCharRange())((Range.isCharRange()) ? static_cast<void> (0) : __assert_fail
("Range.isCharRange()", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1811, __PRETTY_FUNCTION__))
;
1812 std::pair<FileID, unsigned> Begin =
1813 SourceMgr.getDecomposedLoc(Range.getBegin());
1814 std::pair<FileID, unsigned> End =
1815 SourceMgr.getDecomposedLoc(Range.getEnd());
1816 assert(Begin.first == End.first)((Begin.first == End.first) ? static_cast<void> (0) : __assert_fail
("Begin.first == End.first", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1816, __PRETTY_FUNCTION__))
;
1817 assert(Begin.second <= End.second)((Begin.second <= End.second) ? static_cast<void> (0
) : __assert_fail ("Begin.second <= End.second", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1817, __PRETTY_FUNCTION__))
;
1818 unsigned Length = End.second - Begin.second;
1819
1820 OS << " \"remove\": " << Length << ",\n";
1821 }
1822
1823 void writeText(StringRef Text) {
1824 OS << " \"text\": \"";
1825 OS.write_escaped(Text) << "\",\n";
1826 }
1827 };
1828
1829 void insert(SourceLocation Loc, StringRef Text) override {
1830 EntryWriter Writer(SourceMgr, OS);
1831 Writer.writeLoc(Loc);
1832 Writer.writeText(Text);
1833 }
1834
1835 void replace(CharSourceRange Range, StringRef Text) override {
1836 EntryWriter Writer(SourceMgr, OS);
1837 Writer.writeLoc(Range.getBegin());
1838 Writer.writeRemove(Range);
1839 Writer.writeText(Text);
1840 }
1841
1842 void remove(CharSourceRange Range) override {
1843 EntryWriter Writer(SourceMgr, OS);
1844 Writer.writeLoc(Range.getBegin());
1845 Writer.writeRemove(Range);
1846 }
1847};
1848
1849} // end anonymous namespace
1850
1851void ObjCMigrateASTConsumer::HandleTranslationUnit(ASTContext &Ctx) {
1852
1853 TranslationUnitDecl *TU = Ctx.getTranslationUnitDecl();
1854 if (ASTMigrateActions & FrontendOptions::ObjCMT_MigrateDecls) {
1855 for (DeclContext::decl_iterator D = TU->decls_begin(), DEnd = TU->decls_end();
1856 D != DEnd; ++D) {
1857 FileID FID = PP.getSourceManager().getFileID((*D)->getLocation());
1858 if (FID.isValid())
1859 if (FileId.isValid() && FileId != FID) {
1860 if (ASTMigrateActions & FrontendOptions::ObjCMT_Annotation)
1861 AnnotateImplicitBridging(Ctx);
1862 }
1863
1864 if (ObjCInterfaceDecl *CDecl = dyn_cast<ObjCInterfaceDecl>(*D))
1865 if (canModify(CDecl))
1866 migrateObjCContainerDecl(Ctx, CDecl);
1867 if (ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(*D)) {
1868 if (canModify(CatDecl))
1869 migrateObjCContainerDecl(Ctx, CatDecl);
1870 }
1871 else if (ObjCProtocolDecl *PDecl = dyn_cast<ObjCProtocolDecl>(*D)) {
1872 ObjCProtocolDecls.insert(PDecl->getCanonicalDecl());
1873 if (canModify(PDecl))
1874 migrateObjCContainerDecl(Ctx, PDecl);
1875 }
1876 else if (const ObjCImplementationDecl *ImpDecl =
1877 dyn_cast<ObjCImplementationDecl>(*D)) {
1878 if ((ASTMigrateActions & FrontendOptions::ObjCMT_ProtocolConformance) &&
1879 canModify(ImpDecl))
1880 migrateProtocolConformance(Ctx, ImpDecl);
1881 }
1882 else if (const EnumDecl *ED = dyn_cast<EnumDecl>(*D)) {
1883 if (!(ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros))
1884 continue;
1885 if (!canModify(ED))
1886 continue;
1887 DeclContext::decl_iterator N = D;
1888 if (++N != DEnd) {
1889 const TypedefDecl *TD = dyn_cast<TypedefDecl>(*N);
1890 if (migrateNSEnumDecl(Ctx, ED, TD) && TD)
1891 D++;
1892 }
1893 else
1894 migrateNSEnumDecl(Ctx, ED, /*TypedefDecl */nullptr);
1895 }
1896 else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(*D)) {
1897 if (!(ASTMigrateActions & FrontendOptions::ObjCMT_NsMacros))
1898 continue;
1899 if (!canModify(TD))
1900 continue;
1901 DeclContext::decl_iterator N = D;
1902 if (++N == DEnd)
1903 continue;
1904 if (const EnumDecl *ED = dyn_cast<EnumDecl>(*N)) {
1905 if (canModify(ED)) {
1906 if (++N != DEnd)
1907 if (const TypedefDecl *TDF = dyn_cast<TypedefDecl>(*N)) {
1908 // prefer typedef-follows-enum to enum-follows-typedef pattern.
1909 if (migrateNSEnumDecl(Ctx, ED, TDF)) {
1910 ++D; ++D;
1911 CacheObjCNSIntegerTypedefed(TD);
1912 continue;
1913 }
1914 }
1915 if (migrateNSEnumDecl(Ctx, ED, TD)) {
1916 ++D;
1917 continue;
1918 }
1919 }
1920 }
1921 CacheObjCNSIntegerTypedefed(TD);
1922 }
1923 else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*D)) {
1924 if ((ASTMigrateActions & FrontendOptions::ObjCMT_Annotation) &&
1925 canModify(FD))
1926 migrateCFAnnotation(Ctx, FD);
1927 }
1928
1929 if (ObjCContainerDecl *CDecl = dyn_cast<ObjCContainerDecl>(*D)) {
1930 bool CanModify = canModify(CDecl);
1931 // migrate methods which can have instancetype as their result type.
1932 if ((ASTMigrateActions & FrontendOptions::ObjCMT_Instancetype) &&
1933 CanModify)
1934 migrateAllMethodInstaceType(Ctx, CDecl);
1935 // annotate methods with CF annotations.
1936 if ((ASTMigrateActions & FrontendOptions::ObjCMT_Annotation) &&
1937 CanModify)
1938 migrateARCSafeAnnotation(Ctx, CDecl);
1939 }
1940
1941 if (const ObjCImplementationDecl *
1942 ImplD = dyn_cast<ObjCImplementationDecl>(*D)) {
1943 if ((ASTMigrateActions & FrontendOptions::ObjCMT_DesignatedInitializer) &&
1944 canModify(ImplD))
1945 inferDesignatedInitializers(Ctx, ImplD);
1946 }
1947 }
1948 if (ASTMigrateActions & FrontendOptions::ObjCMT_Annotation)
1949 AnnotateImplicitBridging(Ctx);
1950 }
1951
1952 if (IsOutputFile) {
1953 std::error_code EC;
1954 llvm::raw_fd_ostream OS(MigrateDir, EC, llvm::sys::fs::OF_None);
1955 if (EC) {
1956 DiagnosticsEngine &Diags = Ctx.getDiagnostics();
1957 Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Error, "%0"))
1958 << EC.message();
1959 return;
1960 }
1961
1962 JSONEditWriter Writer(Ctx.getSourceManager(), OS);
1963 Editor->applyRewrites(Writer);
1964 return;
1965 }
1966
1967 Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOpts());
1968 RewritesReceiver Rec(rewriter);
1969 Editor->applyRewrites(Rec);
1970
1971 for (Rewriter::buffer_iterator
1972 I = rewriter.buffer_begin(), E = rewriter.buffer_end(); I != E; ++I) {
1973 FileID FID = I->first;
1974 RewriteBuffer &buf = I->second;
1975 const FileEntry *file = Ctx.getSourceManager().getFileEntryForID(FID);
1976 assert(file)((file) ? static_cast<void> (0) : __assert_fail ("file"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 1976, __PRETTY_FUNCTION__))
;
1977 SmallString<512> newText;
1978 llvm::raw_svector_ostream vecOS(newText);
1979 buf.write(vecOS);
1980 std::unique_ptr<llvm::MemoryBuffer> memBuf(
1981 llvm::MemoryBuffer::getMemBufferCopy(
1982 StringRef(newText.data(), newText.size()), file->getName()));
1983 SmallString<64> filePath(file->getName());
1984 FileMgr.FixupRelativePath(filePath);
1985 Remapper.remap(filePath.str(), std::move(memBuf));
1986 }
1987
1988 if (IsOutputFile) {
1989 Remapper.flushToFile(MigrateDir, Ctx.getDiagnostics());
1990 } else {
1991 Remapper.flushToDisk(MigrateDir, Ctx.getDiagnostics());
1992 }
1993}
1994
1995bool MigrateSourceAction::BeginInvocation(CompilerInstance &CI) {
1996 CI.getDiagnostics().setIgnoreAllWarnings(true);
1997 return true;
1998}
1999
2000static std::vector<std::string> getWhiteListFilenames(StringRef DirPath) {
2001 using namespace llvm::sys::fs;
2002 using namespace llvm::sys::path;
2003
2004 std::vector<std::string> Filenames;
2005 if (DirPath.empty() || !is_directory(DirPath))
2006 return Filenames;
2007
2008 std::error_code EC;
2009 directory_iterator DI = directory_iterator(DirPath, EC);
2010 directory_iterator DE;
2011 for (; !EC && DI != DE; DI = DI.increment(EC)) {
2012 if (is_regular_file(DI->path()))
2013 Filenames.push_back(filename(DI->path()));
2014 }
2015
2016 return Filenames;
2017}
2018
2019std::unique_ptr<ASTConsumer>
2020MigrateSourceAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
2021 PPConditionalDirectiveRecord *
2022 PPRec = new PPConditionalDirectiveRecord(CI.getSourceManager());
2023 unsigned ObjCMTAction = CI.getFrontendOpts().ObjCMTAction;
2024 unsigned ObjCMTOpts = ObjCMTAction;
2025 // These are companion flags, they do not enable transformations.
2026 ObjCMTOpts &= ~(FrontendOptions::ObjCMT_AtomicProperty |
2027 FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty);
2028 if (ObjCMTOpts == FrontendOptions::ObjCMT_None) {
2029 // If no specific option was given, enable literals+subscripting transforms
2030 // by default.
2031 ObjCMTAction |= FrontendOptions::ObjCMT_Literals |
2032 FrontendOptions::ObjCMT_Subscripting;
2033 }
2034 CI.getPreprocessor().addPPCallbacks(std::unique_ptr<PPCallbacks>(PPRec));
2035 std::vector<std::string> WhiteList =
2036 getWhiteListFilenames(CI.getFrontendOpts().ObjCMTWhiteListPath);
2037 return std::make_unique<ObjCMigrateASTConsumer>(
2038 CI.getFrontendOpts().OutputFile, ObjCMTAction, Remapper,
2039 CI.getFileManager(), PPRec, CI.getPreprocessor(),
2040 /*isOutputFile=*/true, WhiteList);
2041}
2042
2043namespace {
2044struct EditEntry {
2045 const FileEntry *File;
2046 unsigned Offset;
2047 unsigned RemoveLen;
2048 std::string Text;
2049
2050 EditEntry() : File(), Offset(), RemoveLen() {}
2051};
2052} // end anonymous namespace
2053
2054namespace llvm {
2055template<> struct DenseMapInfo<EditEntry> {
2056 static inline EditEntry getEmptyKey() {
2057 EditEntry Entry;
2058 Entry.Offset = unsigned(-1);
2059 return Entry;
2060 }
2061 static inline EditEntry getTombstoneKey() {
2062 EditEntry Entry;
2063 Entry.Offset = unsigned(-2);
2064 return Entry;
2065 }
2066 static unsigned getHashValue(const EditEntry& Val) {
2067 llvm::FoldingSetNodeID ID;
2068 ID.AddPointer(Val.File);
2069 ID.AddInteger(Val.Offset);
2070 ID.AddInteger(Val.RemoveLen);
2071 ID.AddString(Val.Text);
2072 return ID.ComputeHash();
2073 }
2074 static bool isEqual(const EditEntry &LHS, const EditEntry &RHS) {
2075 return LHS.File == RHS.File &&
2076 LHS.Offset == RHS.Offset &&
2077 LHS.RemoveLen == RHS.RemoveLen &&
2078 LHS.Text == RHS.Text;
2079 }
2080};
2081} // end namespace llvm
2082
2083namespace {
2084class RemapFileParser {
2085 FileManager &FileMgr;
2086
2087public:
2088 RemapFileParser(FileManager &FileMgr) : FileMgr(FileMgr) { }
2089
2090 bool parse(StringRef File, SmallVectorImpl<EditEntry> &Entries) {
2091 using namespace llvm::yaml;
2092
2093 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =
2094 llvm::MemoryBuffer::getFile(File);
2095 if (!FileBufOrErr)
2096 return true;
2097
2098 llvm::SourceMgr SM;
2099 Stream YAMLStream(FileBufOrErr.get()->getMemBufferRef(), SM);
2100 document_iterator I = YAMLStream.begin();
2101 if (I == YAMLStream.end())
2102 return true;
2103 Node *Root = I->getRoot();
2104 if (!Root)
2105 return true;
2106
2107 SequenceNode *SeqNode = dyn_cast<SequenceNode>(Root);
2108 if (!SeqNode)
2109 return true;
2110
2111 for (SequenceNode::iterator
2112 AI = SeqNode->begin(), AE = SeqNode->end(); AI != AE; ++AI) {
2113 MappingNode *MapNode = dyn_cast<MappingNode>(&*AI);
2114 if (!MapNode)
2115 continue;
2116 parseEdit(MapNode, Entries);
2117 }
2118
2119 return false;
2120 }
2121
2122private:
2123 void parseEdit(llvm::yaml::MappingNode *Node,
2124 SmallVectorImpl<EditEntry> &Entries) {
2125 using namespace llvm::yaml;
2126 EditEntry Entry;
2127 bool Ignore = false;
2128
2129 for (MappingNode::iterator
2130 KVI = Node->begin(), KVE = Node->end(); KVI != KVE; ++KVI) {
2131 ScalarNode *KeyString = dyn_cast<ScalarNode>((*KVI).getKey());
2132 if (!KeyString)
2133 continue;
2134 SmallString<10> KeyStorage;
2135 StringRef Key = KeyString->getValue(KeyStorage);
2136
2137 ScalarNode *ValueString = dyn_cast<ScalarNode>((*KVI).getValue());
2138 if (!ValueString)
2139 continue;
2140 SmallString<64> ValueStorage;
2141 StringRef Val = ValueString->getValue(ValueStorage);
2142
2143 if (Key == "file") {
2144 auto FE = FileMgr.getFile(Val);
2145 if (FE)
2146 Entry.File = *FE;
2147 else
2148 Ignore = true;
2149 } else if (Key == "offset") {
2150 if (Val.getAsInteger(10, Entry.Offset))
2151 Ignore = true;
2152 } else if (Key == "remove") {
2153 if (Val.getAsInteger(10, Entry.RemoveLen))
2154 Ignore = true;
2155 } else if (Key == "text") {
2156 Entry.Text = Val;
2157 }
2158 }
2159
2160 if (!Ignore)
2161 Entries.push_back(Entry);
2162 }
2163};
2164} // end anonymous namespace
2165
2166static bool reportDiag(const Twine &Err, DiagnosticsEngine &Diag) {
2167 Diag.Report(Diag.getCustomDiagID(DiagnosticsEngine::Error, "%0"))
2168 << Err.str();
2169 return true;
2170}
2171
2172static std::string applyEditsToTemp(const FileEntry *FE,
2173 ArrayRef<EditEntry> Edits,
2174 FileManager &FileMgr,
2175 DiagnosticsEngine &Diag) {
2176 using namespace llvm::sys;
2177
2178 SourceManager SM(Diag, FileMgr);
2179 FileID FID = SM.createFileID(FE, SourceLocation(), SrcMgr::C_User);
2180 LangOptions LangOpts;
2181 edit::EditedSource Editor(SM, LangOpts);
2182 for (ArrayRef<EditEntry>::iterator
2183 I = Edits.begin(), E = Edits.end(); I != E; ++I) {
2184 const EditEntry &Entry = *I;
2185 assert(Entry.File == FE)((Entry.File == FE) ? static_cast<void> (0) : __assert_fail
("Entry.File == FE", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/lib/ARCMigrate/ObjCMT.cpp"
, 2185, __PRETTY_FUNCTION__))
;
2186 SourceLocation Loc =
2187 SM.getLocForStartOfFile(FID).getLocWithOffset(Entry.Offset);
2188 CharSourceRange Range;
2189 if (Entry.RemoveLen != 0) {
2190 Range = CharSourceRange::getCharRange(Loc,
2191 Loc.getLocWithOffset(Entry.RemoveLen));
2192 }
2193
2194 edit::Commit commit(Editor);
2195 if (Range.isInvalid()) {
2196 commit.insert(Loc, Entry.Text);
2197 } else if (Entry.Text.empty()) {
2198 commit.remove(Range);
2199 } else {
2200 commit.replace(Range, Entry.Text);
2201 }
2202 Editor.commit(commit);
2203 }
2204
2205 Rewriter rewriter(SM, LangOpts);
2206 RewritesReceiver Rec(rewriter);
2207 Editor.applyRewrites(Rec, /*adjustRemovals=*/false);
2208
2209 const RewriteBuffer *Buf = rewriter.getRewriteBufferFor(FID);
2210 SmallString<512> NewText;
2211 llvm::raw_svector_ostream OS(NewText);
2212 Buf->write(OS);
2213
2214 SmallString<64> TempPath;
2215 int FD;
2216 if (fs::createTemporaryFile(path::filename(FE->getName()),
2217 path::extension(FE->getName()).drop_front(), FD,
2218 TempPath)) {
2219 reportDiag("Could not create file: " + TempPath.str(), Diag);
2220 return std::string();
2221 }
2222
2223 llvm::raw_fd_ostream TmpOut(FD, /*shouldClose=*/true);
2224 TmpOut.write(NewText.data(), NewText.size());
2225 TmpOut.close();
2226
2227 return TempPath.str();
2228}
2229
2230bool arcmt::getFileRemappingsFromFileList(
2231 std::vector<std::pair<std::string,std::string> > &remap,
2232 ArrayRef<StringRef> remapFiles,
2233 DiagnosticConsumer *DiagClient) {
2234 bool hasErrorOccurred = false;
2235
2236 FileSystemOptions FSOpts;
2237 FileManager FileMgr(FSOpts);
2238 RemapFileParser Parser(FileMgr);
2239
2240 IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
2241 IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
2242 new DiagnosticsEngine(DiagID, new DiagnosticOptions,
2243 DiagClient, /*ShouldOwnClient=*/false));
2244
2245 typedef llvm::DenseMap<const FileEntry *, std::vector<EditEntry> >
2246 FileEditEntriesTy;
2247 FileEditEntriesTy FileEditEntries;
2248
2249 llvm::DenseSet<EditEntry> EntriesSet;
2250
2251 for (ArrayRef<StringRef>::iterator
2252 I = remapFiles.begin(), E = remapFiles.end(); I != E; ++I) {
2253 SmallVector<EditEntry, 16> Entries;
2254 if (Parser.parse(*I, Entries))
2255 continue;
2256
2257 for (SmallVectorImpl<EditEntry>::iterator
2258 EI = Entries.begin(), EE = Entries.end(); EI != EE; ++EI) {
2259 EditEntry &Entry = *EI;
2260 if (!Entry.File)
2261 continue;
2262 std::pair<llvm::DenseSet<EditEntry>::iterator, bool>
2263 Insert = EntriesSet.insert(Entry);
2264 if (!Insert.second)
2265 continue;
2266
2267 FileEditEntries[Entry.File].push_back(Entry);
2268 }
2269 }
2270
2271 for (FileEditEntriesTy::iterator
2272 I = FileEditEntries.begin(), E = FileEditEntries.end(); I != E; ++I) {
2273 std::string TempFile = applyEditsToTemp(I->first, I->second,
2274 FileMgr, *Diags);
2275 if (TempFile.empty()) {
2276 hasErrorOccurred = true;
2277 continue;
2278 }
2279
2280 remap.emplace_back(I->first->getName(), TempFile);
2281 }
2282
2283 return hasErrorOccurred;
2284}

/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h

1//===- Type.h - C Language Family Type Representation -----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// C Language Family Type Representation
11///
12/// This file defines the clang::Type interface and subclasses, used to
13/// represent types for languages in the C family.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_CLANG_AST_TYPE_H
18#define LLVM_CLANG_AST_TYPE_H
19
20#include "clang/AST/NestedNameSpecifier.h"
21#include "clang/AST/TemplateName.h"
22#include "clang/Basic/AddressSpaces.h"
23#include "clang/Basic/AttrKinds.h"
24#include "clang/Basic/Diagnostic.h"
25#include "clang/Basic/ExceptionSpecificationType.h"
26#include "clang/Basic/LLVM.h"
27#include "clang/Basic/Linkage.h"
28#include "clang/Basic/PartialDiagnostic.h"
29#include "clang/Basic/SourceLocation.h"
30#include "clang/Basic/Specifiers.h"
31#include "clang/Basic/Visibility.h"
32#include "llvm/ADT/APInt.h"
33#include "llvm/ADT/APSInt.h"
34#include "llvm/ADT/ArrayRef.h"
35#include "llvm/ADT/FoldingSet.h"
36#include "llvm/ADT/None.h"
37#include "llvm/ADT/Optional.h"
38#include "llvm/ADT/PointerIntPair.h"
39#include "llvm/ADT/PointerUnion.h"
40#include "llvm/ADT/StringRef.h"
41#include "llvm/ADT/Twine.h"
42#include "llvm/ADT/iterator_range.h"
43#include "llvm/Support/Casting.h"
44#include "llvm/Support/Compiler.h"
45#include "llvm/Support/ErrorHandling.h"
46#include "llvm/Support/PointerLikeTypeTraits.h"
47#include "llvm/Support/type_traits.h"
48#include "llvm/Support/TrailingObjects.h"
49#include <cassert>
50#include <cstddef>
51#include <cstdint>
52#include <cstring>
53#include <string>
54#include <type_traits>
55#include <utility>
56
57namespace clang {
58
59class ExtQuals;
60class QualType;
61class TagDecl;
62class Type;
63
64enum {
65 TypeAlignmentInBits = 4,
66 TypeAlignment = 1 << TypeAlignmentInBits
67};
68
69} // namespace clang
70
71namespace llvm {
72
73 template <typename T>
74 struct PointerLikeTypeTraits;
75 template<>
76 struct PointerLikeTypeTraits< ::clang::Type*> {
77 static inline void *getAsVoidPointer(::clang::Type *P) { return P; }
78
79 static inline ::clang::Type *getFromVoidPointer(void *P) {
80 return static_cast< ::clang::Type*>(P);
81 }
82
83 enum { NumLowBitsAvailable = clang::TypeAlignmentInBits };
84 };
85
86 template<>
87 struct PointerLikeTypeTraits< ::clang::ExtQuals*> {
88 static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; }
89
90 static inline ::clang::ExtQuals *getFromVoidPointer(void *P) {
91 return static_cast< ::clang::ExtQuals*>(P);
92 }
93
94 enum { NumLowBitsAvailable = clang::TypeAlignmentInBits };
95 };
96
97} // namespace llvm
98
99namespace clang {
100
101class ASTContext;
102template <typename> class CanQual;
103class CXXRecordDecl;
104class DeclContext;
105class EnumDecl;
106class Expr;
107class ExtQualsTypeCommonBase;
108class FunctionDecl;
109class IdentifierInfo;
110class NamedDecl;
111class ObjCInterfaceDecl;
112class ObjCProtocolDecl;
113class ObjCTypeParamDecl;
114struct PrintingPolicy;
115class RecordDecl;
116class Stmt;
117class TagDecl;
118class TemplateArgument;
119class TemplateArgumentListInfo;
120class TemplateArgumentLoc;
121class TemplateTypeParmDecl;
122class TypedefNameDecl;
123class UnresolvedUsingTypenameDecl;
124
125using CanQualType = CanQual<Type>;
126
127// Provide forward declarations for all of the *Type classes.
128#define TYPE(Class, Base) class Class##Type;
129#include "clang/AST/TypeNodes.inc"
130
131/// The collection of all-type qualifiers we support.
132/// Clang supports five independent qualifiers:
133/// * C99: const, volatile, and restrict
134/// * MS: __unaligned
135/// * Embedded C (TR18037): address spaces
136/// * Objective C: the GC attributes (none, weak, or strong)
137class Qualifiers {
138public:
139 enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ.
140 Const = 0x1,
141 Restrict = 0x2,
142 Volatile = 0x4,
143 CVRMask = Const | Volatile | Restrict
144 };
145
146 enum GC {
147 GCNone = 0,
148 Weak,
149 Strong
150 };
151
152 enum ObjCLifetime {
153 /// There is no lifetime qualification on this type.
154 OCL_None,
155
156 /// This object can be modified without requiring retains or
157 /// releases.
158 OCL_ExplicitNone,
159
160 /// Assigning into this object requires the old value to be
161 /// released and the new value to be retained. The timing of the
162 /// release of the old value is inexact: it may be moved to
163 /// immediately after the last known point where the value is
164 /// live.
165 OCL_Strong,
166
167 /// Reading or writing from this object requires a barrier call.
168 OCL_Weak,
169
170 /// Assigning into this object requires a lifetime extension.
171 OCL_Autoreleasing
172 };
173
174 enum {
175 /// The maximum supported address space number.
176 /// 23 bits should be enough for anyone.
177 MaxAddressSpace = 0x7fffffu,
178
179 /// The width of the "fast" qualifier mask.
180 FastWidth = 3,
181
182 /// The fast qualifier mask.
183 FastMask = (1 << FastWidth) - 1
184 };
185
186 /// Returns the common set of qualifiers while removing them from
187 /// the given sets.
188 static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) {
189 // If both are only CVR-qualified, bit operations are sufficient.
190 if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) {
191 Qualifiers Q;
192 Q.Mask = L.Mask & R.Mask;
193 L.Mask &= ~Q.Mask;
194 R.Mask &= ~Q.Mask;
195 return Q;
196 }
197
198 Qualifiers Q;
199 unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers();
200 Q.addCVRQualifiers(CommonCRV);
201 L.removeCVRQualifiers(CommonCRV);
202 R.removeCVRQualifiers(CommonCRV);
203
204 if (L.getObjCGCAttr() == R.getObjCGCAttr()) {
205 Q.setObjCGCAttr(L.getObjCGCAttr());
206 L.removeObjCGCAttr();
207 R.removeObjCGCAttr();
208 }
209
210 if (L.getObjCLifetime() == R.getObjCLifetime()) {
211 Q.setObjCLifetime(L.getObjCLifetime());
212 L.removeObjCLifetime();
213 R.removeObjCLifetime();
214 }
215
216 if (L.getAddressSpace() == R.getAddressSpace()) {
217 Q.setAddressSpace(L.getAddressSpace());
218 L.removeAddressSpace();
219 R.removeAddressSpace();
220 }
221 return Q;
222 }
223
224 static Qualifiers fromFastMask(unsigned Mask) {
225 Qualifiers Qs;
226 Qs.addFastQualifiers(Mask);
227 return Qs;
228 }
229
230 static Qualifiers fromCVRMask(unsigned CVR) {
231 Qualifiers Qs;
232 Qs.addCVRQualifiers(CVR);
233 return Qs;
234 }
235
236 static Qualifiers fromCVRUMask(unsigned CVRU) {
237 Qualifiers Qs;
238 Qs.addCVRUQualifiers(CVRU);
239 return Qs;
240 }
241
242 // Deserialize qualifiers from an opaque representation.
243 static Qualifiers fromOpaqueValue(unsigned opaque) {
244 Qualifiers Qs;
245 Qs.Mask = opaque;
246 return Qs;
247 }
248
249 // Serialize these qualifiers into an opaque representation.
250 unsigned getAsOpaqueValue() const {
251 return Mask;
252 }
253
254 bool hasConst() const { return Mask & Const; }
255 bool hasOnlyConst() const { return Mask == Const; }
256 void removeConst() { Mask &= ~Const; }
257 void addConst() { Mask |= Const; }
258
259 bool hasVolatile() const { return Mask & Volatile; }
260 bool hasOnlyVolatile() const { return Mask == Volatile; }
261 void removeVolatile() { Mask &= ~Volatile; }
262 void addVolatile() { Mask |= Volatile; }
263
264 bool hasRestrict() const { return Mask & Restrict; }
265 bool hasOnlyRestrict() const { return Mask == Restrict; }
266 void removeRestrict() { Mask &= ~Restrict; }
267 void addRestrict() { Mask |= Restrict; }
268
269 bool hasCVRQualifiers() const { return getCVRQualifiers(); }
270 unsigned getCVRQualifiers() const { return Mask & CVRMask; }
271 unsigned getCVRUQualifiers() const { return Mask & (CVRMask | UMask); }
272
273 void setCVRQualifiers(unsigned mask) {
274 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 274, __PRETTY_FUNCTION__))
;
275 Mask = (Mask & ~CVRMask) | mask;
276 }
277 void removeCVRQualifiers(unsigned mask) {
278 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 278, __PRETTY_FUNCTION__))
;
279 Mask &= ~mask;
280 }
281 void removeCVRQualifiers() {
282 removeCVRQualifiers(CVRMask);
283 }
284 void addCVRQualifiers(unsigned mask) {
285 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 285, __PRETTY_FUNCTION__))
;
286 Mask |= mask;
287 }
288 void addCVRUQualifiers(unsigned mask) {
289 assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits")((!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask & ~UMask) && \"bitmask contains non-CVRU bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 289, __PRETTY_FUNCTION__))
;
290 Mask |= mask;
291 }
292
293 bool hasUnaligned() const { return Mask & UMask; }
294 void setUnaligned(bool flag) {
295 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
296 }
297 void removeUnaligned() { Mask &= ~UMask; }
298 void addUnaligned() { Mask |= UMask; }
299
300 bool hasObjCGCAttr() const { return Mask & GCAttrMask; }
301 GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); }
302 void setObjCGCAttr(GC type) {
303 Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift);
304 }
305 void removeObjCGCAttr() { setObjCGCAttr(GCNone); }
306 void addObjCGCAttr(GC type) {
307 assert(type)((type) ? static_cast<void> (0) : __assert_fail ("type"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 307, __PRETTY_FUNCTION__))
;
308 setObjCGCAttr(type);
309 }
310 Qualifiers withoutObjCGCAttr() const {
311 Qualifiers qs = *this;
312 qs.removeObjCGCAttr();
313 return qs;
314 }
315 Qualifiers withoutObjCLifetime() const {
316 Qualifiers qs = *this;
317 qs.removeObjCLifetime();
318 return qs;
319 }
320 Qualifiers withoutAddressSpace() const {
321 Qualifiers qs = *this;
322 qs.removeAddressSpace();
323 return qs;
324 }
325
326 bool hasObjCLifetime() const { return Mask & LifetimeMask; }
327 ObjCLifetime getObjCLifetime() const {
328 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
329 }
330 void setObjCLifetime(ObjCLifetime type) {
331 Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift);
332 }
333 void removeObjCLifetime() { setObjCLifetime(OCL_None); }
334 void addObjCLifetime(ObjCLifetime type) {
335 assert(type)((type) ? static_cast<void> (0) : __assert_fail ("type"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 335, __PRETTY_FUNCTION__))
;
336 assert(!hasObjCLifetime())((!hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail
("!hasObjCLifetime()", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 336, __PRETTY_FUNCTION__))
;
337 Mask |= (type << LifetimeShift);
338 }
339
340 /// True if the lifetime is neither None or ExplicitNone.
341 bool hasNonTrivialObjCLifetime() const {
342 ObjCLifetime lifetime = getObjCLifetime();
343 return (lifetime > OCL_ExplicitNone);
344 }
345
346 /// True if the lifetime is either strong or weak.
347 bool hasStrongOrWeakObjCLifetime() const {
348 ObjCLifetime lifetime = getObjCLifetime();
349 return (lifetime == OCL_Strong || lifetime == OCL_Weak);
350 }
351
352 bool hasAddressSpace() const { return Mask & AddressSpaceMask; }
353 LangAS getAddressSpace() const {
354 return static_cast<LangAS>(Mask >> AddressSpaceShift);
355 }
356 bool hasTargetSpecificAddressSpace() const {
357 return isTargetAddressSpace(getAddressSpace());
358 }
359 /// Get the address space attribute value to be printed by diagnostics.
360 unsigned getAddressSpaceAttributePrintValue() const {
361 auto Addr = getAddressSpace();
362 // This function is not supposed to be used with language specific
363 // address spaces. If that happens, the diagnostic message should consider
364 // printing the QualType instead of the address space value.
365 assert(Addr == LangAS::Default || hasTargetSpecificAddressSpace())((Addr == LangAS::Default || hasTargetSpecificAddressSpace())
? static_cast<void> (0) : __assert_fail ("Addr == LangAS::Default || hasTargetSpecificAddressSpace()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 365, __PRETTY_FUNCTION__))
;
366 if (Addr != LangAS::Default)
367 return toTargetAddressSpace(Addr);
368 // TODO: The diagnostic messages where Addr may be 0 should be fixed
369 // since it cannot differentiate the situation where 0 denotes the default
370 // address space or user specified __attribute__((address_space(0))).
371 return 0;
372 }
373 void setAddressSpace(LangAS space) {
374 assert((unsigned)space <= MaxAddressSpace)(((unsigned)space <= MaxAddressSpace) ? static_cast<void
> (0) : __assert_fail ("(unsigned)space <= MaxAddressSpace"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 374, __PRETTY_FUNCTION__))
;
375 Mask = (Mask & ~AddressSpaceMask)
376 | (((uint32_t) space) << AddressSpaceShift);
377 }
378 void removeAddressSpace() { setAddressSpace(LangAS::Default); }
379 void addAddressSpace(LangAS space) {
380 assert(space != LangAS::Default)((space != LangAS::Default) ? static_cast<void> (0) : __assert_fail
("space != LangAS::Default", "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 380, __PRETTY_FUNCTION__))
;
381 setAddressSpace(space);
382 }
383
384 // Fast qualifiers are those that can be allocated directly
385 // on a QualType object.
386 bool hasFastQualifiers() const { return getFastQualifiers(); }
387 unsigned getFastQualifiers() const { return Mask & FastMask; }
388 void setFastQualifiers(unsigned mask) {
389 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 389, __PRETTY_FUNCTION__))
;
390 Mask = (Mask & ~FastMask) | mask;
391 }
392 void removeFastQualifiers(unsigned mask) {
393 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 393, __PRETTY_FUNCTION__))
;
394 Mask &= ~mask;
395 }
396 void removeFastQualifiers() {
397 removeFastQualifiers(FastMask);
398 }
399 void addFastQualifiers(unsigned mask) {
400 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 400, __PRETTY_FUNCTION__))
;
401 Mask |= mask;
402 }
403
404 /// Return true if the set contains any qualifiers which require an ExtQuals
405 /// node to be allocated.
406 bool hasNonFastQualifiers() const { return Mask & ~FastMask; }
407 Qualifiers getNonFastQualifiers() const {
408 Qualifiers Quals = *this;
409 Quals.setFastQualifiers(0);
410 return Quals;
411 }
412
413 /// Return true if the set contains any qualifiers.
414 bool hasQualifiers() const { return Mask; }
415 bool empty() const { return !Mask; }
416
417 /// Add the qualifiers from the given set to this set.
418 void addQualifiers(Qualifiers Q) {
419 // If the other set doesn't have any non-boolean qualifiers, just
420 // bit-or it in.
421 if (!(Q.Mask & ~CVRMask))
422 Mask |= Q.Mask;
423 else {
424 Mask |= (Q.Mask & CVRMask);
425 if (Q.hasAddressSpace())
426 addAddressSpace(Q.getAddressSpace());
427 if (Q.hasObjCGCAttr())
428 addObjCGCAttr(Q.getObjCGCAttr());
429 if (Q.hasObjCLifetime())
430 addObjCLifetime(Q.getObjCLifetime());
431 }
432 }
433
434 /// Remove the qualifiers from the given set from this set.
435 void removeQualifiers(Qualifiers Q) {
436 // If the other set doesn't have any non-boolean qualifiers, just
437 // bit-and the inverse in.
438 if (!(Q.Mask & ~CVRMask))
439 Mask &= ~Q.Mask;
440 else {
441 Mask &= ~(Q.Mask & CVRMask);
442 if (getObjCGCAttr() == Q.getObjCGCAttr())
443 removeObjCGCAttr();
444 if (getObjCLifetime() == Q.getObjCLifetime())
445 removeObjCLifetime();
446 if (getAddressSpace() == Q.getAddressSpace())
447 removeAddressSpace();
448 }
449 }
450
451 /// Add the qualifiers from the given set to this set, given that
452 /// they don't conflict.
453 void addConsistentQualifiers(Qualifiers qs) {
454 assert(getAddressSpace() == qs.getAddressSpace() ||((getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace
() || !qs.hasAddressSpace()) ? static_cast<void> (0) : __assert_fail
("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 455, __PRETTY_FUNCTION__))
455 !hasAddressSpace() || !qs.hasAddressSpace())((getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace
() || !qs.hasAddressSpace()) ? static_cast<void> (0) : __assert_fail
("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 455, __PRETTY_FUNCTION__))
;
456 assert(getObjCGCAttr() == qs.getObjCGCAttr() ||((getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() ||
!qs.hasObjCGCAttr()) ? static_cast<void> (0) : __assert_fail
("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 457, __PRETTY_FUNCTION__))
457 !hasObjCGCAttr() || !qs.hasObjCGCAttr())((getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() ||
!qs.hasObjCGCAttr()) ? static_cast<void> (0) : __assert_fail
("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 457, __PRETTY_FUNCTION__))
;
458 assert(getObjCLifetime() == qs.getObjCLifetime() ||((getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime
() || !qs.hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail
("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 459, __PRETTY_FUNCTION__))
459 !hasObjCLifetime() || !qs.hasObjCLifetime())((getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime
() || !qs.hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail
("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 459, __PRETTY_FUNCTION__))
;
460 Mask |= qs.Mask;
461 }
462
463 /// Returns true if address space A is equal to or a superset of B.
464 /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of
465 /// overlapping address spaces.
466 /// CL1.1 or CL1.2:
467 /// every address space is a superset of itself.
468 /// CL2.0 adds:
469 /// __generic is a superset of any address space except for __constant.
470 static bool isAddressSpaceSupersetOf(LangAS A, LangAS B) {
471 // Address spaces must match exactly.
472 return A == B ||
473 // Otherwise in OpenCLC v2.0 s6.5.5: every address space except
474 // for __constant can be used as __generic.
475 (A == LangAS::opencl_generic && B != LangAS::opencl_constant);
476 }
477
478 /// Returns true if the address space in these qualifiers is equal to or
479 /// a superset of the address space in the argument qualifiers.
480 bool isAddressSpaceSupersetOf(Qualifiers other) const {
481 return isAddressSpaceSupersetOf(getAddressSpace(), other.getAddressSpace());
482 }
483
484 /// Determines if these qualifiers compatibly include another set.
485 /// Generally this answers the question of whether an object with the other
486 /// qualifiers can be safely used as an object with these qualifiers.
487 bool compatiblyIncludes(Qualifiers other) const {
488 return isAddressSpaceSupersetOf(other) &&
489 // ObjC GC qualifiers can match, be added, or be removed, but can't
490 // be changed.
491 (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() ||
492 !other.hasObjCGCAttr()) &&
493 // ObjC lifetime qualifiers must match exactly.
494 getObjCLifetime() == other.getObjCLifetime() &&
495 // CVR qualifiers may subset.
496 (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) &&
497 // U qualifier may superset.
498 (!other.hasUnaligned() || hasUnaligned());
499 }
500
501 /// Determines if these qualifiers compatibly include another set of
502 /// qualifiers from the narrow perspective of Objective-C ARC lifetime.
503 ///
504 /// One set of Objective-C lifetime qualifiers compatibly includes the other
505 /// if the lifetime qualifiers match, or if both are non-__weak and the
506 /// including set also contains the 'const' qualifier, or both are non-__weak
507 /// and one is None (which can only happen in non-ARC modes).
508 bool compatiblyIncludesObjCLifetime(Qualifiers other) const {
509 if (getObjCLifetime() == other.getObjCLifetime())
510 return true;
511
512 if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak)
513 return false;
514
515 if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None)
516 return true;
517
518 return hasConst();
519 }
520
521 /// Determine whether this set of qualifiers is a strict superset of
522 /// another set of qualifiers, not considering qualifier compatibility.
523 bool isStrictSupersetOf(Qualifiers Other) const;
524
525 bool operator==(Qualifiers Other) const { return Mask == Other.Mask; }
526 bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; }
527
528 explicit operator bool() const { return hasQualifiers(); }
529
530 Qualifiers &operator+=(Qualifiers R) {
531 addQualifiers(R);
532 return *this;
533 }
534
535 // Union two qualifier sets. If an enumerated qualifier appears
536 // in both sets, use the one from the right.
537 friend Qualifiers operator+(Qualifiers L, Qualifiers R) {
538 L += R;
539 return L;
540 }
541
542 Qualifiers &operator-=(Qualifiers R) {
543 removeQualifiers(R);
544 return *this;
545 }
546
547 /// Compute the difference between two qualifier sets.
548 friend Qualifiers operator-(Qualifiers L, Qualifiers R) {
549 L -= R;
550 return L;
551 }
552
553 std::string getAsString() const;
554 std::string getAsString(const PrintingPolicy &Policy) const;
555
556 bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const;
557 void print(raw_ostream &OS, const PrintingPolicy &Policy,
558 bool appendSpaceIfNonEmpty = false) const;
559
560 void Profile(llvm::FoldingSetNodeID &ID) const {
561 ID.AddInteger(Mask);
562 }
563
564private:
565 // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31|
566 // |C R V|U|GCAttr|Lifetime|AddressSpace|
567 uint32_t Mask = 0;
568
569 static const uint32_t UMask = 0x8;
570 static const uint32_t UShift = 3;
571 static const uint32_t GCAttrMask = 0x30;
572 static const uint32_t GCAttrShift = 4;
573 static const uint32_t LifetimeMask = 0x1C0;
574 static const uint32_t LifetimeShift = 6;
575 static const uint32_t AddressSpaceMask =
576 ~(CVRMask | UMask | GCAttrMask | LifetimeMask);
577 static const uint32_t AddressSpaceShift = 9;
578};
579
580/// A std::pair-like structure for storing a qualified type split
581/// into its local qualifiers and its locally-unqualified type.
582struct SplitQualType {
583 /// The locally-unqualified type.
584 const Type *Ty = nullptr;
585
586 /// The local qualifiers.
587 Qualifiers Quals;
588
589 SplitQualType() = default;
590 SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {}
591
592 SplitQualType getSingleStepDesugaredType() const; // end of this file
593
594 // Make std::tie work.
595 std::pair<const Type *,Qualifiers> asPair() const {
596 return std::pair<const Type *, Qualifiers>(Ty, Quals);
597 }
598
599 friend bool operator==(SplitQualType a, SplitQualType b) {
600 return a.Ty == b.Ty && a.Quals == b.Quals;
601 }
602 friend bool operator!=(SplitQualType a, SplitQualType b) {
603 return a.Ty != b.Ty || a.Quals != b.Quals;
604 }
605};
606
607/// The kind of type we are substituting Objective-C type arguments into.
608///
609/// The kind of substitution affects the replacement of type parameters when
610/// no concrete type information is provided, e.g., when dealing with an
611/// unspecialized type.
612enum class ObjCSubstitutionContext {
613 /// An ordinary type.
614 Ordinary,
615
616 /// The result type of a method or function.
617 Result,
618
619 /// The parameter type of a method or function.
620 Parameter,
621
622 /// The type of a property.
623 Property,
624
625 /// The superclass of a type.
626 Superclass,
627};
628
629/// A (possibly-)qualified type.
630///
631/// For efficiency, we don't store CV-qualified types as nodes on their
632/// own: instead each reference to a type stores the qualifiers. This
633/// greatly reduces the number of nodes we need to allocate for types (for
634/// example we only need one for 'int', 'const int', 'volatile int',
635/// 'const volatile int', etc).
636///
637/// As an added efficiency bonus, instead of making this a pair, we
638/// just store the two bits we care about in the low bits of the
639/// pointer. To handle the packing/unpacking, we make QualType be a
640/// simple wrapper class that acts like a smart pointer. A third bit
641/// indicates whether there are extended qualifiers present, in which
642/// case the pointer points to a special structure.
643class QualType {
644 friend class QualifierCollector;
645
646 // Thankfully, these are efficiently composable.
647 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
648 Qualifiers::FastWidth> Value;
649
650 const ExtQuals *getExtQualsUnsafe() const {
651 return Value.getPointer().get<const ExtQuals*>();
652 }
653
654 const Type *getTypePtrUnsafe() const {
655 return Value.getPointer().get<const Type*>();
656 }
657
658 const ExtQualsTypeCommonBase *getCommonPtr() const {
659 assert(!isNull() && "Cannot retrieve a NULL type pointer")((!isNull() && "Cannot retrieve a NULL type pointer")
? static_cast<void> (0) : __assert_fail ("!isNull() && \"Cannot retrieve a NULL type pointer\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 659, __PRETTY_FUNCTION__))
;
660 auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue());
661 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1);
662 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal);
663 }
664
665public:
666 QualType() = default;
667 QualType(const Type *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
668 QualType(const ExtQuals *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
669
670 unsigned getLocalFastQualifiers() const { return Value.getInt(); }
671 void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); }
672
673 /// Retrieves a pointer to the underlying (unqualified) type.
674 ///
675 /// This function requires that the type not be NULL. If the type might be
676 /// NULL, use the (slightly less efficient) \c getTypePtrOrNull().
677 const Type *getTypePtr() const;
678
679 const Type *getTypePtrOrNull() const;
680
681 /// Retrieves a pointer to the name of the base type.
682 const IdentifierInfo *getBaseTypeIdentifier() const;
683
684 /// Divides a QualType into its unqualified type and a set of local
685 /// qualifiers.
686 SplitQualType split() const;
687
688 void *getAsOpaquePtr() const { return Value.getOpaqueValue(); }
689
690 static QualType getFromOpaquePtr(const void *Ptr) {
691 QualType T;
692 T.Value.setFromOpaqueValue(const_cast<void*>(Ptr));
693 return T;
694 }
695
696 const Type &operator*() const {
697 return *getTypePtr();
698 }
699
700 const Type *operator->() const {
701 return getTypePtr();
702 }
703
704 bool isCanonical() const;
705 bool isCanonicalAsParam() const;
706
707 /// Return true if this QualType doesn't point to a type yet.
708 bool isNull() const {
709 return Value.getPointer().isNull();
710 }
711
712 /// Determine whether this particular QualType instance has the
713 /// "const" qualifier set, without looking through typedefs that may have
714 /// added "const" at a different level.
715 bool isLocalConstQualified() const {
716 return (getLocalFastQualifiers() & Qualifiers::Const);
717 }
718
719 /// Determine whether this type is const-qualified.
720 bool isConstQualified() const;
721
722 /// Determine whether this particular QualType instance has the
723 /// "restrict" qualifier set, without looking through typedefs that may have
724 /// added "restrict" at a different level.
725 bool isLocalRestrictQualified() const {
726 return (getLocalFastQualifiers() & Qualifiers::Restrict);
727 }
728
729 /// Determine whether this type is restrict-qualified.
730 bool isRestrictQualified() const;
731
732 /// Determine whether this particular QualType instance has the
733 /// "volatile" qualifier set, without looking through typedefs that may have
734 /// added "volatile" at a different level.
735 bool isLocalVolatileQualified() const {
736 return (getLocalFastQualifiers() & Qualifiers::Volatile);
737 }
738
739 /// Determine whether this type is volatile-qualified.
740 bool isVolatileQualified() const;
741
742 /// Determine whether this particular QualType instance has any
743 /// qualifiers, without looking through any typedefs that might add
744 /// qualifiers at a different level.
745 bool hasLocalQualifiers() const {
746 return getLocalFastQualifiers() || hasLocalNonFastQualifiers();
747 }
748
749 /// Determine whether this type has any qualifiers.
750 bool hasQualifiers() const;
751
752 /// Determine whether this particular QualType instance has any
753 /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType
754 /// instance.
755 bool hasLocalNonFastQualifiers() const {
756 return Value.getPointer().is<const ExtQuals*>();
757 }
758
759 /// Retrieve the set of qualifiers local to this particular QualType
760 /// instance, not including any qualifiers acquired through typedefs or
761 /// other sugar.
762 Qualifiers getLocalQualifiers() const;
763
764 /// Retrieve the set of qualifiers applied to this type.
765 Qualifiers getQualifiers() const;
766
767 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
768 /// local to this particular QualType instance, not including any qualifiers
769 /// acquired through typedefs or other sugar.
770 unsigned getLocalCVRQualifiers() const {
771 return getLocalFastQualifiers();
772 }
773
774 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
775 /// applied to this type.
776 unsigned getCVRQualifiers() const;
777
778 bool isConstant(const ASTContext& Ctx) const {
779 return QualType::isConstant(*this, Ctx);
780 }
781
782 /// Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
783 bool isPODType(const ASTContext &Context) const;
784
785 /// Return true if this is a POD type according to the rules of the C++98
786 /// standard, regardless of the current compilation's language.
787 bool isCXX98PODType(const ASTContext &Context) const;
788
789 /// Return true if this is a POD type according to the more relaxed rules
790 /// of the C++11 standard, regardless of the current compilation's language.
791 /// (C++0x [basic.types]p9). Note that, unlike
792 /// CXXRecordDecl::isCXX11StandardLayout, this takes DRs into account.
793 bool isCXX11PODType(const ASTContext &Context) const;
794
795 /// Return true if this is a trivial type per (C++0x [basic.types]p9)
796 bool isTrivialType(const ASTContext &Context) const;
797
798 /// Return true if this is a trivially copyable type (C++0x [basic.types]p9)
799 bool isTriviallyCopyableType(const ASTContext &Context) const;
800
801
802 /// Returns true if it is a class and it might be dynamic.
803 bool mayBeDynamicClass() const;
804
805 /// Returns true if it is not a class or if the class might not be dynamic.
806 bool mayBeNotDynamicClass() const;
807
808 // Don't promise in the API that anything besides 'const' can be
809 // easily added.
810
811 /// Add the `const` type qualifier to this QualType.
812 void addConst() {
813 addFastQualifiers(Qualifiers::Const);
814 }
815 QualType withConst() const {
816 return withFastQualifiers(Qualifiers::Const);
817 }
818
819 /// Add the `volatile` type qualifier to this QualType.
820 void addVolatile() {
821 addFastQualifiers(Qualifiers::Volatile);
822 }
823 QualType withVolatile() const {
824 return withFastQualifiers(Qualifiers::Volatile);
825 }
826
827 /// Add the `restrict` qualifier to this QualType.
828 void addRestrict() {
829 addFastQualifiers(Qualifiers::Restrict);
830 }
831 QualType withRestrict() const {
832 return withFastQualifiers(Qualifiers::Restrict);
833 }
834
835 QualType withCVRQualifiers(unsigned CVR) const {
836 return withFastQualifiers(CVR);
837 }
838
839 void addFastQualifiers(unsigned TQs) {
840 assert(!(TQs & ~Qualifiers::FastMask)((!(TQs & ~Qualifiers::FastMask) && "non-fast qualifier bits set in mask!"
) ? static_cast<void> (0) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 841, __PRETTY_FUNCTION__))
841 && "non-fast qualifier bits set in mask!")((!(TQs & ~Qualifiers::FastMask) && "non-fast qualifier bits set in mask!"
) ? static_cast<void> (0) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 841, __PRETTY_FUNCTION__))
;
842 Value.setInt(Value.getInt() | TQs);
843 }
844
845 void removeLocalConst();
846 void removeLocalVolatile();
847 void removeLocalRestrict();
848 void removeLocalCVRQualifiers(unsigned Mask);
849
850 void removeLocalFastQualifiers() { Value.setInt(0); }
851 void removeLocalFastQualifiers(unsigned Mask) {
852 assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers")((!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("!(Mask & ~Qualifiers::FastMask) && \"mask has non-fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 852, __PRETTY_FUNCTION__))
;
853 Value.setInt(Value.getInt() & ~Mask);
854 }
855
856 // Creates a type with the given qualifiers in addition to any
857 // qualifiers already on this type.
858 QualType withFastQualifiers(unsigned TQs) const {
859 QualType T = *this;
860 T.addFastQualifiers(TQs);
861 return T;
862 }
863
864 // Creates a type with exactly the given fast qualifiers, removing
865 // any existing fast qualifiers.
866 QualType withExactLocalFastQualifiers(unsigned TQs) const {
867 return withoutLocalFastQualifiers().withFastQualifiers(TQs);
868 }
869
870 // Removes fast qualifiers, but leaves any extended qualifiers in place.
871 QualType withoutLocalFastQualifiers() const {
872 QualType T = *this;
873 T.removeLocalFastQualifiers();
874 return T;
875 }
876
877 QualType getCanonicalType() const;
878
879 /// Return this type with all of the instance-specific qualifiers
880 /// removed, but without removing any qualifiers that may have been applied
881 /// through typedefs.
882 QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); }
883
884 /// Retrieve the unqualified variant of the given type,
885 /// removing as little sugar as possible.
886 ///
887 /// This routine looks through various kinds of sugar to find the
888 /// least-desugared type that is unqualified. For example, given:
889 ///
890 /// \code
891 /// typedef int Integer;
892 /// typedef const Integer CInteger;
893 /// typedef CInteger DifferenceType;
894 /// \endcode
895 ///
896 /// Executing \c getUnqualifiedType() on the type \c DifferenceType will
897 /// desugar until we hit the type \c Integer, which has no qualifiers on it.
898 ///
899 /// The resulting type might still be qualified if it's sugar for an array
900 /// type. To strip qualifiers even from within a sugared array type, use
901 /// ASTContext::getUnqualifiedArrayType.
902 inline QualType getUnqualifiedType() const;
903
904 /// Retrieve the unqualified variant of the given type, removing as little
905 /// sugar as possible.
906 ///
907 /// Like getUnqualifiedType(), but also returns the set of
908 /// qualifiers that were built up.
909 ///
910 /// The resulting type might still be qualified if it's sugar for an array
911 /// type. To strip qualifiers even from within a sugared array type, use
912 /// ASTContext::getUnqualifiedArrayType.
913 inline SplitQualType getSplitUnqualifiedType() const;
914
915 /// Determine whether this type is more qualified than the other
916 /// given type, requiring exact equality for non-CVR qualifiers.
917 bool isMoreQualifiedThan(QualType Other) const;
918
919 /// Determine whether this type is at least as qualified as the other
920 /// given type, requiring exact equality for non-CVR qualifiers.
921 bool isAtLeastAsQualifiedAs(QualType Other) const;
922
923 QualType getNonReferenceType() const;
924
925 /// Determine the type of a (typically non-lvalue) expression with the
926 /// specified result type.
927 ///
928 /// This routine should be used for expressions for which the return type is
929 /// explicitly specified (e.g., in a cast or call) and isn't necessarily
930 /// an lvalue. It removes a top-level reference (since there are no
931 /// expressions of reference type) and deletes top-level cvr-qualifiers
932 /// from non-class types (in C++) or all types (in C).
933 QualType getNonLValueExprType(const ASTContext &Context) const;
934
935 /// Return the specified type with any "sugar" removed from
936 /// the type. This takes off typedefs, typeof's etc. If the outer level of
937 /// the type is already concrete, it returns it unmodified. This is similar
938 /// to getting the canonical type, but it doesn't remove *all* typedefs. For
939 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
940 /// concrete.
941 ///
942 /// Qualifiers are left in place.
943 QualType getDesugaredType(const ASTContext &Context) const {
944 return getDesugaredType(*this, Context);
945 }
946
947 SplitQualType getSplitDesugaredType() const {
948 return getSplitDesugaredType(*this);
949 }
950
951 /// Return the specified type with one level of "sugar" removed from
952 /// the type.
953 ///
954 /// This routine takes off the first typedef, typeof, etc. If the outer level
955 /// of the type is already concrete, it returns it unmodified.
956 QualType getSingleStepDesugaredType(const ASTContext &Context) const {
957 return getSingleStepDesugaredTypeImpl(*this, Context);
958 }
959
960 /// Returns the specified type after dropping any
961 /// outer-level parentheses.
962 QualType IgnoreParens() const {
963 if (isa<ParenType>(*this))
964 return QualType::IgnoreParens(*this);
965 return *this;
966 }
967
968 /// Indicate whether the specified types and qualifiers are identical.
969 friend bool operator==(const QualType &LHS, const QualType &RHS) {
970 return LHS.Value == RHS.Value;
971 }
972 friend bool operator!=(const QualType &LHS, const QualType &RHS) {
973 return LHS.Value != RHS.Value;
974 }
975 friend bool operator<(const QualType &LHS, const QualType &RHS) {
976 return LHS.Value < RHS.Value;
977 }
978
979 static std::string getAsString(SplitQualType split,
980 const PrintingPolicy &Policy) {
981 return getAsString(split.Ty, split.Quals, Policy);
982 }
983 static std::string getAsString(const Type *ty, Qualifiers qs,
984 const PrintingPolicy &Policy);
985
986 std::string getAsString() const;
987 std::string getAsString(const PrintingPolicy &Policy) const;
988
989 void print(raw_ostream &OS, const PrintingPolicy &Policy,
990 const Twine &PlaceHolder = Twine(),
991 unsigned Indentation = 0) const;
992
993 static void print(SplitQualType split, raw_ostream &OS,
994 const PrintingPolicy &policy, const Twine &PlaceHolder,
995 unsigned Indentation = 0) {
996 return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation);
997 }
998
999 static void print(const Type *ty, Qualifiers qs,
1000 raw_ostream &OS, const PrintingPolicy &policy,
1001 const Twine &PlaceHolder,
1002 unsigned Indentation = 0);
1003
1004 void getAsStringInternal(std::string &Str,
1005 const PrintingPolicy &Policy) const;
1006
1007 static void getAsStringInternal(SplitQualType split, std::string &out,
1008 const PrintingPolicy &policy) {
1009 return getAsStringInternal(split.Ty, split.Quals, out, policy);
1010 }
1011
1012 static void getAsStringInternal(const Type *ty, Qualifiers qs,
1013 std::string &out,
1014 const PrintingPolicy &policy);
1015
1016 class StreamedQualTypeHelper {
1017 const QualType &T;
1018 const PrintingPolicy &Policy;
1019 const Twine &PlaceHolder;
1020 unsigned Indentation;
1021
1022 public:
1023 StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy,
1024 const Twine &PlaceHolder, unsigned Indentation)
1025 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1026 Indentation(Indentation) {}
1027
1028 friend raw_ostream &operator<<(raw_ostream &OS,
1029 const StreamedQualTypeHelper &SQT) {
1030 SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1031 return OS;
1032 }
1033 };
1034
1035 StreamedQualTypeHelper stream(const PrintingPolicy &Policy,
1036 const Twine &PlaceHolder = Twine(),
1037 unsigned Indentation = 0) const {
1038 return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation);
1039 }
1040
1041 void dump(const char *s) const;
1042 void dump() const;
1043 void dump(llvm::raw_ostream &OS) const;
1044
1045 void Profile(llvm::FoldingSetNodeID &ID) const {
1046 ID.AddPointer(getAsOpaquePtr());
1047 }
1048
1049 /// Return the address space of this type.
1050 inline LangAS getAddressSpace() const;
1051
1052 /// Returns gc attribute of this type.
1053 inline Qualifiers::GC getObjCGCAttr() const;
1054
1055 /// true when Type is objc's weak.
1056 bool isObjCGCWeak() const {
1057 return getObjCGCAttr() == Qualifiers::Weak;
1058 }
1059
1060 /// true when Type is objc's strong.
1061 bool isObjCGCStrong() const {
1062 return getObjCGCAttr() == Qualifiers::Strong;
1063 }
1064
1065 /// Returns lifetime attribute of this type.
1066 Qualifiers::ObjCLifetime getObjCLifetime() const {
1067 return getQualifiers().getObjCLifetime();
1068 }
1069
1070 bool hasNonTrivialObjCLifetime() const {
1071 return getQualifiers().hasNonTrivialObjCLifetime();
1072 }
1073
1074 bool hasStrongOrWeakObjCLifetime() const {
1075 return getQualifiers().hasStrongOrWeakObjCLifetime();
1076 }
1077
1078 // true when Type is objc's weak and weak is enabled but ARC isn't.
1079 bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const;
1080
1081 enum PrimitiveDefaultInitializeKind {
1082 /// The type does not fall into any of the following categories. Note that
1083 /// this case is zero-valued so that values of this enum can be used as a
1084 /// boolean condition for non-triviality.
1085 PDIK_Trivial,
1086
1087 /// The type is an Objective-C retainable pointer type that is qualified
1088 /// with the ARC __strong qualifier.
1089 PDIK_ARCStrong,
1090
1091 /// The type is an Objective-C retainable pointer type that is qualified
1092 /// with the ARC __weak qualifier.
1093 PDIK_ARCWeak,
1094
1095 /// The type is a struct containing a field whose type is not PCK_Trivial.
1096 PDIK_Struct
1097 };
1098
1099 /// Functions to query basic properties of non-trivial C struct types.
1100
1101 /// Check if this is a non-trivial type that would cause a C struct
1102 /// transitively containing this type to be non-trivial to default initialize
1103 /// and return the kind.
1104 PrimitiveDefaultInitializeKind
1105 isNonTrivialToPrimitiveDefaultInitialize() const;
1106
1107 enum PrimitiveCopyKind {
1108 /// The type does not fall into any of the following categories. Note that
1109 /// this case is zero-valued so that values of this enum can be used as a
1110 /// boolean condition for non-triviality.
1111 PCK_Trivial,
1112
1113 /// The type would be trivial except that it is volatile-qualified. Types
1114 /// that fall into one of the other non-trivial cases may additionally be
1115 /// volatile-qualified.
1116 PCK_VolatileTrivial,
1117
1118 /// The type is an Objective-C retainable pointer type that is qualified
1119 /// with the ARC __strong qualifier.
1120 PCK_ARCStrong,
1121
1122 /// The type is an Objective-C retainable pointer type that is qualified
1123 /// with the ARC __weak qualifier.
1124 PCK_ARCWeak,
1125
1126 /// The type is a struct containing a field whose type is neither
1127 /// PCK_Trivial nor PCK_VolatileTrivial.
1128 /// Note that a C++ struct type does not necessarily match this; C++ copying
1129 /// semantics are too complex to express here, in part because they depend
1130 /// on the exact constructor or assignment operator that is chosen by
1131 /// overload resolution to do the copy.
1132 PCK_Struct
1133 };
1134
1135 /// Check if this is a non-trivial type that would cause a C struct
1136 /// transitively containing this type to be non-trivial to copy and return the
1137 /// kind.
1138 PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const;
1139
1140 /// Check if this is a non-trivial type that would cause a C struct
1141 /// transitively containing this type to be non-trivial to destructively
1142 /// move and return the kind. Destructive move in this context is a C++-style
1143 /// move in which the source object is placed in a valid but unspecified state
1144 /// after it is moved, as opposed to a truly destructive move in which the
1145 /// source object is placed in an uninitialized state.
1146 PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const;
1147
1148 enum DestructionKind {
1149 DK_none,
1150 DK_cxx_destructor,
1151 DK_objc_strong_lifetime,
1152 DK_objc_weak_lifetime,
1153 DK_nontrivial_c_struct
1154 };
1155
1156 /// Returns a nonzero value if objects of this type require
1157 /// non-trivial work to clean up after. Non-zero because it's
1158 /// conceivable that qualifiers (objc_gc(weak)?) could make
1159 /// something require destruction.
1160 DestructionKind isDestructedType() const {
1161 return isDestructedTypeImpl(*this);
1162 }
1163
1164 /// Check if this is or contains a C union that is non-trivial to
1165 /// default-initialize, which is a union that has a member that is non-trivial
1166 /// to default-initialize. If this returns true,
1167 /// isNonTrivialToPrimitiveDefaultInitialize returns PDIK_Struct.
1168 bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const;
1169
1170 /// Check if this is or contains a C union that is non-trivial to destruct,
1171 /// which is a union that has a member that is non-trivial to destruct. If
1172 /// this returns true, isDestructedType returns DK_nontrivial_c_struct.
1173 bool hasNonTrivialToPrimitiveDestructCUnion() const;
1174
1175 /// Check if this is or contains a C union that is non-trivial to copy, which
1176 /// is a union that has a member that is non-trivial to copy. If this returns
1177 /// true, isNonTrivialToPrimitiveCopy returns PCK_Struct.
1178 bool hasNonTrivialToPrimitiveCopyCUnion() const;
1179
1180 /// Determine whether expressions of the given type are forbidden
1181 /// from being lvalues in C.
1182 ///
1183 /// The expression types that are forbidden to be lvalues are:
1184 /// - 'void', but not qualified void
1185 /// - function types
1186 ///
1187 /// The exact rule here is C99 6.3.2.1:
1188 /// An lvalue is an expression with an object type or an incomplete
1189 /// type other than void.
1190 bool isCForbiddenLValueType() const;
1191
1192 /// Substitute type arguments for the Objective-C type parameters used in the
1193 /// subject type.
1194 ///
1195 /// \param ctx ASTContext in which the type exists.
1196 ///
1197 /// \param typeArgs The type arguments that will be substituted for the
1198 /// Objective-C type parameters in the subject type, which are generally
1199 /// computed via \c Type::getObjCSubstitutions. If empty, the type
1200 /// parameters will be replaced with their bounds or id/Class, as appropriate
1201 /// for the context.
1202 ///
1203 /// \param context The context in which the subject type was written.
1204 ///
1205 /// \returns the resulting type.
1206 QualType substObjCTypeArgs(ASTContext &ctx,
1207 ArrayRef<QualType> typeArgs,
1208 ObjCSubstitutionContext context) const;
1209
1210 /// Substitute type arguments from an object type for the Objective-C type
1211 /// parameters used in the subject type.
1212 ///
1213 /// This operation combines the computation of type arguments for
1214 /// substitution (\c Type::getObjCSubstitutions) with the actual process of
1215 /// substitution (\c QualType::substObjCTypeArgs) for the convenience of
1216 /// callers that need to perform a single substitution in isolation.
1217 ///
1218 /// \param objectType The type of the object whose member type we're
1219 /// substituting into. For example, this might be the receiver of a message
1220 /// or the base of a property access.
1221 ///
1222 /// \param dc The declaration context from which the subject type was
1223 /// retrieved, which indicates (for example) which type parameters should
1224 /// be substituted.
1225 ///
1226 /// \param context The context in which the subject type was written.
1227 ///
1228 /// \returns the subject type after replacing all of the Objective-C type
1229 /// parameters with their corresponding arguments.
1230 QualType substObjCMemberType(QualType objectType,
1231 const DeclContext *dc,
1232 ObjCSubstitutionContext context) const;
1233
1234 /// Strip Objective-C "__kindof" types from the given type.
1235 QualType stripObjCKindOfType(const ASTContext &ctx) const;
1236
1237 /// Remove all qualifiers including _Atomic.
1238 QualType getAtomicUnqualifiedType() const;
1239
1240private:
1241 // These methods are implemented in a separate translation unit;
1242 // "static"-ize them to avoid creating temporary QualTypes in the
1243 // caller.
1244 static bool isConstant(QualType T, const ASTContext& Ctx);
1245 static QualType getDesugaredType(QualType T, const ASTContext &Context);
1246 static SplitQualType getSplitDesugaredType(QualType T);
1247 static SplitQualType getSplitUnqualifiedTypeImpl(QualType type);
1248 static QualType getSingleStepDesugaredTypeImpl(QualType type,
1249 const ASTContext &C);
1250 static QualType IgnoreParens(QualType T);
1251 static DestructionKind isDestructedTypeImpl(QualType type);
1252
1253 /// Check if \param RD is or contains a non-trivial C union.
1254 static bool hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD);
1255 static bool hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD);
1256 static bool hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD);
1257};
1258
1259} // namespace clang
1260
1261namespace llvm {
1262
1263/// Implement simplify_type for QualType, so that we can dyn_cast from QualType
1264/// to a specific Type class.
1265template<> struct simplify_type< ::clang::QualType> {
1266 using SimpleType = const ::clang::Type *;
1267
1268 static SimpleType getSimplifiedValue(::clang::QualType Val) {
1269 return Val.getTypePtr();
1270 }
1271};
1272
1273// Teach SmallPtrSet that QualType is "basically a pointer".
1274template<>
1275struct PointerLikeTypeTraits<clang::QualType> {
1276 static inline void *getAsVoidPointer(clang::QualType P) {
1277 return P.getAsOpaquePtr();
1278 }
1279
1280 static inline clang::QualType getFromVoidPointer(void *P) {
1281 return clang::QualType::getFromOpaquePtr(P);
1282 }
1283
1284 // Various qualifiers go in low bits.
1285 enum { NumLowBitsAvailable = 0 };
1286};
1287
1288} // namespace llvm
1289
1290namespace clang {
1291
1292/// Base class that is common to both the \c ExtQuals and \c Type
1293/// classes, which allows \c QualType to access the common fields between the
1294/// two.
1295class ExtQualsTypeCommonBase {
1296 friend class ExtQuals;
1297 friend class QualType;
1298 friend class Type;
1299
1300 /// The "base" type of an extended qualifiers type (\c ExtQuals) or
1301 /// a self-referential pointer (for \c Type).
1302 ///
1303 /// This pointer allows an efficient mapping from a QualType to its
1304 /// underlying type pointer.
1305 const Type *const BaseType;
1306
1307 /// The canonical type of this type. A QualType.
1308 QualType CanonicalType;
1309
1310 ExtQualsTypeCommonBase(const Type *baseType, QualType canon)
1311 : BaseType(baseType), CanonicalType(canon) {}
1312};
1313
1314/// We can encode up to four bits in the low bits of a
1315/// type pointer, but there are many more type qualifiers that we want
1316/// to be able to apply to an arbitrary type. Therefore we have this
1317/// struct, intended to be heap-allocated and used by QualType to
1318/// store qualifiers.
1319///
1320/// The current design tags the 'const', 'restrict', and 'volatile' qualifiers
1321/// in three low bits on the QualType pointer; a fourth bit records whether
1322/// the pointer is an ExtQuals node. The extended qualifiers (address spaces,
1323/// Objective-C GC attributes) are much more rare.
1324class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode {
1325 // NOTE: changing the fast qualifiers should be straightforward as
1326 // long as you don't make 'const' non-fast.
1327 // 1. Qualifiers:
1328 // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ).
1329 // Fast qualifiers must occupy the low-order bits.
1330 // b) Update Qualifiers::FastWidth and FastMask.
1331 // 2. QualType:
1332 // a) Update is{Volatile,Restrict}Qualified(), defined inline.
1333 // b) Update remove{Volatile,Restrict}, defined near the end of
1334 // this header.
1335 // 3. ASTContext:
1336 // a) Update get{Volatile,Restrict}Type.
1337
1338 /// The immutable set of qualifiers applied by this node. Always contains
1339 /// extended qualifiers.
1340 Qualifiers Quals;
1341
1342 ExtQuals *this_() { return this; }
1343
1344public:
1345 ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
1346 : ExtQualsTypeCommonBase(baseType,
1347 canon.isNull() ? QualType(this_(), 0) : canon),
1348 Quals(quals) {
1349 assert(Quals.hasNonFastQualifiers()((Quals.hasNonFastQualifiers() && "ExtQuals created with no fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1350, __PRETTY_FUNCTION__))
1350 && "ExtQuals created with no fast qualifiers")((Quals.hasNonFastQualifiers() && "ExtQuals created with no fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1350, __PRETTY_FUNCTION__))
;
1351 assert(!Quals.hasFastQualifiers()((!Quals.hasFastQualifiers() && "ExtQuals created with fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1352, __PRETTY_FUNCTION__))
1352 && "ExtQuals created with fast qualifiers")((!Quals.hasFastQualifiers() && "ExtQuals created with fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1352, __PRETTY_FUNCTION__))
;
1353 }
1354
1355 Qualifiers getQualifiers() const { return Quals; }
1356
1357 bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); }
1358 Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); }
1359
1360 bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); }
1361 Qualifiers::ObjCLifetime getObjCLifetime() const {
1362 return Quals.getObjCLifetime();
1363 }
1364
1365 bool hasAddressSpace() const { return Quals.hasAddressSpace(); }
1366 LangAS getAddressSpace() const { return Quals.getAddressSpace(); }
1367
1368 const Type *getBaseType() const { return BaseType; }
1369
1370public:
1371 void Profile(llvm::FoldingSetNodeID &ID) const {
1372 Profile(ID, getBaseType(), Quals);
1373 }
1374
1375 static void Profile(llvm::FoldingSetNodeID &ID,
1376 const Type *BaseType,
1377 Qualifiers Quals) {
1378 assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!")((!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!"
) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"fast qualifiers in ExtQuals hash!\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1378, __PRETTY_FUNCTION__))
;
1379 ID.AddPointer(BaseType);
1380 Quals.Profile(ID);
1381 }
1382};
1383
1384/// The kind of C++11 ref-qualifier associated with a function type.
1385/// This determines whether a member function's "this" object can be an
1386/// lvalue, rvalue, or neither.
1387enum RefQualifierKind {
1388 /// No ref-qualifier was provided.
1389 RQ_None = 0,
1390
1391 /// An lvalue ref-qualifier was provided (\c &).
1392 RQ_LValue,
1393
1394 /// An rvalue ref-qualifier was provided (\c &&).
1395 RQ_RValue
1396};
1397
1398/// Which keyword(s) were used to create an AutoType.
1399enum class AutoTypeKeyword {
1400 /// auto
1401 Auto,
1402
1403 /// decltype(auto)
1404 DecltypeAuto,
1405
1406 /// __auto_type (GNU extension)
1407 GNUAutoType
1408};
1409
1410/// The base class of the type hierarchy.
1411///
1412/// A central concept with types is that each type always has a canonical
1413/// type. A canonical type is the type with any typedef names stripped out
1414/// of it or the types it references. For example, consider:
1415///
1416/// typedef int foo;
1417/// typedef foo* bar;
1418/// 'int *' 'foo *' 'bar'
1419///
1420/// There will be a Type object created for 'int'. Since int is canonical, its
1421/// CanonicalType pointer points to itself. There is also a Type for 'foo' (a
1422/// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next
1423/// there is a PointerType that represents 'int*', which, like 'int', is
1424/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical
1425/// type is 'int*', and there is a TypedefType for 'bar', whose canonical type
1426/// is also 'int*'.
1427///
1428/// Non-canonical types are useful for emitting diagnostics, without losing
1429/// information about typedefs being used. Canonical types are useful for type
1430/// comparisons (they allow by-pointer equality tests) and useful for reasoning
1431/// about whether something has a particular form (e.g. is a function type),
1432/// because they implicitly, recursively, strip all typedefs out of a type.
1433///
1434/// Types, once created, are immutable.
1435///
1436class alignas(8) Type : public ExtQualsTypeCommonBase {
1437public:
1438 enum TypeClass {
1439#define TYPE(Class, Base) Class,
1440#define LAST_TYPE(Class) TypeLast = Class
1441#define ABSTRACT_TYPE(Class, Base)
1442#include "clang/AST/TypeNodes.inc"
1443 };
1444
1445private:
1446 /// Bitfields required by the Type class.
1447 class TypeBitfields {
1448 friend class Type;
1449 template <class T> friend class TypePropertyCache;
1450
1451 /// TypeClass bitfield - Enum that specifies what subclass this belongs to.
1452 unsigned TC : 8;
1453
1454 /// Whether this type is a dependent type (C++ [temp.dep.type]).
1455 unsigned Dependent : 1;
1456
1457 /// Whether this type somehow involves a template parameter, even
1458 /// if the resolution of the type does not depend on a template parameter.
1459 unsigned InstantiationDependent : 1;
1460
1461 /// Whether this type is a variably-modified type (C99 6.7.5).
1462 unsigned VariablyModified : 1;
1463
1464 /// Whether this type contains an unexpanded parameter pack
1465 /// (for C++11 variadic templates).
1466 unsigned ContainsUnexpandedParameterPack : 1;
1467
1468 /// True if the cache (i.e. the bitfields here starting with
1469 /// 'Cache') is valid.
1470 mutable unsigned CacheValid : 1;
1471
1472 /// Linkage of this type.
1473 mutable unsigned CachedLinkage : 3;
1474
1475 /// Whether this type involves and local or unnamed types.
1476 mutable unsigned CachedLocalOrUnnamed : 1;
1477
1478 /// Whether this type comes from an AST file.
1479 mutable unsigned FromAST : 1;
1480
1481 bool isCacheValid() const {
1482 return CacheValid;
1483 }
1484
1485 Linkage getLinkage() const {
1486 assert(isCacheValid() && "getting linkage from invalid cache")((isCacheValid() && "getting linkage from invalid cache"
) ? static_cast<void> (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1486, __PRETTY_FUNCTION__))
;
1487 return static_cast<Linkage>(CachedLinkage);
1488 }
1489
1490 bool hasLocalOrUnnamedType() const {
1491 assert(isCacheValid() && "getting linkage from invalid cache")((isCacheValid() && "getting linkage from invalid cache"
) ? static_cast<void> (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 1491, __PRETTY_FUNCTION__))
;
1492 return CachedLocalOrUnnamed;
1493 }
1494 };
1495 enum { NumTypeBits = 18 };
1496
1497protected:
1498 // These classes allow subclasses to somewhat cleanly pack bitfields
1499 // into Type.
1500
1501 class ArrayTypeBitfields {
1502 friend class ArrayType;
1503
1504 unsigned : NumTypeBits;
1505
1506 /// CVR qualifiers from declarations like
1507 /// 'int X[static restrict 4]'. For function parameters only.
1508 unsigned IndexTypeQuals : 3;
1509
1510 /// Storage class qualifiers from declarations like
1511 /// 'int X[static restrict 4]'. For function parameters only.
1512 /// Actually an ArrayType::ArraySizeModifier.
1513 unsigned SizeModifier : 3;
1514 };
1515
1516 class ConstantArrayTypeBitfields {
1517 friend class ConstantArrayType;
1518
1519 unsigned : NumTypeBits + 3 + 3;
1520
1521 /// Whether we have a stored size expression.
1522 unsigned HasStoredSizeExpr : 1;
1523 };
1524
1525 class BuiltinTypeBitfields {
1526 friend class BuiltinType;
1527
1528 unsigned : NumTypeBits;
1529
1530 /// The kind (BuiltinType::Kind) of builtin type this is.
1531 unsigned Kind : 8;
1532 };
1533
1534 /// FunctionTypeBitfields store various bits belonging to FunctionProtoType.
1535 /// Only common bits are stored here. Additional uncommon bits are stored
1536 /// in a trailing object after FunctionProtoType.
1537 class FunctionTypeBitfields {
1538 friend class FunctionProtoType;
1539 friend class FunctionType;
1540
1541 unsigned : NumTypeBits;
1542
1543 /// Extra information which affects how the function is called, like
1544 /// regparm and the calling convention.
1545 unsigned ExtInfo : 12;
1546
1547 /// The ref-qualifier associated with a \c FunctionProtoType.
1548 ///
1549 /// This is a value of type \c RefQualifierKind.
1550 unsigned RefQualifier : 2;
1551
1552 /// Used only by FunctionProtoType, put here to pack with the
1553 /// other bitfields.
1554 /// The qualifiers are part of FunctionProtoType because...
1555 ///
1556 /// C++ 8.3.5p4: The return type, the parameter type list and the
1557 /// cv-qualifier-seq, [...], are part of the function type.
1558 unsigned FastTypeQuals : Qualifiers::FastWidth;
1559 /// Whether this function has extended Qualifiers.
1560 unsigned HasExtQuals : 1;
1561
1562 /// The number of parameters this function has, not counting '...'.
1563 /// According to [implimits] 8 bits should be enough here but this is
1564 /// somewhat easy to exceed with metaprogramming and so we would like to
1565 /// keep NumParams as wide as reasonably possible.
1566 unsigned NumParams : 16;
1567
1568 /// The type of exception specification this function has.
1569 unsigned ExceptionSpecType : 4;
1570
1571 /// Whether this function has extended parameter information.
1572 unsigned HasExtParameterInfos : 1;
1573
1574 /// Whether the function is variadic.
1575 unsigned Variadic : 1;
1576
1577 /// Whether this function has a trailing return type.
1578 unsigned HasTrailingReturn : 1;
1579 };
1580
1581 class ObjCObjectTypeBitfields {
1582 friend class ObjCObjectType;
1583
1584 unsigned : NumTypeBits;
1585
1586 /// The number of type arguments stored directly on this object type.
1587 unsigned NumTypeArgs : 7;
1588
1589 /// The number of protocols stored directly on this object type.
1590 unsigned NumProtocols : 6;
1591
1592 /// Whether this is a "kindof" type.
1593 unsigned IsKindOf : 1;
1594 };
1595
1596 class ReferenceTypeBitfields {
1597 friend class ReferenceType;
1598
1599 unsigned : NumTypeBits;
1600
1601 /// True if the type was originally spelled with an lvalue sigil.
1602 /// This is never true of rvalue references but can also be false
1603 /// on lvalue references because of C++0x [dcl.typedef]p9,
1604 /// as follows:
1605 ///
1606 /// typedef int &ref; // lvalue, spelled lvalue
1607 /// typedef int &&rvref; // rvalue
1608 /// ref &a; // lvalue, inner ref, spelled lvalue
1609 /// ref &&a; // lvalue, inner ref
1610 /// rvref &a; // lvalue, inner ref, spelled lvalue
1611 /// rvref &&a; // rvalue, inner ref
1612 unsigned SpelledAsLValue : 1;
1613
1614 /// True if the inner type is a reference type. This only happens
1615 /// in non-canonical forms.
1616 unsigned InnerRef : 1;
1617 };
1618
1619 class TypeWithKeywordBitfields {
1620 friend class TypeWithKeyword;
1621
1622 unsigned : NumTypeBits;
1623
1624 /// An ElaboratedTypeKeyword. 8 bits for efficient access.
1625 unsigned Keyword : 8;
1626 };
1627
1628 enum { NumTypeWithKeywordBits = 8 };
1629
1630 class ElaboratedTypeBitfields {
1631 friend class ElaboratedType;
1632
1633 unsigned : NumTypeBits;
1634 unsigned : NumTypeWithKeywordBits;
1635
1636 /// Whether the ElaboratedType has a trailing OwnedTagDecl.
1637 unsigned HasOwnedTagDecl : 1;
1638 };
1639
1640 class VectorTypeBitfields {
1641 friend class VectorType;
1642 friend class DependentVectorType;
1643
1644 unsigned : NumTypeBits;
1645
1646 /// The kind of vector, either a generic vector type or some
1647 /// target-specific vector type such as for AltiVec or Neon.
1648 unsigned VecKind : 3;
1649
1650 /// The number of elements in the vector.
1651 unsigned NumElements : 29 - NumTypeBits;
1652
1653 enum { MaxNumElements = (1 << (29 - NumTypeBits)) - 1 };
1654 };
1655
1656 class AttributedTypeBitfields {
1657 friend class AttributedType;
1658
1659 unsigned : NumTypeBits;
1660
1661 /// An AttributedType::Kind
1662 unsigned AttrKind : 32 - NumTypeBits;
1663 };
1664
1665 class AutoTypeBitfields {
1666 friend class AutoType;
1667
1668 unsigned : NumTypeBits;
1669
1670 /// Was this placeholder type spelled as 'auto', 'decltype(auto)',
1671 /// or '__auto_type'? AutoTypeKeyword value.
1672 unsigned Keyword : 2;
1673 };
1674
1675 class SubstTemplateTypeParmPackTypeBitfields {
1676 friend class SubstTemplateTypeParmPackType;
1677
1678 unsigned : NumTypeBits;
1679
1680 /// The number of template arguments in \c Arguments, which is
1681 /// expected to be able to hold at least 1024 according to [implimits].
1682 /// However as this limit is somewhat easy to hit with template
1683 /// metaprogramming we'd prefer to keep it as large as possible.
1684 /// At the moment it has been left as a non-bitfield since this type
1685 /// safely fits in 64 bits as an unsigned, so there is no reason to
1686 /// introduce the performance impact of a bitfield.
1687 unsigned NumArgs;
1688 };
1689
1690 class TemplateSpecializationTypeBitfields {
1691 friend class TemplateSpecializationType;
1692
1693 unsigned : NumTypeBits;
1694
1695 /// Whether this template specialization type is a substituted type alias.
1696 unsigned TypeAlias : 1;
1697
1698 /// The number of template arguments named in this class template
1699 /// specialization, which is expected to be able to hold at least 1024
1700 /// according to [implimits]. However, as this limit is somewhat easy to
1701 /// hit with template metaprogramming we'd prefer to keep it as large
1702 /// as possible. At the moment it has been left as a non-bitfield since
1703 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1704 /// to introduce the performance impact of a bitfield.
1705 unsigned NumArgs;
1706 };
1707
1708 class DependentTemplateSpecializationTypeBitfields {
1709 friend class DependentTemplateSpecializationType;
1710
1711 unsigned : NumTypeBits;
1712 unsigned : NumTypeWithKeywordBits;
1713
1714 /// The number of template arguments named in this class template
1715 /// specialization, which is expected to be able to hold at least 1024
1716 /// according to [implimits]. However, as this limit is somewhat easy to
1717 /// hit with template metaprogramming we'd prefer to keep it as large
1718 /// as possible. At the moment it has been left as a non-bitfield since
1719 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1720 /// to introduce the performance impact of a bitfield.
1721 unsigned NumArgs;
1722 };
1723
1724 class PackExpansionTypeBitfields {
1725 friend class PackExpansionType;
1726
1727 unsigned : NumTypeBits;
1728
1729 /// The number of expansions that this pack expansion will
1730 /// generate when substituted (+1), which is expected to be able to
1731 /// hold at least 1024 according to [implimits]. However, as this limit
1732 /// is somewhat easy to hit with template metaprogramming we'd prefer to
1733 /// keep it as large as possible. At the moment it has been left as a
1734 /// non-bitfield since this type safely fits in 64 bits as an unsigned, so
1735 /// there is no reason to introduce the performance impact of a bitfield.
1736 ///
1737 /// This field will only have a non-zero value when some of the parameter
1738 /// packs that occur within the pattern have been substituted but others
1739 /// have not.
1740 unsigned NumExpansions;
1741 };
1742
1743 union {
1744 TypeBitfields TypeBits;
1745 ArrayTypeBitfields ArrayTypeBits;
1746 ConstantArrayTypeBitfields ConstantArrayTypeBits;
1747 AttributedTypeBitfields AttributedTypeBits;
1748 AutoTypeBitfields AutoTypeBits;
1749 BuiltinTypeBitfields BuiltinTypeBits;
1750 FunctionTypeBitfields FunctionTypeBits;
1751 ObjCObjectTypeBitfields ObjCObjectTypeBits;
1752 ReferenceTypeBitfields ReferenceTypeBits;
1753 TypeWithKeywordBitfields TypeWithKeywordBits;
1754 ElaboratedTypeBitfields ElaboratedTypeBits;
1755 VectorTypeBitfields VectorTypeBits;
1756 SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits;
1757 TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
1758 DependentTemplateSpecializationTypeBitfields
1759 DependentTemplateSpecializationTypeBits;
1760 PackExpansionTypeBitfields PackExpansionTypeBits;
1761
1762 static_assert(sizeof(TypeBitfields) <= 8,
1763 "TypeBitfields is larger than 8 bytes!");
1764 static_assert(sizeof(ArrayTypeBitfields) <= 8,
1765 "ArrayTypeBitfields is larger than 8 bytes!");
1766 static_assert(sizeof(AttributedTypeBitfields) <= 8,
1767 "AttributedTypeBitfields is larger than 8 bytes!");
1768 static_assert(sizeof(AutoTypeBitfields) <= 8,
1769 "AutoTypeBitfields is larger than 8 bytes!");
1770 static_assert(sizeof(BuiltinTypeBitfields) <= 8,
1771 "BuiltinTypeBitfields is larger than 8 bytes!");
1772 static_assert(sizeof(FunctionTypeBitfields) <= 8,
1773 "FunctionTypeBitfields is larger than 8 bytes!");
1774 static_assert(sizeof(ObjCObjectTypeBitfields) <= 8,
1775 "ObjCObjectTypeBitfields is larger than 8 bytes!");
1776 static_assert(sizeof(ReferenceTypeBitfields) <= 8,
1777 "ReferenceTypeBitfields is larger than 8 bytes!");
1778 static_assert(sizeof(TypeWithKeywordBitfields) <= 8,
1779 "TypeWithKeywordBitfields is larger than 8 bytes!");
1780 static_assert(sizeof(ElaboratedTypeBitfields) <= 8,
1781 "ElaboratedTypeBitfields is larger than 8 bytes!");
1782 static_assert(sizeof(VectorTypeBitfields) <= 8,
1783 "VectorTypeBitfields is larger than 8 bytes!");
1784 static_assert(sizeof(SubstTemplateTypeParmPackTypeBitfields) <= 8,
1785 "SubstTemplateTypeParmPackTypeBitfields is larger"
1786 " than 8 bytes!");
1787 static_assert(sizeof(TemplateSpecializationTypeBitfields) <= 8,
1788 "TemplateSpecializationTypeBitfields is larger"
1789 " than 8 bytes!");
1790 static_assert(sizeof(DependentTemplateSpecializationTypeBitfields) <= 8,
1791 "DependentTemplateSpecializationTypeBitfields is larger"
1792 " than 8 bytes!");
1793 static_assert(sizeof(PackExpansionTypeBitfields) <= 8,
1794 "PackExpansionTypeBitfields is larger than 8 bytes");
1795 };
1796
1797private:
1798 template <class T> friend class TypePropertyCache;
1799
1800 /// Set whether this type comes from an AST file.
1801 void setFromAST(bool V = true) const {
1802 TypeBits.FromAST = V;
1803 }
1804
1805protected:
1806 friend class ASTContext;
1807
1808 Type(TypeClass tc, QualType canon, bool Dependent,
1809 bool InstantiationDependent, bool VariablyModified,
1810 bool ContainsUnexpandedParameterPack)
1811 : ExtQualsTypeCommonBase(this,
1812 canon.isNull() ? QualType(this_(), 0) : canon) {
1813 TypeBits.TC = tc;
1814 TypeBits.Dependent = Dependent;
1815 TypeBits.InstantiationDependent = Dependent || InstantiationDependent;
1816 TypeBits.VariablyModified = VariablyModified;
1817 TypeBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
1818 TypeBits.CacheValid = false;
1819 TypeBits.CachedLocalOrUnnamed = false;
1820 TypeBits.CachedLinkage = NoLinkage;
1821 TypeBits.FromAST = false;
1822 }
1823
1824 // silence VC++ warning C4355: 'this' : used in base member initializer list
1825 Type *this_() { return this; }
1826
1827 void setDependent(bool D = true) {
1828 TypeBits.Dependent = D;
1829 if (D)
1830 TypeBits.InstantiationDependent = true;
1831 }
1832
1833 void setInstantiationDependent(bool D = true) {
1834 TypeBits.InstantiationDependent = D; }
1835
1836 void setVariablyModified(bool VM = true) { TypeBits.VariablyModified = VM; }
1837
1838 void setContainsUnexpandedParameterPack(bool PP = true) {
1839 TypeBits.ContainsUnexpandedParameterPack = PP;
1840 }
1841
1842public:
1843 friend class ASTReader;
1844 friend class ASTWriter;
1845
1846 Type(const Type &) = delete;
1847 Type(Type &&) = delete;
1848 Type &operator=(const Type &) = delete;
1849 Type &operator=(Type &&) = delete;
1850
1851 TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); }
1852
1853 /// Whether this type comes from an AST file.
1854 bool isFromAST() const { return TypeBits.FromAST; }
1855
1856 /// Whether this type is or contains an unexpanded parameter
1857 /// pack, used to support C++0x variadic templates.
1858 ///
1859 /// A type that contains a parameter pack shall be expanded by the
1860 /// ellipsis operator at some point. For example, the typedef in the
1861 /// following example contains an unexpanded parameter pack 'T':
1862 ///
1863 /// \code
1864 /// template<typename ...T>
1865 /// struct X {
1866 /// typedef T* pointer_types; // ill-formed; T is a parameter pack.
1867 /// };
1868 /// \endcode
1869 ///
1870 /// Note that this routine does not specify which
1871 bool containsUnexpandedParameterPack() const {
1872 return TypeBits.ContainsUnexpandedParameterPack;
1873 }
1874
1875 /// Determines if this type would be canonical if it had no further
1876 /// qualification.
1877 bool isCanonicalUnqualified() const {
1878 return CanonicalType == QualType(this, 0);
1879 }
1880
1881 /// Pull a single level of sugar off of this locally-unqualified type.
1882 /// Users should generally prefer SplitQualType::getSingleStepDesugaredType()
1883 /// or QualType::getSingleStepDesugaredType(const ASTContext&).
1884 QualType getLocallyUnqualifiedSingleStepDesugaredType() const;
1885
1886 /// Types are partitioned into 3 broad categories (C99 6.2.5p1):
1887 /// object types, function types, and incomplete types.
1888
1889 /// Return true if this is an incomplete type.
1890 /// A type that can describe objects, but which lacks information needed to
1891 /// determine its size (e.g. void, or a fwd declared struct). Clients of this
1892 /// routine will need to determine if the size is actually required.
1893 ///
1894 /// Def If non-null, and the type refers to some kind of declaration
1895 /// that can be completed (such as a C struct, C++ class, or Objective-C
1896 /// class), will be set to the declaration.
1897 bool isIncompleteType(NamedDecl **Def = nullptr) const;
1898
1899 /// Return true if this is an incomplete or object
1900 /// type, in other words, not a function type.
1901 bool isIncompleteOrObjectType() const {
1902 return !isFunctionType();
1903 }
1904
1905 /// Determine whether this type is an object type.
1906 bool isObjectType() const {
1907 // C++ [basic.types]p8:
1908 // An object type is a (possibly cv-qualified) type that is not a
1909 // function type, not a reference type, and not a void type.
1910 return !isReferenceType() && !isFunctionType() && !isVoidType();
1911 }
1912
1913 /// Return true if this is a literal type
1914 /// (C++11 [basic.types]p10)
1915 bool isLiteralType(const ASTContext &Ctx) const;
1916
1917 /// Test if this type is a standard-layout type.
1918 /// (C++0x [basic.type]p9)
1919 bool isStandardLayoutType() const;
1920
1921 /// Helper methods to distinguish type categories. All type predicates
1922 /// operate on the canonical type, ignoring typedefs and qualifiers.
1923
1924 /// Returns true if the type is a builtin type.
1925 bool isBuiltinType() const;
1926
1927 /// Test for a particular builtin type.
1928 bool isSpecificBuiltinType(unsigned K) const;
1929
1930 /// Test for a type which does not represent an actual type-system type but
1931 /// is instead used as a placeholder for various convenient purposes within
1932 /// Clang. All such types are BuiltinTypes.
1933 bool isPlaceholderType() const;
1934 const BuiltinType *getAsPlaceholderType() const;
1935
1936 /// Test for a specific placeholder type.
1937 bool isSpecificPlaceholderType(unsigned K) const;
1938
1939 /// Test for a placeholder type other than Overload; see
1940 /// BuiltinType::isNonOverloadPlaceholderType.
1941 bool isNonOverloadPlaceholderType() const;
1942
1943 /// isIntegerType() does *not* include complex integers (a GCC extension).
1944 /// isComplexIntegerType() can be used to test for complex integers.
1945 bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum)
1946 bool isEnumeralType() const;
1947
1948 /// Determine whether this type is a scoped enumeration type.
1949 bool isScopedEnumeralType() const;
1950 bool isBooleanType() const;
1951 bool isCharType() const;
1952 bool isWideCharType() const;
1953 bool isChar8Type() const;
1954 bool isChar16Type() const;
1955 bool isChar32Type() const;
1956 bool isAnyCharacterType() const;
1957 bool isIntegralType(const ASTContext &Ctx) const;
1958
1959 /// Determine whether this type is an integral or enumeration type.
1960 bool isIntegralOrEnumerationType() const;
1961
1962 /// Determine whether this type is an integral or unscoped enumeration type.
1963 bool isIntegralOrUnscopedEnumerationType() const;
1964
1965 /// Floating point categories.
1966 bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double)
1967 /// isComplexType() does *not* include complex integers (a GCC extension).
1968 /// isComplexIntegerType() can be used to test for complex integers.
1969 bool isComplexType() const; // C99 6.2.5p11 (complex)
1970 bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int.
1971 bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex)
1972 bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half)
1973 bool isFloat16Type() const; // C11 extension ISO/IEC TS 18661
1974 bool isFloat128Type() const;
1975 bool isRealType() const; // C99 6.2.5p17 (real floating + integer)
1976 bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating)
1977 bool isVoidType() const; // C99 6.2.5p19
1978 bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers)
1979 bool isAggregateType() const;
1980 bool isFundamentalType() const;
1981 bool isCompoundType() const;
1982
1983 // Type Predicates: Check to see if this type is structurally the specified
1984 // type, ignoring typedefs and qualifiers.
1985 bool isFunctionType() const;
1986 bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); }
1987 bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); }
1988 bool isPointerType() const;
1989 bool isAnyPointerType() const; // Any C pointer or ObjC object pointer
1990 bool isBlockPointerType() const;
1991 bool isVoidPointerType() const;
1992 bool isReferenceType() const;
1993 bool isLValueReferenceType() const;
1994 bool isRValueReferenceType() const;
1995 bool isFunctionPointerType() const;
1996 bool isFunctionReferenceType() const;
1997 bool isMemberPointerType() const;
1998 bool isMemberFunctionPointerType() const;
1999 bool isMemberDataPointerType() const;
2000 bool isArrayType() const;
2001 bool isConstantArrayType() const;
2002 bool isIncompleteArrayType() const;
2003 bool isVariableArrayType() const;
2004 bool isDependentSizedArrayType() const;
2005 bool isRecordType() const;
2006 bool isClassType() const;
2007 bool isStructureType() const;
2008 bool isObjCBoxableRecordType() const;
2009 bool isInterfaceType() const;
2010 bool isStructureOrClassType() const;
2011 bool isUnionType() const;
2012 bool isComplexIntegerType() const; // GCC _Complex integer type.
2013 bool isVectorType() const; // GCC vector type.
2014 bool isExtVectorType() const; // Extended vector type.
2015 bool isDependentAddressSpaceType() const; // value-dependent address space qualifier
2016 bool isObjCObjectPointerType() const; // pointer to ObjC object
2017 bool isObjCRetainableType() const; // ObjC object or block pointer
2018 bool isObjCLifetimeType() const; // (array of)* retainable type
2019 bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type
2020 bool isObjCNSObjectType() const; // __attribute__((NSObject))
2021 bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class))
2022 // FIXME: change this to 'raw' interface type, so we can used 'interface' type
2023 // for the common case.
2024 bool isObjCObjectType() const; // NSString or typeof(*(id)0)
2025 bool isObjCQualifiedInterfaceType() const; // NSString<foo>
2026 bool isObjCQualifiedIdType() const; // id<foo>
2027 bool isObjCQualifiedClassType() const; // Class<foo>
2028 bool isObjCObjectOrInterfaceType() const;
2029 bool isObjCIdType() const; // id
2030 bool isDecltypeType() const;
2031 /// Was this type written with the special inert-in-ARC __unsafe_unretained
2032 /// qualifier?
2033 ///
2034 /// This approximates the answer to the following question: if this
2035 /// translation unit were compiled in ARC, would this type be qualified
2036 /// with __unsafe_unretained?
2037 bool isObjCInertUnsafeUnretainedType() const {
2038 return hasAttr(attr::ObjCInertUnsafeUnretained);
2039 }
2040
2041 /// Whether the type is Objective-C 'id' or a __kindof type of an
2042 /// object type, e.g., __kindof NSView * or __kindof id
2043 /// <NSCopying>.
2044 ///
2045 /// \param bound Will be set to the bound on non-id subtype types,
2046 /// which will be (possibly specialized) Objective-C class type, or
2047 /// null for 'id.
2048 bool isObjCIdOrObjectKindOfType(const ASTContext &ctx,
2049 const ObjCObjectType *&bound) const;
2050
2051 bool isObjCClassType() const; // Class
2052
2053 /// Whether the type is Objective-C 'Class' or a __kindof type of an
2054 /// Class type, e.g., __kindof Class <NSCopying>.
2055 ///
2056 /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound
2057 /// here because Objective-C's type system cannot express "a class
2058 /// object for a subclass of NSFoo".
2059 bool isObjCClassOrClassKindOfType() const;
2060
2061 bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const;
2062 bool isObjCSelType() const; // Class
2063 bool isObjCBuiltinType() const; // 'id' or 'Class'
2064 bool isObjCARCBridgableType() const;
2065 bool isCARCBridgableType() const;
2066 bool isTemplateTypeParmType() const; // C++ template type parameter
2067 bool isNullPtrType() const; // C++11 std::nullptr_t
2068 bool isNothrowT() const; // C++ std::nothrow_t
2069 bool isAlignValT() const; // C++17 std::align_val_t
2070 bool isStdByteType() const; // C++17 std::byte
2071 bool isAtomicType() const; // C11 _Atomic()
2072
2073#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2074 bool is##Id##Type() const;
2075#include "clang/Basic/OpenCLImageTypes.def"
2076
2077 bool isImageType() const; // Any OpenCL image type
2078
2079 bool isSamplerT() const; // OpenCL sampler_t
2080 bool isEventT() const; // OpenCL event_t
2081 bool isClkEventT() const; // OpenCL clk_event_t
2082 bool isQueueT() const; // OpenCL queue_t
2083 bool isReserveIDT() const; // OpenCL reserve_id_t
2084
2085#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2086 bool is##Id##Type() const;
2087#include "clang/Basic/OpenCLExtensionTypes.def"
2088 // Type defined in cl_intel_device_side_avc_motion_estimation OpenCL extension
2089 bool isOCLIntelSubgroupAVCType() const;
2090 bool isOCLExtOpaqueType() const; // Any OpenCL extension type
2091
2092 bool isPipeType() const; // OpenCL pipe type
2093 bool isOpenCLSpecificType() const; // Any OpenCL specific type
2094
2095 /// Determines if this type, which must satisfy
2096 /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather
2097 /// than implicitly __strong.
2098 bool isObjCARCImplicitlyUnretainedType() const;
2099
2100 /// Return the implicit lifetime for this type, which must not be dependent.
2101 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const;
2102
2103 enum ScalarTypeKind {
2104 STK_CPointer,
2105 STK_BlockPointer,
2106 STK_ObjCObjectPointer,
2107 STK_MemberPointer,
2108 STK_Bool,
2109 STK_Integral,
2110 STK_Floating,
2111 STK_IntegralComplex,
2112 STK_FloatingComplex,
2113 STK_FixedPoint
2114 };
2115
2116 /// Given that this is a scalar type, classify it.
2117 ScalarTypeKind getScalarTypeKind() const;
2118
2119 /// Whether this type is a dependent type, meaning that its definition
2120 /// somehow depends on a template parameter (C++ [temp.dep.type]).
2121 bool isDependentType() const { return TypeBits.Dependent; }
2122
2123 /// Determine whether this type is an instantiation-dependent type,
2124 /// meaning that the type involves a template parameter (even if the
2125 /// definition does not actually depend on the type substituted for that
2126 /// template parameter).
2127 bool isInstantiationDependentType() const {
2128 return TypeBits.InstantiationDependent;
2129 }
2130
2131 /// Determine whether this type is an undeduced type, meaning that
2132 /// it somehow involves a C++11 'auto' type or similar which has not yet been
2133 /// deduced.
2134 bool isUndeducedType() const;
2135
2136 /// Whether this type is a variably-modified type (C99 6.7.5).
2137 bool isVariablyModifiedType() const { return TypeBits.VariablyModified; }
2138
2139 /// Whether this type involves a variable-length array type
2140 /// with a definite size.
2141 bool hasSizedVLAType() const;
2142
2143 /// Whether this type is or contains a local or unnamed type.
2144 bool hasUnnamedOrLocalType() const;
2145
2146 bool isOverloadableType() const;
2147
2148 /// Determine wither this type is a C++ elaborated-type-specifier.
2149 bool isElaboratedTypeSpecifier() const;
2150
2151 bool canDecayToPointerType() const;
2152
2153 /// Whether this type is represented natively as a pointer. This includes
2154 /// pointers, references, block pointers, and Objective-C interface,
2155 /// qualified id, and qualified interface types, as well as nullptr_t.
2156 bool hasPointerRepresentation() const;
2157
2158 /// Whether this type can represent an objective pointer type for the
2159 /// purpose of GC'ability
2160 bool hasObjCPointerRepresentation() const;
2161
2162 /// Determine whether this type has an integer representation
2163 /// of some sort, e.g., it is an integer type or a vector.
2164 bool hasIntegerRepresentation() const;
2165
2166 /// Determine whether this type has an signed integer representation
2167 /// of some sort, e.g., it is an signed integer type or a vector.
2168 bool hasSignedIntegerRepresentation() const;
2169
2170 /// Determine whether this type has an unsigned integer representation
2171 /// of some sort, e.g., it is an unsigned integer type or a vector.
2172 bool hasUnsignedIntegerRepresentation() const;
2173
2174 /// Determine whether this type has a floating-point representation
2175 /// of some sort, e.g., it is a floating-point type or a vector thereof.
2176 bool hasFloatingRepresentation() const;
2177
2178 // Type Checking Functions: Check to see if this type is structurally the
2179 // specified type, ignoring typedefs and qualifiers, and return a pointer to
2180 // the best type we can.
2181 const RecordType *getAsStructureType() const;
2182 /// NOTE: getAs*ArrayType are methods on ASTContext.
2183 const RecordType *getAsUnionType() const;
2184 const ComplexType *getAsComplexIntegerType() const; // GCC complex int type.
2185 const ObjCObjectType *getAsObjCInterfaceType() const;
2186
2187 // The following is a convenience method that returns an ObjCObjectPointerType
2188 // for object declared using an interface.
2189 const ObjCObjectPointerType *getAsObjCInterfacePointerType() const;
2190 const ObjCObjectPointerType *getAsObjCQualifiedIdType() const;
2191 const ObjCObjectPointerType *getAsObjCQualifiedClassType() const;
2192 const ObjCObjectType *getAsObjCQualifiedInterfaceType() const;
2193
2194 /// Retrieves the CXXRecordDecl that this type refers to, either
2195 /// because the type is a RecordType or because it is the injected-class-name
2196 /// type of a class template or class template partial specialization.
2197 CXXRecordDecl *getAsCXXRecordDecl() const;
2198
2199 /// Retrieves the RecordDecl this type refers to.
2200 RecordDecl *getAsRecordDecl() const;
2201
2202 /// Retrieves the TagDecl that this type refers to, either
2203 /// because the type is a TagType or because it is the injected-class-name
2204 /// type of a class template or class template partial specialization.
2205 TagDecl *getAsTagDecl() const;
2206
2207 /// If this is a pointer or reference to a RecordType, return the
2208 /// CXXRecordDecl that the type refers to.
2209 ///
2210 /// If this is not a pointer or reference, or the type being pointed to does
2211 /// not refer to a CXXRecordDecl, returns NULL.
2212 const CXXRecordDecl *getPointeeCXXRecordDecl() const;
2213
2214 /// Get the DeducedType whose type will be deduced for a variable with
2215 /// an initializer of this type. This looks through declarators like pointer
2216 /// types, but not through decltype or typedefs.
2217 DeducedType *getContainedDeducedType() const;
2218
2219 /// Get the AutoType whose type will be deduced for a variable with
2220 /// an initializer of this type. This looks through declarators like pointer
2221 /// types, but not through decltype or typedefs.
2222 AutoType *getContainedAutoType() const {
2223 return dyn_cast_or_null<AutoType>(getContainedDeducedType());
2224 }
2225
2226 /// Determine whether this type was written with a leading 'auto'
2227 /// corresponding to a trailing return type (possibly for a nested
2228 /// function type within a pointer to function type or similar).
2229 bool hasAutoForTrailingReturnType() const;
2230
2231 /// Member-template getAs<specific type>'. Look through sugar for
2232 /// an instance of \<specific type>. This scheme will eventually
2233 /// replace the specific getAsXXXX methods above.
2234 ///
2235 /// There are some specializations of this member template listed
2236 /// immediately following this class.
2237 template <typename T> const T *getAs() const;
2238
2239 /// Member-template getAsAdjusted<specific type>. Look through specific kinds
2240 /// of sugar (parens, attributes, etc) for an instance of \<specific type>.
2241 /// This is used when you need to walk over sugar nodes that represent some
2242 /// kind of type adjustment from a type that was written as a \<specific type>
2243 /// to another type that is still canonically a \<specific type>.
2244 template <typename T> const T *getAsAdjusted() const;
2245
2246 /// A variant of getAs<> for array types which silently discards
2247 /// qualifiers from the outermost type.
2248 const ArrayType *getAsArrayTypeUnsafe() const;
2249
2250 /// Member-template castAs<specific type>. Look through sugar for
2251 /// the underlying instance of \<specific type>.
2252 ///
2253 /// This method has the same relationship to getAs<T> as cast<T> has
2254 /// to dyn_cast<T>; which is to say, the underlying type *must*
2255 /// have the intended type, and this method will never return null.
2256 template <typename T> const T *castAs() const;
2257
2258 /// A variant of castAs<> for array type which silently discards
2259 /// qualifiers from the outermost type.
2260 const ArrayType *castAsArrayTypeUnsafe() const;
2261
2262 /// Determine whether this type had the specified attribute applied to it
2263 /// (looking through top-level type sugar).
2264 bool hasAttr(attr::Kind AK) const;
2265
2266 /// Get the base element type of this type, potentially discarding type
2267 /// qualifiers. This should never be used when type qualifiers
2268 /// are meaningful.
2269 const Type *getBaseElementTypeUnsafe() const;
2270
2271 /// If this is an array type, return the element type of the array,
2272 /// potentially with type qualifiers missing.
2273 /// This should never be used when type qualifiers are meaningful.
2274 const Type *getArrayElementTypeNoTypeQual() const;
2275
2276 /// If this is a pointer type, return the pointee type.
2277 /// If this is an array type, return the array element type.
2278 /// This should never be used when type qualifiers are meaningful.
2279 const Type *getPointeeOrArrayElementType() const;
2280
2281 /// If this is a pointer, ObjC object pointer, or block
2282 /// pointer, this returns the respective pointee.
2283 QualType getPointeeType() const;
2284
2285 /// Return the specified type with any "sugar" removed from the type,
2286 /// removing any typedefs, typeofs, etc., as well as any qualifiers.
2287 const Type *getUnqualifiedDesugaredType() const;
2288
2289 /// More type predicates useful for type checking/promotion
2290 bool isPromotableIntegerType() const; // C99 6.3.1.1p2
2291
2292 /// Return true if this is an integer type that is
2293 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
2294 /// or an enum decl which has a signed representation.
2295 bool isSignedIntegerType() const;
2296
2297 /// Return true if this is an integer type that is
2298 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool],
2299 /// or an enum decl which has an unsigned representation.
2300 bool isUnsignedIntegerType() const;
2301
2302 /// Determines whether this is an integer type that is signed or an
2303 /// enumeration types whose underlying type is a signed integer type.
2304 bool isSignedIntegerOrEnumerationType() const;
2305
2306 /// Determines whether this is an integer type that is unsigned or an
2307 /// enumeration types whose underlying type is a unsigned integer type.
2308 bool isUnsignedIntegerOrEnumerationType() const;
2309
2310 /// Return true if this is a fixed point type according to
2311 /// ISO/IEC JTC1 SC22 WG14 N1169.
2312 bool isFixedPointType() const;
2313
2314 /// Return true if this is a fixed point or integer type.
2315 bool isFixedPointOrIntegerType() const;
2316
2317 /// Return true if this is a saturated fixed point type according to
2318 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2319 bool isSaturatedFixedPointType() const;
2320
2321 /// Return true if this is a saturated fixed point type according to
2322 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2323 bool isUnsaturatedFixedPointType() const;
2324
2325 /// Return true if this is a fixed point type that is signed according
2326 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2327 bool isSignedFixedPointType() const;
2328
2329 /// Return true if this is a fixed point type that is unsigned according
2330 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2331 bool isUnsignedFixedPointType() const;
2332
2333 /// Return true if this is not a variable sized type,
2334 /// according to the rules of C99 6.7.5p3. It is not legal to call this on
2335 /// incomplete types.
2336 bool isConstantSizeType() const;
2337
2338 /// Returns true if this type can be represented by some
2339 /// set of type specifiers.
2340 bool isSpecifierType() const;
2341
2342 /// Determine the linkage of this type.
2343 Linkage getLinkage() const;
2344
2345 /// Determine the visibility of this type.
2346 Visibility getVisibility() const {
2347 return getLinkageAndVisibility().getVisibility();
2348 }
2349
2350 /// Return true if the visibility was explicitly set is the code.
2351 bool isVisibilityExplicit() const {
2352 return getLinkageAndVisibility().isVisibilityExplicit();
2353 }
2354
2355 /// Determine the linkage and visibility of this type.
2356 LinkageInfo getLinkageAndVisibility() const;
2357
2358 /// True if the computed linkage is valid. Used for consistency
2359 /// checking. Should always return true.
2360 bool isLinkageValid() const;
2361
2362 /// Determine the nullability of the given type.
2363 ///
2364 /// Note that nullability is only captured as sugar within the type
2365 /// system, not as part of the canonical type, so nullability will
2366 /// be lost by canonicalization and desugaring.
2367 Optional<NullabilityKind> getNullability(const ASTContext &context) const;
2368
2369 /// Determine whether the given type can have a nullability
2370 /// specifier applied to it, i.e., if it is any kind of pointer type.
2371 ///
2372 /// \param ResultIfUnknown The value to return if we don't yet know whether
2373 /// this type can have nullability because it is dependent.
2374 bool canHaveNullability(bool ResultIfUnknown = true) const;
2375
2376 /// Retrieve the set of substitutions required when accessing a member
2377 /// of the Objective-C receiver type that is declared in the given context.
2378 ///
2379 /// \c *this is the type of the object we're operating on, e.g., the
2380 /// receiver for a message send or the base of a property access, and is
2381 /// expected to be of some object or object pointer type.
2382 ///
2383 /// \param dc The declaration context for which we are building up a
2384 /// substitution mapping, which should be an Objective-C class, extension,
2385 /// category, or method within.
2386 ///
2387 /// \returns an array of type arguments that can be substituted for
2388 /// the type parameters of the given declaration context in any type described
2389 /// within that context, or an empty optional to indicate that no
2390 /// substitution is required.
2391 Optional<ArrayRef<QualType>>
2392 getObjCSubstitutions(const DeclContext *dc) const;
2393
2394 /// Determines if this is an ObjC interface type that may accept type
2395 /// parameters.
2396 bool acceptsObjCTypeParams() const;
2397
2398 const char *getTypeClassName() const;
2399
2400 QualType getCanonicalTypeInternal() const {
2401 return CanonicalType;
2402 }
2403
2404 CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h
2405 void dump() const;
2406 void dump(llvm::raw_ostream &OS) const;
2407};
2408
2409/// This will check for a TypedefType by removing any existing sugar
2410/// until it reaches a TypedefType or a non-sugared type.
2411template <> const TypedefType *Type::getAs() const;
2412
2413/// This will check for a TemplateSpecializationType by removing any
2414/// existing sugar until it reaches a TemplateSpecializationType or a
2415/// non-sugared type.
2416template <> const TemplateSpecializationType *Type::getAs() const;
2417
2418/// This will check for an AttributedType by removing any existing sugar
2419/// until it reaches an AttributedType or a non-sugared type.
2420template <> const AttributedType *Type::getAs() const;
2421
2422// We can do canonical leaf types faster, because we don't have to
2423// worry about preserving child type decoration.
2424#define TYPE(Class, Base)
2425#define LEAF_TYPE(Class) \
2426template <> inline const Class##Type *Type::getAs() const { \
2427 return dyn_cast<Class##Type>(CanonicalType); \
2428} \
2429template <> inline const Class##Type *Type::castAs() const { \
2430 return cast<Class##Type>(CanonicalType); \
2431}
2432#include "clang/AST/TypeNodes.inc"
2433
2434/// This class is used for builtin types like 'int'. Builtin
2435/// types are always canonical and have a literal name field.
2436class BuiltinType : public Type {
2437public:
2438 enum Kind {
2439// OpenCL image types
2440#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
2441#include "clang/Basic/OpenCLImageTypes.def"
2442// OpenCL extension types
2443#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
2444#include "clang/Basic/OpenCLExtensionTypes.def"
2445// SVE Types
2446#define SVE_TYPE(Name, Id, SingletonId) Id,
2447#include "clang/Basic/AArch64SVEACLETypes.def"
2448// All other builtin types
2449#define BUILTIN_TYPE(Id, SingletonId) Id,
2450#define LAST_BUILTIN_TYPE(Id) LastKind = Id
2451#include "clang/AST/BuiltinTypes.def"
2452 };
2453
2454private:
2455 friend class ASTContext; // ASTContext creates these.
2456
2457 BuiltinType(Kind K)
2458 : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent),
2459 /*InstantiationDependent=*/(K == Dependent),
2460 /*VariablyModified=*/false,
2461 /*Unexpanded parameter pack=*/false) {
2462 BuiltinTypeBits.Kind = K;
2463 }
2464
2465public:
2466 Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); }
2467 StringRef getName(const PrintingPolicy &Policy) const;
2468
2469 const char *getNameAsCString(const PrintingPolicy &Policy) const {
2470 // The StringRef is null-terminated.
2471 StringRef str = getName(Policy);
2472 assert(!str.empty() && str.data()[str.size()] == '\0')((!str.empty() && str.data()[str.size()] == '\0') ? static_cast
<void> (0) : __assert_fail ("!str.empty() && str.data()[str.size()] == '\\0'"
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 2472, __PRETTY_FUNCTION__))
;
2473 return str.data();
2474 }
2475
2476 bool isSugared() const { return false; }
2477 QualType desugar() const { return QualType(this, 0); }
2478
2479 bool isInteger() const {
2480 return getKind() >= Bool && getKind() <= Int128;
2481 }
2482
2483 bool isSignedInteger() const {
2484 return getKind() >= Char_S && getKind() <= Int128;
2485 }
2486
2487 bool isUnsignedInteger() const {
2488 return getKind() >= Bool && getKind() <= UInt128;
2489 }
2490
2491 bool isFloatingPoint() const {
2492 return getKind() >= Half && getKind() <= Float128;
2493 }
2494
2495 /// Determines whether the given kind corresponds to a placeholder type.
2496 static bool isPlaceholderTypeKind(Kind K) {
2497 return K >= Overload;
2498 }
2499
2500 /// Determines whether this type is a placeholder type, i.e. a type
2501 /// which cannot appear in arbitrary positions in a fully-formed
2502 /// expression.
2503 bool isPlaceholderType() const {
2504 return isPlaceholderTypeKind(getKind());
2505 }
2506
2507 /// Determines whether this type is a placeholder type other than
2508 /// Overload. Most placeholder types require only syntactic
2509 /// information about their context in order to be resolved (e.g.
2510 /// whether it is a call expression), which means they can (and
2511 /// should) be resolved in an earlier "phase" of analysis.
2512 /// Overload expressions sometimes pick up further information
2513 /// from their context, like whether the context expects a
2514 /// specific function-pointer type, and so frequently need
2515 /// special treatment.
2516 bool isNonOverloadPlaceholderType() const {
2517 return getKind() > Overload;
2518 }
2519
2520 static bool classof(const Type *T) { return T->getTypeClass() == Builtin; }
2521};
2522
2523/// Complex values, per C99 6.2.5p11. This supports the C99 complex
2524/// types (_Complex float etc) as well as the GCC integer complex extensions.
2525class ComplexType : public Type, public llvm::FoldingSetNode {
2526 friend class ASTContext; // ASTContext creates these.
2527
2528 QualType ElementType;
2529
2530 ComplexType(QualType Element, QualType CanonicalPtr)
2531 : Type(Complex, CanonicalPtr, Element->isDependentType(),
2532 Element->isInstantiationDependentType(),
2533 Element->isVariablyModifiedType(),
2534 Element->containsUnexpandedParameterPack()),
2535 ElementType(Element) {}
2536
2537public:
2538 QualType getElementType() const { return ElementType; }
2539
2540 bool isSugared() const { return false; }
2541 QualType desugar() const { return QualType(this, 0); }
2542
2543 void Profile(llvm::FoldingSetNodeID &ID) {
2544 Profile(ID, getElementType());
2545 }
2546
2547 static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) {
2548 ID.AddPointer(Element.getAsOpaquePtr());
2549 }
2550
2551 static bool classof(const Type *T) { return T->getTypeClass() == Complex; }
2552};
2553
2554/// Sugar for parentheses used when specifying types.
2555class ParenType : public Type, public llvm::FoldingSetNode {
2556 friend class ASTContext; // ASTContext creates these.
2557
2558 QualType Inner;
2559
2560 ParenType(QualType InnerType, QualType CanonType)
2561 : Type(Paren, CanonType, InnerType->isDependentType(),
2562 InnerType->isInstantiationDependentType(),
2563 InnerType->isVariablyModifiedType(),
2564 InnerType->containsUnexpandedParameterPack()),
2565 Inner(InnerType) {}
2566
2567public:
2568 QualType getInnerType() const { return Inner; }
2569
2570 bool isSugared() const { return true; }
2571 QualType desugar() const { return getInnerType(); }
2572
2573 void Profile(llvm::FoldingSetNodeID &ID) {
2574 Profile(ID, getInnerType());
2575 }
2576
2577 static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) {
2578 Inner.Profile(ID);
2579 }
2580
2581 static bool classof(const Type *T) { return T->getTypeClass() == Paren; }
2582};
2583
2584/// PointerType - C99 6.7.5.1 - Pointer Declarators.
2585class PointerType : public Type, public llvm::FoldingSetNode {
2586 friend class ASTContext; // ASTContext creates these.
2587
2588 QualType PointeeType;
2589
2590 PointerType(QualType Pointee, QualType CanonicalPtr)
2591 : Type(Pointer, CanonicalPtr, Pointee->isDependentType(),
2592 Pointee->isInstantiationDependentType(),
2593 Pointee->isVariablyModifiedType(),
2594 Pointee->containsUnexpandedParameterPack()),
2595 PointeeType(Pointee) {}
2596
2597public:
2598 QualType getPointeeType() const { return PointeeType; }
2599
2600 /// Returns true if address spaces of pointers overlap.
2601 /// OpenCL v2.0 defines conversion rules for pointers to different
2602 /// address spaces (OpenCLC v2.0 s6.5.5) and notion of overlapping
2603 /// address spaces.
2604 /// CL1.1 or CL1.2:
2605 /// address spaces overlap iff they are they same.
2606 /// CL2.0 adds:
2607 /// __generic overlaps with any address space except for __constant.
2608 bool isAddressSpaceOverlapping(const PointerType &other) const {
2609 Qualifiers thisQuals = PointeeType.getQualifiers();
2610 Qualifiers otherQuals = other.getPointeeType().getQualifiers();
2611 // Address spaces overlap if at least one of them is a superset of another
2612 return thisQuals.isAddressSpaceSupersetOf(otherQuals) ||
2613 otherQuals.isAddressSpaceSupersetOf(thisQuals);
2614 }
2615
2616 bool isSugared() const { return false; }
2617 QualType desugar() const { return QualType(this, 0); }
2618
2619 void Profile(llvm::FoldingSetNodeID &ID) {
2620 Profile(ID, getPointeeType());
2621 }
2622
2623 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2624 ID.AddPointer(Pointee.getAsOpaquePtr());
2625 }
2626
2627 static bool classof(const Type *T) { return T->getTypeClass() == Pointer; }
2628};
2629
2630/// Represents a type which was implicitly adjusted by the semantic
2631/// engine for arbitrary reasons. For example, array and function types can
2632/// decay, and function types can have their calling conventions adjusted.
2633class AdjustedType : public Type, public llvm::FoldingSetNode {
2634 QualType OriginalTy;
2635 QualType AdjustedTy;
2636
2637protected:
2638 friend class ASTContext; // ASTContext creates these.
2639
2640 AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy,
2641 QualType CanonicalPtr)
2642 : Type(TC, CanonicalPtr, OriginalTy->isDependentType(),
2643 OriginalTy->isInstantiationDependentType(),
2644 OriginalTy->isVariablyModifiedType(),
2645 OriginalTy->containsUnexpandedParameterPack()),
2646 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
2647
2648public:
2649 QualType getOriginalType() const { return OriginalTy; }
2650 QualType getAdjustedType() const { return AdjustedTy; }
2651
2652 bool isSugared() const { return true; }
2653 QualType desugar() const { return AdjustedTy; }
2654
2655 void Profile(llvm::FoldingSetNodeID &ID) {
2656 Profile(ID, OriginalTy, AdjustedTy);
2657 }
2658
2659 static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) {
2660 ID.AddPointer(Orig.getAsOpaquePtr());
2661 ID.AddPointer(New.getAsOpaquePtr());
2662 }
2663
2664 static bool classof(const Type *T) {
2665 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
2666 }
2667};
2668
2669/// Represents a pointer type decayed from an array or function type.
2670class DecayedType : public AdjustedType {
2671 friend class ASTContext; // ASTContext creates these.
2672
2673 inline
2674 DecayedType(QualType OriginalType, QualType Decayed, QualType Canonical);
2675
2676public:
2677 QualType getDecayedType() const { return getAdjustedType(); }
2678
2679 inline QualType getPointeeType() const;
2680
2681 static bool classof(const Type *T) { return T->getTypeClass() == Decayed; }
2682};
2683
2684/// Pointer to a block type.
2685/// This type is to represent types syntactically represented as
2686/// "void (^)(int)", etc. Pointee is required to always be a function type.
2687class BlockPointerType : public Type, public llvm::FoldingSetNode {
2688 friend class ASTContext; // ASTContext creates these.
2689
2690 // Block is some kind of pointer type
2691 QualType PointeeType;
2692
2693 BlockPointerType(QualType Pointee, QualType CanonicalCls)
2694 : Type(BlockPointer, CanonicalCls, Pointee->isDependentType(),
2695 Pointee->isInstantiationDependentType(),
2696 Pointee->isVariablyModifiedType(),
2697 Pointee->containsUnexpandedParameterPack()),
2698 PointeeType(Pointee) {}
2699
2700public:
2701 // Get the pointee type. Pointee is required to always be a function type.
2702 QualType getPointeeType() const { return PointeeType; }
2703
2704 bool isSugared() const { return false; }
2705 QualType desugar() const { return QualType(this, 0); }
2706
2707 void Profile(llvm::FoldingSetNodeID &ID) {
2708 Profile(ID, getPointeeType());
2709 }
2710
2711 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2712 ID.AddPointer(Pointee.getAsOpaquePtr());
2713 }
2714
2715 static bool classof(const Type *T) {
2716 return T->getTypeClass() == BlockPointer;
2717 }
2718};
2719
2720/// Base for LValueReferenceType and RValueReferenceType
2721class ReferenceType : public Type, public llvm::FoldingSetNode {
2722 QualType PointeeType;
2723
2724protected:
2725 ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef,
2726 bool SpelledAsLValue)
2727 : Type(tc, CanonicalRef, Referencee->isDependentType(),
2728 Referencee->isInstantiationDependentType(),
2729 Referencee->isVariablyModifiedType(),
2730 Referencee->containsUnexpandedParameterPack()),
2731 PointeeType(Referencee) {
2732 ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue;
2733 ReferenceTypeBits.InnerRef = Referencee->isReferenceType();
2734 }
2735
2736public:
2737 bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; }
2738 bool isInnerRef() const { return ReferenceTypeBits.InnerRef; }
2739
2740 QualType getPointeeTypeAsWritten() const { return PointeeType; }
2741
2742 QualType getPointeeType() const {
2743 // FIXME: this might strip inner qualifiers; okay?
2744 const ReferenceType *T = this;
2745 while (T->isInnerRef())
2746 T = T->PointeeType->castAs<ReferenceType>();
2747 return T->PointeeType;
2748 }
2749
2750 void Profile(llvm::FoldingSetNodeID &ID) {
2751 Profile(ID, PointeeType, isSpelledAsLValue());
2752 }
2753
2754 static void Profile(llvm::FoldingSetNodeID &ID,
2755 QualType Referencee,
2756 bool SpelledAsLValue) {
2757 ID.AddPointer(Referencee.getAsOpaquePtr());
2758 ID.AddBoolean(SpelledAsLValue);
2759 }
2760
2761 static bool classof(const Type *T) {
2762 return T->getTypeClass() == LValueReference ||
2763 T->getTypeClass() == RValueReference;
2764 }
2765};
2766
2767/// An lvalue reference type, per C++11 [dcl.ref].
2768class LValueReferenceType : public ReferenceType {
2769 friend class ASTContext; // ASTContext creates these
2770
2771 LValueReferenceType(QualType Referencee, QualType CanonicalRef,
2772 bool SpelledAsLValue)
2773 : ReferenceType(LValueReference, Referencee, CanonicalRef,
2774 SpelledAsLValue) {}
2775
2776public:
2777 bool isSugared() const { return false; }
2778 QualType desugar() const { return QualType(this, 0); }
2779
2780 static bool classof(const Type *T) {
2781 return T->getTypeClass() == LValueReference;
2782 }
2783};
2784
2785/// An rvalue reference type, per C++11 [dcl.ref].
2786class RValueReferenceType : public ReferenceType {
2787 friend class ASTContext; // ASTContext creates these
2788
2789 RValueReferenceType(QualType Referencee, QualType CanonicalRef)
2790 : ReferenceType(RValueReference, Referencee, CanonicalRef, false) {}
2791
2792public:
2793 bool isSugared() const { return false; }
2794 QualType desugar() const { return QualType(this, 0); }
2795
2796 static bool classof(const Type *T) {
2797 return T->getTypeClass() == RValueReference;
2798 }
2799};
2800
2801/// A pointer to member type per C++ 8.3.3 - Pointers to members.
2802///
2803/// This includes both pointers to data members and pointer to member functions.
2804class MemberPointerType : public Type, public llvm::FoldingSetNode {
2805 friend class ASTContext; // ASTContext creates these.
2806
2807 QualType PointeeType;
2808
2809 /// The class of which the pointee is a member. Must ultimately be a
2810 /// RecordType, but could be a typedef or a template parameter too.
2811 const Type *Class;
2812
2813 MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr)
2814 : Type(MemberPointer, CanonicalPtr,
2815 Cls->isDependentType() || Pointee->isDependentType(),
2816 (Cls->isInstantiationDependentType() ||
2817 Pointee->isInstantiationDependentType()),
2818 Pointee->isVariablyModifiedType(),
2819 (Cls->containsUnexpandedParameterPack() ||
2820 Pointee->containsUnexpandedParameterPack())),
2821 PointeeType(Pointee), Class(Cls) {}
2822
2823public:
2824 QualType getPointeeType() const { return PointeeType; }
2825
2826 /// Returns true if the member type (i.e. the pointee type) is a
2827 /// function type rather than a data-member type.
2828 bool isMemberFunctionPointer() const {
2829 return PointeeType->isFunctionProtoType();
2830 }
2831
2832 /// Returns true if the member type (i.e. the pointee type) is a
2833 /// data type rather than a function type.
2834 bool isMemberDataPointer() const {
2835 return !PointeeType->isFunctionProtoType();
2836 }
2837
2838 const Type *getClass() const { return Class; }
2839 CXXRecordDecl *getMostRecentCXXRecordDecl() const;
2840
2841 bool isSugared() const { return false; }
2842 QualType desugar() const { return QualType(this, 0); }
2843
2844 void Profile(llvm::FoldingSetNodeID &ID) {
2845 Profile(ID, getPointeeType(), getClass());
2846 }
2847
2848 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee,
2849 const Type *Class) {
2850 ID.AddPointer(Pointee.getAsOpaquePtr());
2851 ID.AddPointer(Class);
2852 }
2853
2854 static bool classof(const Type *T) {
2855 return T->getTypeClass() == MemberPointer;
2856 }
2857};
2858
2859/// Represents an array type, per C99 6.7.5.2 - Array Declarators.
2860class ArrayType : public Type, public llvm::FoldingSetNode {
2861public:
2862 /// Capture whether this is a normal array (e.g. int X[4])
2863 /// an array with a static size (e.g. int X[static 4]), or an array
2864 /// with a star size (e.g. int X[*]).
2865 /// 'static' is only allowed on function parameters.
2866 enum ArraySizeModifier {
2867 Normal, Static, Star
2868 };
2869
2870private:
2871 /// The element type of the array.
2872 QualType ElementType;
2873
2874protected:
2875 friend class ASTContext; // ASTContext creates these.
2876
2877 ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm,
2878 unsigned tq, const Expr *sz = nullptr);
2879
2880public:
2881 QualType getElementType() const { return ElementType; }
2882
2883 ArraySizeModifier getSizeModifier() const {
2884 return ArraySizeModifier(ArrayTypeBits.SizeModifier);
2885 }
2886
2887 Qualifiers getIndexTypeQualifiers() const {
2888 return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers());
2889 }
2890
2891 unsigned getIndexTypeCVRQualifiers() const {
2892 return ArrayTypeBits.IndexTypeQuals;
2893 }
2894
2895 static bool classof(const Type *T) {
2896 return T->getTypeClass() == ConstantArray ||
2897 T->getTypeClass() == VariableArray ||
2898 T->getTypeClass() == IncompleteArray ||
2899 T->getTypeClass() == DependentSizedArray;
2900 }
2901};
2902
2903/// Represents the canonical version of C arrays with a specified constant size.
2904/// For example, the canonical type for 'int A[4 + 4*100]' is a
2905/// ConstantArrayType where the element type is 'int' and the size is 404.
2906class ConstantArrayType final
2907 : public ArrayType,
2908 private llvm::TrailingObjects<ConstantArrayType, const Expr *> {
2909 friend class ASTContext; // ASTContext creates these.
2910 friend TrailingObjects;
2911
2912 llvm::APInt Size; // Allows us to unique the type.
2913
2914 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size,
2915 const Expr *sz, ArraySizeModifier sm, unsigned tq)
2916 : ArrayType(ConstantArray, et, can, sm, tq, sz), Size(size) {
2917 ConstantArrayTypeBits.HasStoredSizeExpr = sz != nullptr;
2918 if (ConstantArrayTypeBits.HasStoredSizeExpr) {
2919 assert(!can.isNull() && "canonical constant array should not have size")((!can.isNull() && "canonical constant array should not have size"
) ? static_cast<void> (0) : __assert_fail ("!can.isNull() && \"canonical constant array should not have size\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 2919, __PRETTY_FUNCTION__))
;
2920 *getTrailingObjects<const Expr*>() = sz;
2921 }
2922 }
2923
2924 unsigned numTrailingObjects(OverloadToken<const Expr*>) const {
2925 return ConstantArrayTypeBits.HasStoredSizeExpr;
2926 }
2927
2928public:
2929 const llvm::APInt &getSize() const { return Size; }
2930 const Expr *getSizeExpr() const {
2931 return ConstantArrayTypeBits.HasStoredSizeExpr
2932 ? *getTrailingObjects<const Expr *>()
2933 : nullptr;
2934 }
2935 bool isSugared() const { return false; }
2936 QualType desugar() const { return QualType(this, 0); }
2937
2938 /// Determine the number of bits required to address a member of
2939 // an array with the given element type and number of elements.
2940 static unsigned getNumAddressingBits(const ASTContext &Context,
2941 QualType ElementType,
2942 const llvm::APInt &NumElements);
2943
2944 /// Determine the maximum number of active bits that an array's size
2945 /// can require, which limits the maximum size of the array.
2946 static unsigned getMaxSizeBits(const ASTContext &Context);
2947
2948 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
2949 Profile(ID, Ctx, getElementType(), getSize(), getSizeExpr(),
2950 getSizeModifier(), getIndexTypeCVRQualifiers());
2951 }
2952
2953 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx,
2954 QualType ET, const llvm::APInt &ArraySize,
2955 const Expr *SizeExpr, ArraySizeModifier SizeMod,
2956 unsigned TypeQuals);
2957
2958 static bool classof(const Type *T) {
2959 return T->getTypeClass() == ConstantArray;
2960 }
2961};
2962
2963/// Represents a C array with an unspecified size. For example 'int A[]' has
2964/// an IncompleteArrayType where the element type is 'int' and the size is
2965/// unspecified.
2966class IncompleteArrayType : public ArrayType {
2967 friend class ASTContext; // ASTContext creates these.
2968
2969 IncompleteArrayType(QualType et, QualType can,
2970 ArraySizeModifier sm, unsigned tq)
2971 : ArrayType(IncompleteArray, et, can, sm, tq) {}
2972
2973public:
2974 friend class StmtIteratorBase;
2975
2976 bool isSugared() const { return false; }
2977 QualType desugar() const { return QualType(this, 0); }
2978
2979 static bool classof(const Type *T) {
2980 return T->getTypeClass() == IncompleteArray;
2981 }
2982
2983 void Profile(llvm::FoldingSetNodeID &ID) {
2984 Profile(ID, getElementType(), getSizeModifier(),
2985 getIndexTypeCVRQualifiers());
2986 }
2987
2988 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET,
2989 ArraySizeModifier SizeMod, unsigned TypeQuals) {
2990 ID.AddPointer(ET.getAsOpaquePtr());
2991 ID.AddInteger(SizeMod);
2992 ID.AddInteger(TypeQuals);
2993 }
2994};
2995
2996/// Represents a C array with a specified size that is not an
2997/// integer-constant-expression. For example, 'int s[x+foo()]'.
2998/// Since the size expression is an arbitrary expression, we store it as such.
2999///
3000/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and
3001/// should not be: two lexically equivalent variable array types could mean
3002/// different things, for example, these variables do not have the same type
3003/// dynamically:
3004///
3005/// void foo(int x) {
3006/// int Y[x];
3007/// ++x;
3008/// int Z[x];
3009/// }
3010class VariableArrayType : public ArrayType {
3011 friend class ASTContext; // ASTContext creates these.
3012
3013 /// An assignment-expression. VLA's are only permitted within
3014 /// a function block.
3015 Stmt *SizeExpr;
3016
3017 /// The range spanned by the left and right array brackets.
3018 SourceRange Brackets;
3019
3020 VariableArrayType(QualType et, QualType can, Expr *e,
3021 ArraySizeModifier sm, unsigned tq,
3022 SourceRange brackets)
3023 : ArrayType(VariableArray, et, can, sm, tq, e),
3024 SizeExpr((Stmt*) e), Brackets(brackets) {}
3025
3026public:
3027 friend class StmtIteratorBase;
3028
3029 Expr *getSizeExpr() const {
3030 // We use C-style casts instead of cast<> here because we do not wish
3031 // to have a dependency of Type.h on Stmt.h/Expr.h.
3032 return (Expr*) SizeExpr;
3033 }
3034
3035 SourceRange getBracketsRange() const { return Brackets; }
3036 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3037 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3038
3039 bool isSugared() const { return false; }
3040 QualType desugar() const { return QualType(this, 0); }
3041
3042 static bool classof(const Type *T) {
3043 return T->getTypeClass() == VariableArray;
3044 }
3045
3046 void Profile(llvm::FoldingSetNodeID &ID) {
3047 llvm_unreachable("Cannot unique VariableArrayTypes.")::llvm::llvm_unreachable_internal("Cannot unique VariableArrayTypes."
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 3047)
;
3048 }
3049};
3050
3051/// Represents an array type in C++ whose size is a value-dependent expression.
3052///
3053/// For example:
3054/// \code
3055/// template<typename T, int Size>
3056/// class array {
3057/// T data[Size];
3058/// };
3059/// \endcode
3060///
3061/// For these types, we won't actually know what the array bound is
3062/// until template instantiation occurs, at which point this will
3063/// become either a ConstantArrayType or a VariableArrayType.
3064class DependentSizedArrayType : public ArrayType {
3065 friend class ASTContext; // ASTContext creates these.
3066
3067 const ASTContext &Context;
3068
3069 /// An assignment expression that will instantiate to the
3070 /// size of the array.
3071 ///
3072 /// The expression itself might be null, in which case the array
3073 /// type will have its size deduced from an initializer.
3074 Stmt *SizeExpr;
3075
3076 /// The range spanned by the left and right array brackets.
3077 SourceRange Brackets;
3078
3079 DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can,
3080 Expr *e, ArraySizeModifier sm, unsigned tq,
3081 SourceRange brackets);
3082
3083public:
3084 friend class StmtIteratorBase;
3085
3086 Expr *getSizeExpr() const {
3087 // We use C-style casts instead of cast<> here because we do not wish
3088 // to have a dependency of Type.h on Stmt.h/Expr.h.
3089 return (Expr*) SizeExpr;
3090 }
3091
3092 SourceRange getBracketsRange() const { return Brackets; }
3093 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3094 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3095
3096 bool isSugared() const { return false; }
3097 QualType desugar() const { return QualType(this, 0); }
3098
3099 static bool classof(const Type *T) {
3100 return T->getTypeClass() == DependentSizedArray;
3101 }
3102
3103 void Profile(llvm::FoldingSetNodeID &ID) {
3104 Profile(ID, Context, getElementType(),
3105 getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr());
3106 }
3107
3108 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3109 QualType ET, ArraySizeModifier SizeMod,
3110 unsigned TypeQuals, Expr *E);
3111};
3112
3113/// Represents an extended address space qualifier where the input address space
3114/// value is dependent. Non-dependent address spaces are not represented with a
3115/// special Type subclass; they are stored on an ExtQuals node as part of a QualType.
3116///
3117/// For example:
3118/// \code
3119/// template<typename T, int AddrSpace>
3120/// class AddressSpace {
3121/// typedef T __attribute__((address_space(AddrSpace))) type;
3122/// }
3123/// \endcode
3124class DependentAddressSpaceType : public Type, public llvm::FoldingSetNode {
3125 friend class ASTContext;
3126
3127 const ASTContext &Context;
3128 Expr *AddrSpaceExpr;
3129 QualType PointeeType;
3130 SourceLocation loc;
3131
3132 DependentAddressSpaceType(const ASTContext &Context, QualType PointeeType,
3133 QualType can, Expr *AddrSpaceExpr,
3134 SourceLocation loc);
3135
3136public:
3137 Expr *getAddrSpaceExpr() const { return AddrSpaceExpr; }
3138 QualType getPointeeType() const { return PointeeType; }
3139 SourceLocation getAttributeLoc() const { return loc; }
3140
3141 bool isSugared() const { return false; }
3142 QualType desugar() const { return QualType(this, 0); }
3143
3144 static bool classof(const Type *T) {
3145 return T->getTypeClass() == DependentAddressSpace;
3146 }
3147
3148 void Profile(llvm::FoldingSetNodeID &ID) {
3149 Profile(ID, Context, getPointeeType(), getAddrSpaceExpr());
3150 }
3151
3152 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3153 QualType PointeeType, Expr *AddrSpaceExpr);
3154};
3155
3156/// Represents an extended vector type where either the type or size is
3157/// dependent.
3158///
3159/// For example:
3160/// \code
3161/// template<typename T, int Size>
3162/// class vector {
3163/// typedef T __attribute__((ext_vector_type(Size))) type;
3164/// }
3165/// \endcode
3166class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode {
3167 friend class ASTContext;
3168
3169 const ASTContext &Context;
3170 Expr *SizeExpr;
3171
3172 /// The element type of the array.
3173 QualType ElementType;
3174
3175 SourceLocation loc;
3176
3177 DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType,
3178 QualType can, Expr *SizeExpr, SourceLocation loc);
3179
3180public:
3181 Expr *getSizeExpr() const { return SizeExpr; }
3182 QualType getElementType() const { return ElementType; }
3183 SourceLocation getAttributeLoc() const { return loc; }
3184
3185 bool isSugared() const { return false; }
3186 QualType desugar() const { return QualType(this, 0); }
3187
3188 static bool classof(const Type *T) {
3189 return T->getTypeClass() == DependentSizedExtVector;
3190 }
3191
3192 void Profile(llvm::FoldingSetNodeID &ID) {
3193 Profile(ID, Context, getElementType(), getSizeExpr());
3194 }
3195
3196 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3197 QualType ElementType, Expr *SizeExpr);
3198};
3199
3200
3201/// Represents a GCC generic vector type. This type is created using
3202/// __attribute__((vector_size(n)), where "n" specifies the vector size in
3203/// bytes; or from an Altivec __vector or vector declaration.
3204/// Since the constructor takes the number of vector elements, the
3205/// client is responsible for converting the size into the number of elements.
3206class VectorType : public Type, public llvm::FoldingSetNode {
3207public:
3208 enum VectorKind {
3209 /// not a target-specific vector type
3210 GenericVector,
3211
3212 /// is AltiVec vector
3213 AltiVecVector,
3214
3215 /// is AltiVec 'vector Pixel'
3216 AltiVecPixel,
3217
3218 /// is AltiVec 'vector bool ...'
3219 AltiVecBool,
3220
3221 /// is ARM Neon vector
3222 NeonVector,
3223
3224 /// is ARM Neon polynomial vector
3225 NeonPolyVector
3226 };
3227
3228protected:
3229 friend class ASTContext; // ASTContext creates these.
3230
3231 /// The element type of the vector.
3232 QualType ElementType;
3233
3234 VectorType(QualType vecType, unsigned nElements, QualType canonType,
3235 VectorKind vecKind);
3236
3237 VectorType(TypeClass tc, QualType vecType, unsigned nElements,
3238 QualType canonType, VectorKind vecKind);
3239
3240public:
3241 QualType getElementType() const { return ElementType; }
3242 unsigned getNumElements() const { return VectorTypeBits.NumElements; }
3243
3244 static bool isVectorSizeTooLarge(unsigned NumElements) {
3245 return NumElements > VectorTypeBitfields::MaxNumElements;
3246 }
3247
3248 bool isSugared() const { return false; }
3249 QualType desugar() const { return QualType(this, 0); }
3250
3251 VectorKind getVectorKind() const {
3252 return VectorKind(VectorTypeBits.VecKind);
3253 }
3254
3255 void Profile(llvm::FoldingSetNodeID &ID) {
3256 Profile(ID, getElementType(), getNumElements(),
3257 getTypeClass(), getVectorKind());
3258 }
3259
3260 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
3261 unsigned NumElements, TypeClass TypeClass,
3262 VectorKind VecKind) {
3263 ID.AddPointer(ElementType.getAsOpaquePtr());
3264 ID.AddInteger(NumElements);
3265 ID.AddInteger(TypeClass);
3266 ID.AddInteger(VecKind);
3267 }
3268
3269 static bool classof(const Type *T) {
3270 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector;
3271 }
3272};
3273
3274/// Represents a vector type where either the type or size is dependent.
3275////
3276/// For example:
3277/// \code
3278/// template<typename T, int Size>
3279/// class vector {
3280/// typedef T __attribute__((vector_size(Size))) type;
3281/// }
3282/// \endcode
3283class DependentVectorType : public Type, public llvm::FoldingSetNode {
3284 friend class ASTContext;
3285
3286 const ASTContext &Context;
3287 QualType ElementType;
3288 Expr *SizeExpr;
3289 SourceLocation Loc;
3290
3291 DependentVectorType(const ASTContext &Context, QualType ElementType,
3292 QualType CanonType, Expr *SizeExpr,
3293 SourceLocation Loc, VectorType::VectorKind vecKind);
3294
3295public:
3296 Expr *getSizeExpr() const { return SizeExpr; }
3297 QualType getElementType() const { return ElementType; }
3298 SourceLocation getAttributeLoc() const { return Loc; }
3299 VectorType::VectorKind getVectorKind() const {
3300 return VectorType::VectorKind(VectorTypeBits.VecKind);
3301 }
3302
3303 bool isSugared() const { return false; }
3304 QualType desugar() const { return QualType(this, 0); }
3305
3306 static bool classof(const Type *T) {
3307 return T->getTypeClass() == DependentVector;
3308 }
3309
3310 void Profile(llvm::FoldingSetNodeID &ID) {
3311 Profile(ID, Context, getElementType(), getSizeExpr(), getVectorKind());
3312 }
3313
3314 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3315 QualType ElementType, const Expr *SizeExpr,
3316 VectorType::VectorKind VecKind);
3317};
3318
3319/// ExtVectorType - Extended vector type. This type is created using
3320/// __attribute__((ext_vector_type(n)), where "n" is the number of elements.
3321/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This
3322/// class enables syntactic extensions, like Vector Components for accessing
3323/// points (as .xyzw), colors (as .rgba), and textures (modeled after OpenGL
3324/// Shading Language).
3325class ExtVectorType : public VectorType {
3326 friend class ASTContext; // ASTContext creates these.
3327
3328 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType)
3329 : VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {}
3330
3331public:
3332 static int getPointAccessorIdx(char c) {
3333 switch (c) {
3334 default: return -1;
3335 case 'x': case 'r': return 0;
3336 case 'y': case 'g': return 1;
3337 case 'z': case 'b': return 2;
3338 case 'w': case 'a': return 3;
3339 }
3340 }
3341
3342 static int getNumericAccessorIdx(char c) {
3343 switch (c) {
3344 default: return -1;
3345 case '0': return 0;
3346 case '1': return 1;
3347 case '2': return 2;
3348 case '3': return 3;
3349 case '4': return 4;
3350 case '5': return 5;
3351 case '6': return 6;
3352 case '7': return 7;
3353 case '8': return 8;
3354 case '9': return 9;
3355 case 'A':
3356 case 'a': return 10;
3357 case 'B':
3358 case 'b': return 11;
3359 case 'C':
3360 case 'c': return 12;
3361 case 'D':
3362 case 'd': return 13;
3363 case 'E':
3364 case 'e': return 14;
3365 case 'F':
3366 case 'f': return 15;
3367 }
3368 }
3369
3370 static int getAccessorIdx(char c, bool isNumericAccessor) {
3371 if (isNumericAccessor)
3372 return getNumericAccessorIdx(c);
3373 else
3374 return getPointAccessorIdx(c);
3375 }
3376
3377 bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const {
3378 if (int idx = getAccessorIdx(c, isNumericAccessor)+1)
3379 return unsigned(idx-1) < getNumElements();
3380 return false;
3381 }
3382
3383 bool isSugared() const { return false; }
3384 QualType desugar() const { return QualType(this, 0); }
3385
3386 static bool classof(const Type *T) {
3387 return T->getTypeClass() == ExtVector;
3388 }
3389};
3390
3391/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base
3392/// class of FunctionNoProtoType and FunctionProtoType.
3393class FunctionType : public Type {
3394 // The type returned by the function.
3395 QualType ResultType;
3396
3397public:
3398 /// Interesting information about a specific parameter that can't simply
3399 /// be reflected in parameter's type. This is only used by FunctionProtoType
3400 /// but is in FunctionType to make this class available during the
3401 /// specification of the bases of FunctionProtoType.
3402 ///
3403 /// It makes sense to model language features this way when there's some
3404 /// sort of parameter-specific override (such as an attribute) that
3405 /// affects how the function is called. For example, the ARC ns_consumed
3406 /// attribute changes whether a parameter is passed at +0 (the default)
3407 /// or +1 (ns_consumed). This must be reflected in the function type,
3408 /// but isn't really a change to the parameter type.
3409 ///
3410 /// One serious disadvantage of modelling language features this way is
3411 /// that they generally do not work with language features that attempt
3412 /// to destructure types. For example, template argument deduction will
3413 /// not be able to match a parameter declared as
3414 /// T (*)(U)
3415 /// against an argument of type
3416 /// void (*)(__attribute__((ns_consumed)) id)
3417 /// because the substitution of T=void, U=id into the former will
3418 /// not produce the latter.
3419 class ExtParameterInfo {
3420 enum {
3421 ABIMask = 0x0F,
3422 IsConsumed = 0x10,
3423 HasPassObjSize = 0x20,
3424 IsNoEscape = 0x40,
3425 };
3426 unsigned char Data = 0;
3427
3428 public:
3429 ExtParameterInfo() = default;
3430
3431 /// Return the ABI treatment of this parameter.
3432 ParameterABI getABI() const { return ParameterABI(Data & ABIMask); }
3433 ExtParameterInfo withABI(ParameterABI kind) const {
3434 ExtParameterInfo copy = *this;
3435 copy.Data = (copy.Data & ~ABIMask) | unsigned(kind);
3436 return copy;
3437 }
3438
3439 /// Is this parameter considered "consumed" by Objective-C ARC?
3440 /// Consumed parameters must have retainable object type.
3441 bool isConsumed() const { return (Data & IsConsumed); }
3442 ExtParameterInfo withIsConsumed(bool consumed) const {
3443 ExtParameterInfo copy = *this;
3444 if (consumed)
3445 copy.Data |= IsConsumed;
3446 else
3447 copy.Data &= ~IsConsumed;
3448 return copy;
3449 }
3450
3451 bool hasPassObjectSize() const { return Data & HasPassObjSize; }
3452 ExtParameterInfo withHasPassObjectSize() const {
3453 ExtParameterInfo Copy = *this;
3454 Copy.Data |= HasPassObjSize;
3455 return Copy;
3456 }
3457
3458 bool isNoEscape() const { return Data & IsNoEscape; }
3459 ExtParameterInfo withIsNoEscape(bool NoEscape) const {
3460 ExtParameterInfo Copy = *this;
3461 if (NoEscape)
3462 Copy.Data |= IsNoEscape;
3463 else
3464 Copy.Data &= ~IsNoEscape;
3465 return Copy;
3466 }
3467
3468 unsigned char getOpaqueValue() const { return Data; }
3469 static ExtParameterInfo getFromOpaqueValue(unsigned char data) {
3470 ExtParameterInfo result;
3471 result.Data = data;
3472 return result;
3473 }
3474
3475 friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3476 return lhs.Data == rhs.Data;
3477 }
3478
3479 friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3480 return lhs.Data != rhs.Data;
3481 }
3482 };
3483
3484 /// A class which abstracts out some details necessary for
3485 /// making a call.
3486 ///
3487 /// It is not actually used directly for storing this information in
3488 /// a FunctionType, although FunctionType does currently use the
3489 /// same bit-pattern.
3490 ///
3491 // If you add a field (say Foo), other than the obvious places (both,
3492 // constructors, compile failures), what you need to update is
3493 // * Operator==
3494 // * getFoo
3495 // * withFoo
3496 // * functionType. Add Foo, getFoo.
3497 // * ASTContext::getFooType
3498 // * ASTContext::mergeFunctionTypes
3499 // * FunctionNoProtoType::Profile
3500 // * FunctionProtoType::Profile
3501 // * TypePrinter::PrintFunctionProto
3502 // * AST read and write
3503 // * Codegen
3504 class ExtInfo {
3505 friend class FunctionType;
3506
3507 // Feel free to rearrange or add bits, but if you go over 12,
3508 // you'll need to adjust both the Bits field below and
3509 // Type::FunctionTypeBitfields.
3510
3511 // | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck|
3512 // |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 |
3513 //
3514 // regparm is either 0 (no regparm attribute) or the regparm value+1.
3515 enum { CallConvMask = 0x1F };
3516 enum { NoReturnMask = 0x20 };
3517 enum { ProducesResultMask = 0x40 };
3518 enum { NoCallerSavedRegsMask = 0x80 };
3519 enum { NoCfCheckMask = 0x800 };
3520 enum {
3521 RegParmMask = ~(CallConvMask | NoReturnMask | ProducesResultMask |
3522 NoCallerSavedRegsMask | NoCfCheckMask),
3523 RegParmOffset = 8
3524 }; // Assumed to be the last field
3525 uint16_t Bits = CC_C;
3526
3527 ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
3528
3529 public:
3530 // Constructor with no defaults. Use this when you know that you
3531 // have all the elements (when reading an AST file for example).
3532 ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc,
3533 bool producesResult, bool noCallerSavedRegs, bool NoCfCheck) {
3534 assert((!hasRegParm || regParm < 7) && "Invalid regparm value")(((!hasRegParm || regParm < 7) && "Invalid regparm value"
) ? static_cast<void> (0) : __assert_fail ("(!hasRegParm || regParm < 7) && \"Invalid regparm value\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 3534, __PRETTY_FUNCTION__))
;
3535 Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) |
3536 (producesResult ? ProducesResultMask : 0) |
3537 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
3538 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
3539 (NoCfCheck ? NoCfCheckMask : 0);
3540 }
3541
3542 // Constructor with all defaults. Use when for example creating a
3543 // function known to use defaults.
3544 ExtInfo() = default;
3545
3546 // Constructor with just the calling convention, which is an important part
3547 // of the canonical type.
3548 ExtInfo(CallingConv CC) : Bits(CC) {}
3549
3550 bool getNoReturn() const { return Bits & NoReturnMask; }
3551 bool getProducesResult() const { return Bits & ProducesResultMask; }
3552 bool getNoCallerSavedRegs() const { return Bits & NoCallerSavedRegsMask; }
3553 bool getNoCfCheck() const { return Bits & NoCfCheckMask; }
3554 bool getHasRegParm() const { return (Bits >> RegParmOffset) != 0; }
3555
3556 unsigned getRegParm() const {
3557 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
3558 if (RegParm > 0)
3559 --RegParm;
3560 return RegParm;
3561 }
3562
3563 CallingConv getCC() const { return CallingConv(Bits & CallConvMask); }
3564
3565 bool operator==(ExtInfo Other) const {
3566 return Bits == Other.Bits;
3567 }
3568 bool operator!=(ExtInfo Other) const {
3569 return Bits != Other.Bits;
3570 }
3571
3572 // Note that we don't have setters. That is by design, use
3573 // the following with methods instead of mutating these objects.
3574
3575 ExtInfo withNoReturn(bool noReturn) const {
3576 if (noReturn)
3577 return ExtInfo(Bits | NoReturnMask);
3578 else
3579 return ExtInfo(Bits & ~NoReturnMask);
3580 }
3581
3582 ExtInfo withProducesResult(bool producesResult) const {
3583 if (producesResult)
3584 return ExtInfo(Bits | ProducesResultMask);
3585 else
3586 return ExtInfo(Bits & ~ProducesResultMask);
3587 }
3588
3589 ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const {
3590 if (noCallerSavedRegs)
3591 return ExtInfo(Bits | NoCallerSavedRegsMask);
3592 else
3593 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
3594 }
3595
3596 ExtInfo withNoCfCheck(bool noCfCheck) const {
3597 if (noCfCheck)
3598 return ExtInfo(Bits | NoCfCheckMask);
3599 else
3600 return ExtInfo(Bits & ~NoCfCheckMask);
3601 }
3602
3603 ExtInfo withRegParm(unsigned RegParm) const {
3604 assert(RegParm < 7 && "Invalid regparm value")((RegParm < 7 && "Invalid regparm value") ? static_cast
<void> (0) : __assert_fail ("RegParm < 7 && \"Invalid regparm value\""
, "/build/llvm-toolchain-snapshot-10~+201911111502510600c19528f1809/clang/include/clang/AST/Type.h"
, 3604, __PRETTY_FUNCTION__))
;
3605 return ExtInfo((Bits & ~RegParmMask) |
3606 ((RegParm + 1) << RegParmOffset));
3607 }
3608
3609 ExtInfo withCallingConv(CallingConv cc) const {
3610 return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc);
3611 }
3612
3613 void Profile(llvm::FoldingSetNodeID &ID) const {
3614 ID.AddInteger(Bits);
3615 }
3616 };
3617
3618 /// A simple holder for a QualType representing a type in an
3619 /// exception specification. Unfortunately needed by FunctionProtoType
3620 /// because TrailingObjects cannot handle repeated types.
3621 struct ExceptionType { QualType Type; };
3622
3623 /// A simple holder for various uncommon bits which do not fit in
3624 /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the
3625 /// alignment of subsequent objects in TrailingObjects. You must update
3626 /// hasExtraBitfields in FunctionProtoType after adding extra data here.
3627 struct alignas(void *) FunctionTypeExtraBitfields {
3628 /// The number of types in the exception specification.
3629 /// A whole unsigned is not needed here and according to
3630 /// [implimits] 8 bits would be enough here.
3631 unsigned NumExceptionType;
3632 };
3633
3634protected:
3635 FunctionType(TypeClass tc, QualType res,
3636 QualType Canonical, bool Dependent,
3637 bool InstantiationDependent,
3638 bool VariablyModified, bool ContainsUnexpandedParameterPack,
3639 ExtInfo Info)
3640 : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified,
3641 ContainsUnexpandedParameterPack),
3642 ResultType(res) {
3643 FunctionTypeBits.ExtInfo = Info.Bits;
3644 }
3645
3646 Qualifiers getFastTypeQuals() const {
3647 return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals);
3648 }
3649
3650public:
3651 QualType getReturnType() const { return ResultType; }
3652
3653 bool getHasRegParm() const { return getExtInfo().getHasRegParm(); }
3654 unsigned getRegParmType() const { return getExtInfo().getRegParm(); }
3655
3656 /// Determine whether this function type includes the GNU noreturn
3657 /// attribute. The C++11 [[noreturn]] attribute does not affect the function
3658 /// type.
3659 bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); }
3660
3661 CallingConv getCallConv() const { return getExtInfo().getCC(); }
3662 ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); }
3663
3664 static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0,
3665 "Const, volatile and restrict are assumed to be a subset of "
3666 "the fast qualifiers.");
3667
3668 bool isConst() const { return getFastTypeQuals().hasConst(); }
3669 bool isVolatile() const { return getFastTypeQuals().hasVolatile(); }
3670 bool isRestrict() const { return getFastTypeQuals().hasRestrict(); }
3671
3672 /// Determine the type of an expression that calls a function of
3673 /// this type.
3674 QualType getCallResultType(const ASTContext &Context) const {
3675 return getReturnType().getNonLValueExprType(Context);
3676 }
3677
3678 static StringRef getNameForCallConv(CallingConv CC);
3679
3680 static bool classof(const Type *T) {
3681 return T->getTypeClass() == FunctionNoProto ||
3682