24bool hasPublicMethodInBaseClass(
const CXXRecordDecl *R, StringRef NameToMatch) {
30 if (MethodName == NameToMatch && MD->getAccess() ==
AS_public)
40std::optional<const clang::CXXRecordDecl *>
44 const Type *
T =
Base->getType().getTypePtrOrNull();
50 auto CT =
Base->getType().getCanonicalType();
51 if (
auto *TST = dyn_cast<TemplateSpecializationType>(CT)) {
52 auto TmplName = TST->getTemplateName();
53 if (!TmplName.isNull()) {
54 if (
auto *TD = TmplName.getAsTemplateDecl())
55 R = dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl());
64 return hasPublicMethodInBaseClass(R, NameToMatch) ? R :
nullptr;
68 StringRef IncMethodName,
69 StringRef DecMethodName) {
76 bool hasRef = hasPublicMethodInBaseClass(R, IncMethodName);
77 bool hasDeref = hasPublicMethodInBaseClass(R, DecMethodName);
78 if (hasRef && hasDeref)
84 bool AnyInconclusiveBase =
false;
89 AnyInconclusiveBase =
true;
92 return (*hasRefInBase) !=
nullptr;
95 hasRef = hasRef || R->
lookupInBases(hasPublicRefInBase, Paths,
97 if (AnyInconclusiveBase)
104 if (!hasDerefInBase) {
105 AnyInconclusiveBase =
true;
108 return (*hasDerefInBase) !=
nullptr;
110 hasDeref = hasDeref || R->
lookupInBases(hasPublicDerefInBase, Paths,
112 if (AnyInconclusiveBase)
115 return hasRef && hasDeref;
124 "decrementCheckedPtrCount");
128 return Name ==
"Ref" || Name ==
"RefAllowingPartiallyDestroyed" ||
129 Name ==
"RefPtr" || Name ==
"RefPtrAllowingPartiallyDestroyed";
133 return Name ==
"RetainPtr" || Name ==
"RetainPtrArc";
137 return Name ==
"CheckedPtr" || Name ==
"CheckedRef";
142 Name ==
"WeakPtr" || Name ==
"WeakPtrFactory" ||
143 Name ==
"WeakPtrFactoryWithBitField" || Name ==
"WeakPtrImplBase" ||
144 Name ==
"WeakPtrImplBaseSingleThread" || Name ==
"ThreadSafeWeakPtr" ||
145 Name ==
"ThreadSafeWeakOrStrongPtr" ||
146 Name ==
"ThreadSafeWeakPtrControlBlock" ||
147 Name ==
"ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr";
154 return isRefType(FunctionName) || FunctionName ==
"adoptRef" ||
155 FunctionName ==
"UniqueRef" || FunctionName ==
"makeUniqueRef" ||
156 FunctionName ==
"makeUniqueRefWithoutFastMallocCheck"
158 || FunctionName ==
"String" || FunctionName ==
"AtomString" ||
159 FunctionName ==
"UniqueString"
161 || FunctionName ==
"Identifier";
171 return FunctionName ==
"RetainPtr" || FunctionName ==
"adoptNS" ||
172 FunctionName ==
"adoptCF" || FunctionName ==
"retainPtr" ||
173 FunctionName ==
"RetainPtrArc" || FunctionName ==
"adoptNSArc";
180template <
typename Predicate>
183 while (!
type.isNull()) {
185 auto *
Decl = SpecialT->getTemplateName().getAsTemplateDecl();
186 return Decl && Pred(
Decl->getNameAsString());
188 auto *
Decl = DTS->getTemplateName().getAsTemplateDecl();
189 return Decl && Pred(
Decl->getNameAsString());
208 Name ==
"UniqueRef" || Name ==
"LazyUniqueRef";
213 if (
auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
T)) {
214 if (
auto *
Decl = Subst->getAssociatedDecl()) {
223 if (
auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
T)) {
224 if (
auto *
Decl = Subst->getAssociatedDecl()) {
234 IsARCEnabled = TUD->
getLangOpts().ObjCAutoRefCount;
235 DefaultSynthProperties = TUD->
getLangOpts().ObjCDefaultSynthProperties;
240 if (!QT->isPointerType())
246 if (TD->
hasAttr<ObjCBridgeAttr>() || TD->
hasAttr<ObjCBridgeMutableAttr>()) {
256 if (Redecl->getAttr<ObjCBridgeAttr>() ||
257 Redecl->getAttr<ObjCBridgeMutableAttr>()) {
258 CFPointees.insert(RT);
267 if (
auto *RT = dyn_cast_or_null<RecordType>(
269 return CFPointees.contains(RT);
270 return RecordlessTypes.contains(QT.
getTypePtr());
274 if (
auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
T)) {
275 if (
auto *
Decl = Subst->getAssociatedDecl()) {
285 auto CanonicalType =
T.getCanonicalType();
286 auto *
Type = CanonicalType.getTypePtrOrNull();
314 return (*IsRefCountable);
345 std::optional<bool> result;
351 result = result ? *result || *isUnretainedPtr : *isUnretainedPtr;
361 if (isa<CXXMethodDecl>(M)) {
366 if (
isCheckedPtr(className) && (method ==
"get" || method ==
"ptr"))
369 if ((
isRefType(className) && (method ==
"get" || method ==
"ptr")) ||
370 ((className ==
"String" || className ==
"AtomString" ||
371 className ==
"AtomStringImpl" || className ==
"UniqueString" ||
372 className ==
"UniqueStringImpl" || className ==
"Identifier") &&
382 if (
auto *maybeRefToRawOperator = dyn_cast<CXXConversionDecl>(M)) {
383 auto QT = maybeRefToRawOperator->getConversionType();
384 auto *
T = QT.getTypePtrOrNull();
390 if (
auto *maybeRefToRawOperator = dyn_cast<CXXConversionDecl>(M)) {
391 auto QT = maybeRefToRawOperator->getConversionType();
392 auto *
T = QT.getTypePtrOrNull();
398 if (
auto *maybeRefToRawOperator = dyn_cast<CXXConversionDecl>(M)) {
399 auto QT = maybeRefToRawOperator->getConversionType();
400 auto *
T = QT.getTypePtrOrNull();
449 if (FunctionName ==
"getPtr" || FunctionName ==
"WeakPtr" ||
450 FunctionName ==
"dynamicDowncast" || FunctionName ==
"downcast" ||
451 FunctionName ==
"checkedDowncast" || FunctionName ==
"bit_cast" ||
452 FunctionName ==
"uncheckedDowncast" || FunctionName ==
"bitwise_cast" ||
453 FunctionName ==
"bridge_cast" || FunctionName ==
"bridge_id_cast" ||
454 FunctionName ==
"dynamic_cf_cast" || FunctionName ==
"checked_cf_cast" ||
455 FunctionName ==
"dynamic_objc_cast" ||
456 FunctionName ==
"checked_objc_cast")
460 if (
auto *
Type = ReturnType.getTypePtrOrNull()) {
461 if (
auto *AttrType = dyn_cast<AttributedType>(
Type)) {
462 if (
auto *
Attr = AttrType->getAttr()) {
463 if (
auto *AnnotateType = dyn_cast<AnnotateTypeAttr>(
Attr)) {
464 if (AnnotateType->getAnnotation() ==
"webkit.pointerconversion")
478 return Name.starts_with(
"__builtin") || Name ==
"__libcpp_verbose_abort" ||
479 Name.starts_with(
"os_log") || Name.starts_with(
"_os_log");
485 if (
auto *MethodDecl = dyn_cast<CXXMethodDecl>(F)) {
486 if (!MethodDecl->isStatic())
490 StringRef Name = NameStr;
491 return Name ==
"singleton" || Name.ends_with(
"Singleton");
500 bool VisitChildren(
const Stmt *S) {
501 for (
const Stmt *Child : S->children()) {
502 if (Child && !
Visit(Child))
509 template <
typename StmtOrDecl,
typename CheckFunction>
510 bool WithCachedResult(
const StmtOrDecl *S, CheckFunction
Function) {
511 auto CacheIt =
Cache.find(S);
512 if (CacheIt !=
Cache.end())
513 return CacheIt->second;
516 auto [RecursiveIt, IsNew] = RecursiveFn.insert(std::make_pair(S,
true));
518 return RecursiveIt->second;
523 for (
auto &It : RecursiveFn)
526 RecursiveIt = RecursiveFn.find(S);
527 assert(RecursiveIt != RecursiveFn.end());
528 Result = RecursiveIt->second;
529 RecursiveFn.erase(RecursiveIt);
536 using CacheTy = TrivialFunctionAnalysis::CacheTy;
541 if (
auto *FnDecl = dyn_cast<FunctionDecl>(
D)) {
542 if (FnDecl->isVirtualAsWritten())
545 return WithCachedResult(
D, [&]() {
546 if (
auto *CtorDecl = dyn_cast<CXXConstructorDecl>(
D)) {
547 for (
auto *CtorInit : CtorDecl->inits()) {
548 if (!Visit(CtorInit->getInit()))
573 return WithCachedResult(CS, [&]() {
return VisitChildren(CS); });
586 return WithCachedResult(IS, [&]() {
return VisitChildren(IS); });
589 return WithCachedResult(FS, [&]() {
return VisitChildren(FS); });
592 return WithCachedResult(FS, [&]() {
return VisitChildren(FS); });
595 return WithCachedResult(WS, [&]() {
return VisitChildren(WS); });
620 return VisitChildren(CAO);
624 return VisitChildren(ASE);
629 return VisitChildren(CO);
652 if (Callee->isInStdNamespace() &&
653 (Name ==
"addressof" || Name ==
"forward" || Name ==
"move"))
656 if (Name ==
"WTFCrashWithInfo" || Name ==
"WTFBreakpointTrap" ||
657 Name ==
"WTFReportBacktrace" ||
658 Name ==
"WTFCrashWithSecurityImplication" || Name ==
"WTFCrash" ||
659 Name ==
"WTFReportAssertionFailure" || Name ==
"isMainThread" ||
660 Name ==
"isMainThreadOrGCThread" || Name ==
"isMainRunLoop" ||
661 Name ==
"isWebThread" || Name ==
"isUIThread" ||
662 Name ==
"mayBeGCThread" || Name ==
"compilerFenceForCrash" ||
676 return VisitChildren(
E);
702 if (Name ==
"ref" || Name ==
"incrementCheckedPtrCount")
706 if (IsGetterOfRefCounted && *IsGetterOfRefCounted)
724 if (
auto *
Expr =
E->getExpr()) {
733 if (Arg && !
Visit(Arg))
741 if (Arg && !
Visit(Arg))
769 if (!TrivialFunctionAnalysis::isTrivialImpl(Temp->getDestructor(),
Cache))
796 if (Child && !
Visit(Child))
845bool TrivialFunctionAnalysis::isTrivialImpl(
846 const Decl *
D, TrivialFunctionAnalysis::CacheTy &
Cache) {
848 return V.IsFunctionTrivial(
D);
851bool TrivialFunctionAnalysis::isTrivialImpl(
852 const Stmt *S, TrivialFunctionAnalysis::CacheTy &
Cache) {
855 assert(
Cache.contains(S) &&
"Top-level statement not properly cached!");
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Record Record
QualType getTypedefType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypedefNameDecl *Decl, QualType UnderlyingType=QualType(), std::optional< bool > TypeMatchesDeclOrNone=std::nullopt) const
Return the unique reference to the type for the specified typedef-name decl.
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
OpaqueValueExpr * getCommonExpr() const
Get the common subexpression shared by all initializations (the source array).
Expr * getSubExpr() const
Get the initializer to use for each array element.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Attr - This represents one attribute.
Represents an attribute applied to a statement.
A builtin binary operation expression such as "x + y" or "x <= y".
BreakStmt - This represents a break.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
const Expr * getSubExpr() const
A boolean literal, per ([C++ lex.bool] Boolean literals).
Represents a call to a C++ constructor.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
A default argument (C++ [dcl.fct.default]).
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Expr * getImplicitObjectArgument() const
Retrieve the implicit object argument for the member call.
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
The null pointer literal (C++11 [lex.nullptr])
A call to an overloaded operator written using operator syntax.
Represents a C++ struct/union/class.
method_range methods() const
CXXRecordDecl * getDefinition() const
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool hasDefinition() const
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
CaseStmt - Represent a case statement.
CompoundAssignOperator - For compound assignments (e.g.
CompoundStmt - This represents a group of statements like { stmt stmt }.
ConditionalOperator - The ?: ternary operator.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
ContinueStmt - This represents a continue.
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a C++17 deduced template specialization type.
DoStmt - This represents a 'do/while' stmt.
ExplicitCastExpr - An explicit cast written in the source code.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
ForStmt - This represents a 'for (init;cond;inc)' stmt.
const Expr * getSubExpr() const
Represents a function declaration or definition.
QualType getReturnType() const
GotoStmt - This represents a direct goto.
IfStmt - This represents an if/then/else.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Represents an implicitly-generated value initialization of an object of a given type.
Describes an C or C++ initializer list.
ArrayRef< Expr * > inits()
LabelStmt - Represents a label, which has a substatement.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
ParenExpr - This represents a parenthesized expression, e.g.
const Expr * getSubExpr() const
[C99 6.4.2.2] - A predefined identifier such as func.
A (possibly-)qualified type.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType getCanonicalType() const
const Type * getTypePtrOrNull() const
RecordDecl * getMostRecentDecl()
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getOriginalDecl() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool isUnretained(const QualType, bool ignoreARC=false)
void visitTranslationUnitDecl(const TranslationUnitDecl *)
void visitTypedef(const TypedefDecl *)
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Represents a C++11 static_assert declaration.
RetTy Visit(PTR(Stmt) S, ParamTys... P)
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
Represents a reference to a non-type template parameter that has been substituted with a template arg...
SwitchStmt - This represents a 'switch' stmt.
Represents a type template specialization; the template must be a class template, a type alias templa...
The top declaration context.
bool VisitMemberExpr(const MemberExpr *ME)
TrivialFunctionAnalysisVisitor(CacheTy &Cache)
bool VisitStringLiteral(const StringLiteral *E)
bool VisitStaticAssertDecl(const StaticAssertDecl *SAD)
bool VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *BTE)
bool VisitBreakStmt(const BreakStmt *)
bool VisitCXXThisExpr(const CXXThisExpr *CTE)
bool IsFunctionTrivial(const Decl *D)
bool VisitLabelStmt(const LabelStmt *)
bool VisitUnaryOperator(const UnaryOperator *UO)
bool VisitArrayInitLoopExpr(const ArrayInitLoopExpr *AILE)
bool VisitPredefinedExpr(const PredefinedExpr *E)
bool VisitContinueStmt(const ContinueStmt *)
bool VisitSwitchStmt(const SwitchStmt *SS)
bool VisitCompoundAssignOperator(const CompoundAssignOperator *CAO)
bool VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E)
bool VisitFixedPointLiteral(const FixedPointLiteral *E)
bool VisitDeclRefExpr(const DeclRefExpr *DRE)
bool VisitDoStmt(const DoStmt *DS)
bool VisitIfStmt(const IfStmt *IS)
bool VisitIntegerLiteral(const IntegerLiteral *E)
bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *VMT)
bool VisitCXXInheritedCtorInitExpr(const CXXInheritedCtorInitExpr *E)
bool VisitFloatingLiteral(const FloatingLiteral *E)
TrivialFunctionAnalysis::CacheTy CacheTy
bool VisitCaseStmt(const CaseStmt *CS)
bool VisitDeclStmt(const DeclStmt *DS)
bool VisitConditionalOperator(const ConditionalOperator *CO)
bool VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E)
bool VisitCompoundStmt(const CompoundStmt *CS)
bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *IVIE)
bool VisitConstantExpr(const ConstantExpr *CE)
bool VisitImplicitCastExpr(const ImplicitCastExpr *ICE)
bool VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *OCE)
bool VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E)
bool VisitOpaqueValueExpr(const OpaqueValueExpr *OVE)
bool VisitExprWithCleanups(const ExprWithCleanups *EWC)
bool VisitArraySubscriptExpr(const ArraySubscriptExpr *ASE)
bool VisitCallExpr(const CallExpr *CE)
bool VisitForStmt(const ForStmt *FS)
bool VisitCXXNewExpr(const CXXNewExpr *NE)
bool VisitBinaryOperator(const BinaryOperator *BO)
bool checkArguments(const CallExpr *CE)
bool VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE)
bool VisitCXXForRangeStmt(const CXXForRangeStmt *FS)
bool VisitGotoStmt(const GotoStmt *)
bool VisitWhileStmt(const WhileStmt *WS)
bool VisitCharacterLiteral(const CharacterLiteral *E)
bool VisitInitListExpr(const InitListExpr *ILE)
bool VisitAttributedStmt(const AttributedStmt *AS)
bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E)
bool VisitAtomicExpr(const AtomicExpr *E)
bool VisitStmt(const Stmt *S)
bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E)
bool VisitExplicitCastExpr(const ExplicitCastExpr *ECE)
bool VisitArrayInitIndexExpr(const ArrayInitIndexExpr *AIIE)
bool VisitParenExpr(const ParenExpr *PE)
bool VisitDefaultStmt(const DefaultStmt *DS)
bool VisitOffsetOfExpr(const OffsetOfExpr *OE)
bool VisitCXXConstructExpr(const CXXConstructExpr *CE)
bool VisitReturnStmt(const ReturnStmt *RS)
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isPointerType() const
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const RecordType * getAsStructureType() const
bool isObjCObjectPointerType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Represents the declaration of a typedef-name via the 'typedef' type specifier.
QualType getUnderlyingType() const
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Expr * getSubExpr() const
WhileStmt - This represents a 'while' stmt.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
bool isCocoaObjectRef(QualType T)
bool isCFObjectRef(QualType T)
The JSON file list parser is used to communicate input to InstallAPI.
bool isCtorOfSafePtr(const clang::FunctionDecl *F)
bool isTrivialBuiltinFunction(const FunctionDecl *F)
bool isCtorOfRetainPtr(const clang::FunctionDecl *F)
bool isPtrConversion(const FunctionDecl *F)
std::optional< bool > isCheckedPtrCapable(const clang::CXXRecordDecl *R)
std::optional< bool > isUnchecked(const QualType T)
bool isCtorOfRefCounted(const clang::FunctionDecl *F)
bool isRefOrCheckedPtrType(const clang::QualType T)
@ Result
The result type of a method or function.
std::optional< bool > isUnsafePtr(const QualType T, bool IsArcEnabled)
bool isRetainPtrType(const clang::QualType T)
std::optional< bool > isUnretained(const QualType T, bool IsARCEnabled)
std::optional< bool > isRefCountable(const clang::CXXRecordDecl *R)
std::optional< const clang::CXXRecordDecl * > hasPublicMethodInBase(const CXXBaseSpecifier *Base, StringRef NameToMatch)
bool isSmartPtrClass(const std::string &Name)
bool isSingleton(const FunctionDecl *F)
bool isRefCounted(const CXXRecordDecl *R)
static bool isPtrOfType(const clang::QualType T, Predicate Pred)
std::optional< bool > isSmartPtrCompatible(const CXXRecordDecl *R, StringRef IncMethodName, StringRef DecMethodName)
bool isOwnerPtrType(const clang::QualType T)
bool isSmartPtr(const CXXRecordDecl *R)
std::optional< bool > isGetterOfSafePtr(const CXXMethodDecl *M)
bool isRefType(const std::string &Name)
const FunctionProtoType * T
std::optional< bool > isUncountedPtr(const QualType T)
std::string safeGetName(const T *ASTNode)
bool isCtorOfCheckedPtr(const clang::FunctionDecl *F)
bool isCheckedPtr(const std::string &Name)
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
std::optional< bool > isUncounted(const QualType T)
bool isRetainPtr(const std::string &Name)
std::optional< bool > isUncheckedPtr(const QualType T)