clang 19.0.0git
Macros | Typedefs | Functions
SemaDeclObjC.cpp File Reference
#include "TypeLocBuilder.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTMutationListener.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/DeclSpec.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
#include "clang/Sema/SemaInternal.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "clang/AST/DeclNodes.inc"

Go to the source code of this file.

Macros

#define OBJCCONTAINER(type, base)
 
#define ABSTRACT_DECL(expansion)
 
#define DECL(type, base)    case Decl::type:
 

Typedefs

typedef llvm::DenseSet< IdentifierInfo * > ProtocolNameSet
 FIXME: Type hierarchies in Objective-C can be deep.
 
typedef std::unique_ptr< ProtocolNameSetLazyProtocolNameSet
 

Functions

static bool diagnoseNoescape (const ParmVarDecl *NewD, const ParmVarDecl *OldD, Sema &S)
 Issue a warning if the parameter of the overridden method is non-escaping but the parameter of the overriding method is not.
 
static void diagnoseNoescape (const ParmVarDecl *NewD, const ParmVarDecl *OldD, const ObjCCategoryDecl *CD, const ObjCProtocolDecl *PD, Sema &S)
 Produce additional diagnostics if a category conforms to a protocol that defines a method taking a non-escaping parameter.
 
static void DiagnoseObjCImplementedDeprecations (Sema &S, const NamedDecl *ND, SourceLocation ImplLoc)
 
static bool HasExplicitOwnershipAttr (Sema &S, ParmVarDecl *Param)
 HasExplicitOwnershipAttr - returns true when pointer to ObjC pointer has explicit ownership attribute; false otherwise.
 
static void diagnoseUseOfProtocols (Sema &TheSema, ObjCContainerDecl *CD, ObjCProtocolDecl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs)
 
static bool checkTypeParamListConsistency (Sema &S, ObjCTypeParamList *prevTypeParams, ObjCTypeParamList *newTypeParams, TypeParamListContext newContext)
 Check consistency between two Objective-C type parameter lists, e.g., between a category/extension and an @interface or between an @class and an @interface.
 
static bool NestedProtocolHasNoDefinition (ObjCProtocolDecl *PDecl, ObjCProtocolDecl *&UndefinedProtocol)
 
static bool shouldWarnUndefinedMethod (const ObjCMethodDecl *M)
 
static void WarnUndefinedMethod (Sema &S, ObjCImplDecl *Impl, ObjCMethodDecl *method, bool &IncompleteImpl, unsigned DiagID, NamedDecl *NeededFor=nullptr)
 
static bool isObjCTypeSubstitutable (ASTContext &Context, const ObjCObjectPointerType *A, const ObjCObjectPointerType *B, bool rejectId)
 Determines if type B can be substituted for type A.
 
static SourceRange getTypeRange (TypeSourceInfo *TSI)
 
static bool objcModifiersConflict (Decl::ObjCDeclQualifier x, Decl::ObjCDeclQualifier y)
 Determine whether two set of Objective-C declaration qualifiers conflict.
 
static bool CheckMethodOverrideReturn (Sema &S, ObjCMethodDecl *MethodImpl, ObjCMethodDecl *MethodDecl, bool IsProtocolMethodDecl, bool IsOverridingMode, bool Warn)
 
static bool CheckMethodOverrideParam (Sema &S, ObjCMethodDecl *MethodImpl, ObjCMethodDecl *MethodDecl, ParmVarDecl *ImplVar, ParmVarDecl *IfaceVar, bool IsProtocolMethodDecl, bool IsOverridingMode, bool Warn)
 
static bool checkMethodFamilyMismatch (Sema &S, ObjCMethodDecl *impl, ObjCMethodDecl *decl)
 In ARC, check whether the conventional meanings of the two methods match.
 
static void findProtocolsWithExplicitImpls (const ObjCProtocolDecl *PDecl, ProtocolNameSet &PNS)
 
