clang 22.0.0git
DynamicTypePropagation.cpp File Reference

Go to the source code of this file.

Functions

 REGISTER_MAP_WITH_PROGRAMSTATE (MostSpecializedTypeArgsMap, SymbolRef, const ObjCObjectPointerType *) namespace
static void recordFixedType (const MemRegion *Region, const CXXMethodDecl *MD, CheckerContext &C)
static const ObjCObjectPointerTypegetMostInformativeDerivedClassImpl (const ObjCObjectPointerType *From, const ObjCObjectPointerType *To, const ObjCObjectPointerType *MostInformativeCandidate, ASTContext &C)
static const ObjCObjectPointerTypegetMostInformativeDerivedClass (const ObjCObjectPointerType *From, const ObjCObjectPointerType *To, ASTContext &C)
 A downcast may loose specialization information.
static bool storeWhenMoreInformative (ProgramStateRef &State, SymbolRef Sym, const ObjCObjectPointerType *const *Current, const ObjCObjectPointerType *StaticLowerBound, const ObjCObjectPointerType *StaticUpperBound, ASTContext &C)
 Inputs:
static const ExprstripCastsAndSugar (const Expr *E)
static bool isObjCTypeParamDependent (QualType Type)
static const ObjCMethodDeclfindMethodDecl (const ObjCMessageExpr *MessageExpr, const ObjCObjectPointerType *TrackedType, ASTContext &ASTCtxt)
 A method might not be available in the interface indicated by the static type.
static QualType getReturnTypeForMethod (const ObjCMethodDecl *Method, ArrayRef< QualType > TypeArgs, const ObjCObjectPointerType *SelfType, ASTContext &C)
 Get the returned ObjCObjectPointerType by a method based on the tracked type information, or null pointer when the returned type is not an ObjCObjectPointerType.

Function Documentation

◆ findMethodDecl()

const ObjCMethodDecl * findMethodDecl ( const ObjCMessageExpr * MessageExpr,
const ObjCObjectPointerType * TrackedType,
ASTContext & ASTCtxt )
static

A method might not be available in the interface indicated by the static type.

However it might be available in the tracked type. In order to properly substitute the type parameters we need the declaration context of the method. The more specialized the enclosing class of the method is, the more likely that the parameter substitution will be successful.

Definition at line 742 of file DynamicTypePropagation.cpp.

References clang::ASTContext::canAssignObjCInterfaces(), clang::Type::castAs(), clang::ObjCMessageExpr::Class, clang::ObjCObjectPointerType::getInterfaceDecl(), clang::ObjCMessageExpr::getMethodDecl(), clang::ObjCMessageExpr::getReceiverKind(), clang::ObjCMessageExpr::getReceiverType(), clang::ObjCMessageExpr::getSelector(), clang::ObjCMessageExpr::Instance, clang::Type::isObjCClassType(), clang::Type::isObjCIdType(), clang::ObjCInterfaceDecl::lookupClassMethod(), and clang::ObjCInterfaceDecl::lookupInstanceMethod().

◆ getMostInformativeDerivedClass()

const ObjCObjectPointerType * getMostInformativeDerivedClass ( const ObjCObjectPointerType * From,
const ObjCObjectPointerType * To,
ASTContext & C )
static

A downcast may loose specialization information.

E. g.: MutableMap<T, U> : Map The downcast to MutableMap looses the information about the types of the Map (due to the type parameters are not being forwarded to Map), and in general there is no way to recover that information from the declaration. In order to have to most information, lets find the most derived type that has all the type parameters forwarded.

Get the a subclass of From (which has a lower bound To) that do not loose information about type parameters. To has to be a subclass of From. From has to be specialized.

Definition at line 508 of file DynamicTypePropagation.cpp.

References clang::C, and getMostInformativeDerivedClassImpl().

Referenced by storeWhenMoreInformative().

◆ getMostInformativeDerivedClassImpl()

◆ getReturnTypeForMethod()

QualType getReturnTypeForMethod ( const ObjCMethodDecl * Method,
ArrayRef< QualType > TypeArgs,
const ObjCObjectPointerType * SelfType,
ASTContext & C )
static

Get the returned ObjCObjectPointerType by a method based on the tracked type information, or null pointer when the returned type is not an ObjCObjectPointerType.

Definition at line 775 of file DynamicTypePropagation.cpp.

References clang::C, isObjCTypeParamDependent(), clang::Result, and clang::QualType::substObjCTypeArgs().

◆ isObjCTypeParamDependent()

bool isObjCTypeParamDependent ( QualType Type)
static

Definition at line 712 of file DynamicTypePropagation.cpp.

References clang::isa().

Referenced by getReturnTypeForMethod().

◆ recordFixedType()

◆ REGISTER_MAP_WITH_PROGRAMSTATE()

◆ storeWhenMoreInformative()

bool storeWhenMoreInformative ( ProgramStateRef & State,
SymbolRef Sym,
const ObjCObjectPointerType *const * Current,
const ObjCObjectPointerType * StaticLowerBound,
const ObjCObjectPointerType * StaticUpperBound,
ASTContext & C )
static

Inputs:

Parameters
StaticLowerBoundStatic lower bound for a symbol. The dynamic lower bound might be the subclass of this type.
StaticUpperBoundA static upper bound for a symbol. StaticLowerBound expected to be the subclass of StaticUpperBound.
CurrentThe type that was inferred for a symbol in a previous context. Might be null when this is the first time that inference happens. Precondition: StaticLowerBound or StaticUpperBound is specialized. If Current is not null, it is specialized. Possible cases: (1) The Current is null and StaticLowerBound <: StaticUpperBound (2) StaticLowerBound <: Current <: StaticUpperBound (3) Current <: StaticLowerBound <: StaticUpperBound (4) StaticLowerBound <: StaticUpperBound <: Current Effect: Use getMostInformativeDerivedClass with the upper and lower bound of the set {StaticLowerBound, Current, StaticUpperBound}. The computed lower bound must be specialized. If the result differs from Current or Current is null, store the result.

Definition at line 534 of file DynamicTypePropagation.cpp.

References clang::C, getMostInformativeDerivedClass(), clang::ObjCObjectPointerType::isSpecialized(), and clang::ObjCObjectPointerType::isUnspecialized().

◆ stripCastsAndSugar()

const Expr * stripCastsAndSugar ( const Expr * E)
static

Definition at line 703 of file DynamicTypePropagation.cpp.

References clang::Expr::IgnoreParenImpCasts().