static void findProtocolsWithExplicitImpls (const ObjCInterfaceDecl *Super, ProtocolNameSet &PNS)
 Recursively populates a set with all conformed protocols in a class hierarchy that have the 'objc_protocol_requires_explicit_implementation' attribute.
 
static void CheckProtocolMethodDefs (Sema &S, ObjCImplDecl *Impl, ObjCProtocolDecl *PDecl, bool &IncompleteImpl, const Sema::SelectorSet &InsMap, const Sema::SelectorSet &ClsMap, ObjCContainerDecl *CDecl, LazyProtocolNameSet &ProtocolsExplictImpl)
 CheckProtocolMethodDefs - This routine checks unimplemented methods Declared in protocol, and those referenced by it.
 
static bool tryMatchRecordTypes (ASTContext &Context, Sema::MethodMatchStrategy strategy, const Type *left, const Type *right)
 
static bool matchTypes (ASTContext &Context, Sema::MethodMatchStrategy strategy, QualType leftQT, QualType rightQT)
 
static bool isMethodContextSameForKindofLookup (ObjCMethodDecl *Method, ObjCMethodDecl *MethodInList)
 
static bool isAcceptableMethodMismatch (ObjCMethodDecl *chosen, ObjCMethodDecl *other)
 Determines if this is an "acceptable" loose mismatch in the global method pool.
 
static bool FilterMethodsByTypeBound (ObjCMethodDecl *Method, const ObjCObjectType *TypeBound)
 Return true if the given method is wthin the type bound.
 
static void HelperSelectorsForTypoCorrection (SmallVectorImpl< const ObjCMethodDecl * > &BestMethod, StringRef Typo, const ObjCMethodDecl *Method)
 
static bool HelperIsMethodInObjCType (Sema &S, Selector Sel, QualType ObjectType)
 
static void DiagnoseWeakIvars (Sema &S, ObjCImplementationDecl *ID)
 Diagnose attempts to define ARC-__weak ivars when __weak is disabled.
 
static void DiagnoseRetainableFlexibleArrayMember (Sema &S, ObjCInterfaceDecl *ID)
 Diagnose attempts to use flexible array member with retainable object type.
 
static bool IsVariableSizedType (QualType T)
 
static void DiagnoseVariableSizedIvars (Sema &S, ObjCContainerDecl *OCD)
 
static void DiagnoseCategoryDirectMembersProtocolConformance (Sema &S, ObjCProtocolDecl *PDecl, ObjCCategoryDecl *CDecl)
 
static void DiagnoseCategoryDirectMembersProtocolConformance (Sema &S, ObjCCategoryDecl *CDecl, const llvm::iterator_range< ObjCProtocolList::iterator > &Protocols)
 
static Decl::ObjCDeclQualifier CvtQTToAstBitMask (ObjCDeclSpec::ObjCDeclQualifier PQTVal)
 CvtQTToAstBitMask - utility routine to produce an AST bitmask for objective-c's type qualifier from the parser version of the same info.
 
static Sema::ResultTypeCompatibilityKind CheckRelatedResultTypeCompatibility (Sema &S, ObjCMethodDecl *Method, ObjCInterfaceDecl *CurrentClass)
 Check whether the declared result type of the given Objective-C method declaration is compatible with the method's class.
 
static QualType mergeTypeNullabilityForRedecl (Sema &S, SourceLocation loc, QualType type, bool usesCSKeyword, SourceLocation prevLoc, QualType prevType, bool prevUsesCSKeyword)
 Merge type nullability from for a redeclaration of the same entity, producing the updated type of the redeclared entity.
 
static void mergeInterfaceMethodToImpl (Sema &S, ObjCMethodDecl *method, ObjCMethodDecl *prevMethod)
 Merge information from the declaration of a method in the @interface (or a category/extension) into the corresponding method in the @implementation (for a class or category).
 
static void checkObjCMethodX86VectorTypes (Sema &SemaRef, const ObjCMethodDecl *Method)
 Verify that the method parameters/return value have types that are supported by the x86 target.
 
static void mergeObjCDirectMembers (Sema &S, Decl *CD, ObjCMethodDecl *Method)
 
static void checkObjCDirectMethodClashes (Sema &S, ObjCInterfaceDecl *IDecl, ObjCMethodDecl *Method, ObjCImplDecl *ImpDecl=nullptr)
 

Macro Definition Documentation

◆ ABSTRACT_DECL

#define ABSTRACT_DECL (   expansion)

◆ DECL

#define DECL (   type,
  base 
)     case Decl::type:

◆ OBJCCONTAINER

#define OBJCCONTAINER (   type,
  base 
)
Value:
case Decl::type: \
searchFrom(cast<type##Decl>(container)); \
break;

Typedef Documentation

◆ LazyProtocolNameSet

typedef std::unique_ptr<ProtocolNameSet> LazyProtocolNameSet

Definition at line 2684 of file SemaDeclObjC.cpp.

◆ ProtocolNameSet

FIXME: Type hierarchies in Objective-C can be deep.

We could most likely improve the efficiency of selector lookups and type checking by associating with each protocol / interface / category the flattened instance tables. If we used an immutable set to keep the table then it wouldn't add significant memory cost and it would be handy for lookups.

Definition at line 2683 of file SemaDeclObjC.cpp.

Function Documentation

◆ checkMethodFamilyMismatch()

static bool checkMethodFamilyMismatch ( Sema S,
ObjCMethodDecl impl,
ObjCMethodDecl decl 
)
static

◆ CheckMethodOverrideParam()

static bool CheckMethodOverrideParam ( Sema S,
ObjCMethodDecl MethodImpl,
ObjCMethodDecl MethodDecl,
ParmVarDecl ImplVar,
ParmVarDecl IfaceVar,
bool  IsProtocolMethodDecl,
bool  IsOverridingMode,
bool  Warn 
)
static

◆ CheckMethodOverrideReturn()

static bool CheckMethodOverrideReturn ( Sema S,
ObjCMethodDecl MethodImpl,
ObjCMethodDecl MethodDecl,
bool  IsProtocolMethodDecl,
bool  IsOverridingMode,
bool  Warn 
)
static

◆ checkObjCDirectMethodClashes()

static void checkObjCDirectMethodClashes ( Sema S,
ObjCInterfaceDecl IDecl,
ObjCMethodDecl Method,
ObjCImplDecl ImpDecl = nullptr 
)
static

◆ checkObjCMethodX86VectorTypes()

static void checkObjCMethodX86VectorTypes ( Sema SemaRef,
const ObjCMethodDecl Method 
)
static

◆ CheckProtocolMethodDefs()

static void CheckProtocolMethodDefs ( Sema S,
ObjCImplDecl Impl,
ObjCProtocolDecl PDecl,
bool IncompleteImpl,
const Sema::SelectorSet InsMap,
const Sema::SelectorSet ClsMap,
ObjCContainerDecl CDecl,
LazyProtocolNameSet ProtocolsExplictImpl 
)
static

◆ CheckRelatedResultTypeCompatibility()

static Sema::ResultTypeCompatibilityKind CheckRelatedResultTypeCompatibility ( Sema S,
ObjCMethodDecl Method,
ObjCInterfaceDecl CurrentClass 
)
static

Check whether the declared result type of the given Objective-C method declaration is compatible with the method's class.

Definition at line 4246 of file SemaDeclObjC.cpp.

References clang::declaresSameEntity(), clang::Type::getAs(), clang::ObjCMethodDecl::getReturnType(), clang::Sema::RTC_Compatible, clang::Sema::RTC_Incompatible, and clang::Sema::RTC_Unknown.

Referenced by clang::Sema::ActOnMethodDeclaration().

◆ checkTypeParamListConsistency()

static bool checkTypeParamListConsistency ( Sema S,
ObjCTypeParamList prevTypeParams,
ObjCTypeParamList newTypeParams,
TypeParamListContext  newContext 
)
static

◆ CvtQTToAstBitMask()

static Decl::ObjCDeclQualifier CvtQTToAstBitMask ( ObjCDeclSpec::ObjCDeclQualifier  PQTVal)
static

CvtQTToAstBitMask - utility routine to produce an AST bitmask for objective-c's type qualifier from the parser version of the same info.

Definition at line 4238 of file SemaDeclObjC.cpp.

Referenced by clang::Sema::ActOnMethodDeclaration().

◆ DiagnoseCategoryDirectMembersProtocolConformance() [1/2]

static void DiagnoseCategoryDirectMembersProtocolConformance ( Sema S,
ObjCCategoryDecl CDecl,
const llvm::iterator_range< ObjCProtocolList::iterator > &  Protocols 
)
static

◆ DiagnoseCategoryDirectMembersProtocolConformance() [2/2]

static void DiagnoseCategoryDirectMembersProtocolConformance ( Sema S,
ObjCProtocolDecl PDecl,
ObjCCategoryDecl CDecl 
)
static

◆ diagnoseNoescape() [1/2]

static void diagnoseNoescape ( const ParmVarDecl NewD,
const ParmVarDecl OldD,
const ObjCCategoryDecl CD,
const ObjCProtocolDecl PD,
Sema S 
)
static

Produce additional diagnostics if a category conforms to a protocol that defines a method taking a non-escaping parameter.

Definition at line 127 of file SemaDeclObjC.cpp.

References clang::SemaBase::Diag(), diagnoseNoescape(), clang::Decl::getDeclContext(), clang::Decl::getLocation(), and clang::ObjCCategoryDecl::IsClassExtension().

◆ diagnoseNoescape() [2/2]

static bool diagnoseNoescape ( const ParmVarDecl NewD,
const ParmVarDecl OldD,
Sema S 
)
static

Issue a warning if the parameter of the overridden method is non-escaping but the parameter of the overriding method is not.

Definition at line 114 of file SemaDeclObjC.cpp.

References clang::SemaBase::Diag(), clang::Decl::getLocation(), and clang::Decl::hasAttr().

Referenced by clang::Sema::ActOnMethodDeclaration(), clang::Sema::CheckObjCMethodOverride(), and diagnoseNoescape().

◆ DiagnoseObjCImplementedDeprecations()

static void DiagnoseObjCImplementedDeprecations ( Sema S,
const NamedDecl ND,
SourceLocation  ImplLoc 
)
static

◆ DiagnoseRetainableFlexibleArrayMember()

static void DiagnoseRetainableFlexibleArrayMember ( Sema S,
ObjCInterfaceDecl ID 
)
static

◆ diagnoseUseOfProtocols()

static void diagnoseUseOfProtocols ( Sema TheSema,
ObjCContainerDecl CD,
ObjCProtocolDecl *const *  ProtoRefs,
unsigned  NumProtoRefs,
const SourceLocation ProtoLocs 
)
static

◆ DiagnoseVariableSizedIvars()

static void DiagnoseVariableSizedIvars ( Sema S,
ObjCContainerDecl OCD 
)
static

◆ DiagnoseWeakIvars()

static void DiagnoseWeakIvars ( Sema S,
ObjCImplementationDecl ID 
)
static

Diagnose attempts to define ARC-__weak ivars when __weak is disabled.

Definition at line 3790 of file SemaDeclObjC.cpp.

References clang::SemaBase::Diag(), clang::Sema::getLangOpts(), and clang::Qualifiers::OCL_Weak.

Referenced by clang::Sema::ActOnAtEnd().

◆ FilterMethodsByTypeBound()

static bool FilterMethodsByTypeBound ( ObjCMethodDecl Method,
const ObjCObjectType TypeBound 
)
static

◆ findProtocolsWithExplicitImpls() [1/2]

static void findProtocolsWithExplicitImpls ( const ObjCInterfaceDecl Super,
ProtocolNameSet PNS 
)
static

Recursively populates a set with all conformed protocols in a class hierarchy that have the 'objc_protocol_requires_explicit_implementation' attribute.

Definition at line 2697 of file SemaDeclObjC.cpp.

References clang::ObjCInterfaceDecl::all_referenced_protocols(), findProtocolsWithExplicitImpls(), and clang::ObjCInterfaceDecl::getSuperClass().

◆ findProtocolsWithExplicitImpls() [2/2]

static void findProtocolsWithExplicitImpls ( const ObjCProtocolDecl PDecl,
ProtocolNameSet PNS 
)
static

◆ getTypeRange()

static SourceRange getTypeRange ( TypeSourceInfo TSI)
static

◆ HasExplicitOwnershipAttr()

static bool HasExplicitOwnershipAttr ( Sema S,
ParmVarDecl Param 
)
static

HasExplicitOwnershipAttr - returns true when pointer to ObjC pointer has explicit ownership attribute; false otherwise.

Definition at line 344 of file SemaDeclObjC.cpp.

References clang::Type::getAs(), clang::Type::getPointeeType(), clang::ValueDecl::getType(), and clang::T.

Referenced by clang::Sema::ActOnStartOfObjCMethodDef().

◆ HelperIsMethodInObjCType()

static bool HelperIsMethodInObjCType ( Sema S,
Selector  Sel,
QualType  ObjectType 
)
static

◆ HelperSelectorsForTypoCorrection()

static void HelperSelectorsForTypoCorrection ( SmallVectorImpl< const ObjCMethodDecl * > &  BestMethod,
StringRef  Typo,
const ObjCMethodDecl Method 
)
static

◆ isAcceptableMethodMismatch()

static bool isAcceptableMethodMismatch ( ObjCMethodDecl chosen,
ObjCMethodDecl other 
)
static

Determines if this is an "acceptable" loose mismatch in the global method pool.

This exists mostly as a hack to get around certain global mismatches which we can't afford to make warnings / errors. Really, what we want is a way to take a method out of the global method pool.

Definition at line 3465 of file SemaDeclObjC.cpp.

References clang::Selector::getNameForSlot(), clang::ObjCMethodDecl::getReturnType(), clang::ObjCMethodDecl::getSelector(), clang::ObjCMethodDecl::isDirectMethod(), clang::ObjCMethodDecl::isInstanceMethod(), clang::Type::isIntegerType(), and clang::Selector::isUnarySelector().

Referenced by clang::Sema::DiagnoseMultipleMethodInGlobalPool().

◆ isMethodContextSameForKindofLookup()

static bool isMethodContextSameForKindofLookup ( ObjCMethodDecl Method,
ObjCMethodDecl MethodInList 
)
static

◆ isObjCTypeSubstitutable()

static bool isObjCTypeSubstitutable ( ASTContext Context,
const ObjCObjectPointerType A,
const ObjCObjectPointerType B,
bool  rejectId 
)
static

Determines if type B can be substituted for type A.

Returns true if we can guarantee that anything that the user will do to an object of type A can also be done to an object of type B. This is trivially true if the two types are the same, or if B is a subclass of A. It becomes more complex in cases where protocols are involved.

Object types in Objective-C describe the minimum requirements for an object, rather than providing a complete description of a type. For example, if A is a subclass of B, then B* may refer to an instance of A. The principle of substitutability means that we may use an instance of A anywhere that we may use an instance of B - it will implement all of the ivars of B and all of the methods of B.

This substitutability is important when type checking methods, because the implementation may have stricter type definitions than the interface. The interface specifies minimum requirements, but the implementation may have more accurate ones. For example, a method may privately accept instances of B, but only publish that it accepts instances of A. Any object passed to it will be type checked against B, and so will implicitly by a valid A*. Similarly, a method may return a subclass of the class that it is declared as returning.

This is most important when considering subclassing. A method in a subclass must accept any object as an argument that its superclass's implementation accepts. It may, however, accept a more general type without breaking substitutability (i.e. you can still use the subclass anywhere that you can use the superclass, but not vice versa). The converse requirement applies to return types: the return type for a subclass method must be a valid object of the kind that the superclass advertises, but it may be specified more accurately. This avoids the need for explicit down-casting by callers.

Note: This is a stricter requirement than for assignment.

Definition at line 2308 of file SemaDeclObjC.cpp.

References clang::ASTContext::canAssignObjCInterfaces(), clang::ObjCObjectPointerType::isObjCIdType(), clang::ObjCObjectPointerType::isObjCQualifiedIdType(), and clang::ASTContext::ObjCQualifiedIdTypesAreCompatible().

Referenced by CheckMethodOverrideParam(), and CheckMethodOverrideReturn().

◆ IsVariableSizedType()

static bool IsVariableSizedType ( QualType  T)
static

◆ matchTypes()

static bool matchTypes ( ASTContext Context,
Sema::MethodMatchStrategy  strategy,
QualType  leftQT,
QualType  rightQT 
)
static

◆ mergeInterfaceMethodToImpl()

static void mergeInterfaceMethodToImpl ( Sema S,
ObjCMethodDecl method,
ObjCMethodDecl prevMethod 
)
static

◆ mergeObjCDirectMembers()

static void mergeObjCDirectMembers ( Sema S,
Decl CD,
ObjCMethodDecl Method 
)
static

◆ mergeTypeNullabilityForRedecl()

static QualType mergeTypeNullabilityForRedecl ( Sema S,
SourceLocation  loc,
QualType  type,
bool  usesCSKeyword,
SourceLocation  prevLoc,
QualType  prevType,
bool  prevUsesCSKeyword 
)
static

Merge type nullability from for a redeclaration of the same entity, producing the updated type of the redeclared entity.

Definition at line 4546 of file SemaDeclObjC.cpp.

References clang::Sema::Context, clang::SemaBase::Diag(), clang::ASTContext::getAttributedType(), clang::Type::getNullability(), clang::AttributedType::getNullabilityAttrKind(), and clang::ast_matchers::type.

Referenced by mergeInterfaceMethodToImpl().

◆ NestedProtocolHasNoDefinition()

static bool NestedProtocolHasNoDefinition ( ObjCProtocolDecl PDecl,
ObjCProtocolDecl *&  UndefinedProtocol 
)
static

◆ objcModifiersConflict()

static bool objcModifiersConflict ( Decl::ObjCDeclQualifier  x,
Decl::ObjCDeclQualifier  y 
)
static

Determine whether two set of Objective-C declaration qualifiers conflict.

Definition at line 2345 of file SemaDeclObjC.cpp.

References clang::Decl::OBJC_TQ_CSNullability.

Referenced by CheckMethodOverrideParam(), and CheckMethodOverrideReturn().

◆ shouldWarnUndefinedMethod()

static bool shouldWarnUndefinedMethod ( const ObjCMethodDecl M)
static

Definition at line 2236 of file SemaDeclObjC.cpp.

References clang::AR_Unavailable, and clang::Decl::getAvailability().

Referenced by WarnUndefinedMethod().

◆ tryMatchRecordTypes()

static bool tryMatchRecordTypes ( ASTContext Context,
Sema::MethodMatchStrategy  strategy,
const Type left,
const Type right 
)
static

◆ WarnUndefinedMethod()

static void WarnUndefinedMethod ( Sema S,
ObjCImplDecl Impl,
ObjCMethodDecl method,
bool IncompleteImpl,
unsigned  DiagID,
NamedDecl NeededFor = nullptr 
)
static