clang API Documentation

Typedefs | Enumerations | Functions
SemaExprMember.cpp File Reference
#include "clang/Sema/Overload.h"
#include "clang/Sema/SemaInternal.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
Include dependency graph for SemaExprMember.cpp:

Go to the source code of this file.

Typedefs

typedef llvm::SmallPtrSet
< const CXXRecordDecl *, 4 > 
BaseSet

Enumerations

enum  IMAKind {
  IMA_Static, IMA_Mixed, IMA_Mixed_StaticContext, IMA_Mixed_Unrelated,
  IMA_Instance, IMA_Unresolved, IMA_Abstract, IMA_Unresolved_StaticContext,
  IMA_Field_Uneval_Context, IMA_Error_StaticContext, IMA_Error_Unrelated
}

Functions

static bool BaseIsNotInSet (const CXXRecordDecl *Base, void *BasesPtr)
static bool isProvablyNotDerivedFrom (Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
static IMAKind ClassifyImplicitMemberAccess (Sema &SemaRef, Scope *CurScope, const LookupResult &R)
static void diagnoseInstanceReference (Sema &SemaRef, const CXXScopeSpec &SS, NamedDecl *Rep, const DeclarationNameInfo &nameInfo)
 Diagnose a reference to a field with no object available.
static QualType CheckExtVectorComponent (Sema &S, QualType baseType, ExprValueKind &VK, SourceLocation OpLoc, const IdentifierInfo *CompName, SourceLocation CompLoc)
static DeclFindGetterSetterNameDeclFromProtocolList (const ObjCProtocolDecl *PDecl, IdentifierInfo *Member, const Selector &Sel, ASTContext &Context)
static DeclFindGetterSetterNameDecl (const ObjCObjectPointerType *QIdTy, IdentifierInfo *Member, const Selector &Sel, ASTContext &Context)
static void DiagnoseQualifiedMemberReference (Sema &SemaRef, Expr *BaseExpr, QualType BaseType, const CXXScopeSpec &SS, NamedDecl *rep, const DeclarationNameInfo &nameInfo)
static bool LookupMemberExprInRecord (Sema &SemaRef, LookupResult &R, Expr *BaseExpr, const RecordType *RTy, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, bool HasTemplateArgs, TypoExpr *&TE)
static ExprResult LookupMemberExpr (Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs)
static ExprResult BuildFieldReferenceExpr (Sema &S, Expr *BaseExpr, bool IsArrow, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
static ExprResult BuildMSPropertyRefExpr (Sema &S, Expr *BaseExpr, bool IsArrow, const CXXScopeSpec &SS, MSPropertyDecl *PD, const DeclarationNameInfo &NameInfo)
static MemberExprBuildMemberExpr (Sema &SemaRef, ASTContext &C, Expr *Base, bool isArrow, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK, ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs=nullptr)
 Build a MemberExpr AST node.
static bool ShouldTryAgainWithRedefinitionType (Sema &S, ExprResult &base)
static bool isRecordType (QualType T)
static bool isPointerToRecordType (QualType T)

Typedef Documentation

typedef llvm::SmallPtrSet<const CXXRecordDecl*, 4> BaseSet

Definition at line 29 of file SemaExprMember.cpp.


Enumeration Type Documentation

enum IMAKind
Enumerator:
IMA_Static 

The reference is definitely not an instance member access.

IMA_Mixed 

The reference may be an implicit instance member access.

IMA_Mixed_StaticContext 

The reference may be to an instance member, but it might be invalid if so, because the context is not an instance method.

IMA_Mixed_Unrelated 

The reference may be to an instance member, but it is invalid if so, because the context is from an unrelated class.

IMA_Instance 

The reference is definitely an implicit instance member access.

IMA_Unresolved 

The reference may be to an unresolved using declaration.

IMA_Abstract 

The reference is a contextually-permitted abstract member reference.

IMA_Unresolved_StaticContext 

The reference may be to an unresolved using declaration and the context is not an instance method.

IMA_Field_Uneval_Context 
IMA_Error_StaticContext 

All possible referrents are instance members and the current context is not an instance method.

IMA_Error_Unrelated 

All possible referrents are instance members of an unrelated class.

Definition at line 44 of file SemaExprMember.cpp.


Function Documentation

static bool BaseIsNotInSet ( const CXXRecordDecl Base,
void *  BasesPtr 
) [static]

Definition at line 30 of file SemaExprMember.cpp.

References clang::CXXRecordDecl::getCanonicalDecl().

Referenced by isProvablyNotDerivedFrom().

static ExprResult BuildFieldReferenceExpr ( Sema S,
Expr BaseExpr,
bool  IsArrow,
const CXXScopeSpec SS,
FieldDecl Field,
DeclAccessPair  FoundDecl,
const DeclarationNameInfo MemberNameInfo 
) [static]
static MemberExpr* BuildMemberExpr ( Sema SemaRef,
ASTContext C,
Expr Base,
bool  isArrow,
const CXXScopeSpec SS,
SourceLocation  TemplateKWLoc,
ValueDecl Member,
DeclAccessPair  FoundDecl,
const DeclarationNameInfo MemberNameInfo,
QualType  Ty,
ExprValueKind  VK,
ExprObjectKind  OK,
const TemplateArgumentListInfo TemplateArgs = nullptr 
) [static]
static ExprResult BuildMSPropertyRefExpr ( Sema S,
Expr BaseExpr,
bool  IsArrow,
const CXXScopeSpec SS,
MSPropertyDecl PD,
const DeclarationNameInfo NameInfo 
) [static]
static QualType CheckExtVectorComponent ( Sema S,
QualType  baseType,
ExprValueKind VK,
SourceLocation  OpLoc,
const IdentifierInfo CompName,
SourceLocation  CompLoc 
) [static]
static IMAKind ClassifyImplicitMemberAccess ( Sema SemaRef,
Scope CurScope,
const LookupResult R 
) [static]
static void diagnoseInstanceReference ( Sema SemaRef,
const CXXScopeSpec SS,
NamedDecl Rep,
const DeclarationNameInfo nameInfo 
) [static]
static void DiagnoseQualifiedMemberReference ( Sema SemaRef,
Expr BaseExpr,
QualType  BaseType,
const CXXScopeSpec SS,
NamedDecl rep,
const DeclarationNameInfo nameInfo 
) [static]

We know that the given qualified member reference points only to declarations which do not belong to the static type of the base expression. Diagnose the problem.

Definition at line 468 of file SemaExprMember.cpp.

References clang::Sema::Diag(), diagnoseInstanceReference(), clang::DeclarationNameInfo::getLoc(), and clang::CXXScopeSpec::getRange().

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

static Decl* FindGetterSetterNameDecl ( const ObjCObjectPointerType QIdTy,
IdentifierInfo Member,
const Selector Sel,
ASTContext Context 
) [static]
static Decl* FindGetterSetterNameDeclFromProtocolList ( const ObjCProtocolDecl PDecl,
IdentifierInfo Member,
const Selector Sel,
ASTContext Context 
) [static]
static bool isPointerToRecordType ( QualType  T) [static]

Definition at line 1152 of file SemaExprMember.cpp.

References clang::Type::getAs().

Referenced by LookupMemberExpr().

static bool isProvablyNotDerivedFrom ( Sema SemaRef,
CXXRecordDecl Record,
const BaseSet Bases 
) [static]

Determines if the given class is provably not derived from all of the prospective base classes.

Definition at line 37 of file SemaExprMember.cpp.

References BaseIsNotInSet(), and clang::CXXRecordDecl::forallBases().

Referenced by ClassifyImplicitMemberAccess().

static bool isRecordType ( QualType  T) [static]
static ExprResult LookupMemberExpr ( Sema S,
LookupResult R,
ExprResult BaseExpr,
bool IsArrow,
SourceLocation  OpLoc,
CXXScopeSpec SS,
Decl ObjCImpDecl,
bool  HasTemplateArgs 
) [static]

Look up the given member of the given non-type-dependent expression. This can return in one of two ways: If it returns a sentinel null-but-valid result, the caller will assume that lookup was performed and the results written into the provided structure. It will take over from there. Otherwise, the returned expression will be produced in place of an ordinary member expression.

The ObjCImpDecl bit is a gross hack that will need to be properly fixed for ObjC++.

Definition at line 1177 of file SemaExprMember.cpp.

References CheckExtVectorComponent(), clang::CK_BitCast, clang::CXXScopeSpec::clear(), clang::SelectorTable::constructSetterSelector(), clang::Sema::Context, clang::Sema::CorrectTypo(), clang::FixItHint::CreateRemoval(), clang::FixItHint::CreateReplacement(), clang::Sema::CTK_ErrorRecovery, clang::DeclarationName::CXXDestructorName, clang::declaresSameEntity(), clang::Sema::DefaultFunctionArrayConversion(), clang::Sema::DefaultLvalueConversion(), clang::Sema::Diag(), clang::Sema::diagnoseTypo(), clang::Sema::DiagnoseUseOfDecl(), clang::Sema::Diags, clang::ExprError(), FindGetterSetterNameDecl(), clang::ObjCContainerDecl::FindPropertyDeclaration(), clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::ObjCIvarDecl::getAccessControl(), clang::Type::getAs(), clang::SourceRange::getBegin(), clang::ObjCMethodDecl::getClassInterface(), clang::Sema::getCurFunctionDecl(), clang::Sema::getCurMethodDecl(), clang::Decl::getDeclContext(), clang::NamedDecl::getDeclName(), clang::Preprocessor::getIdentifierTable(), clang::Sema::getLangOpts(), clang::LookupResult::getLookupName(), clang::LookupResult::getLookupNameInfo(), clang::LookupResult::getNameLoc(), clang::SelectorTable::getNullarySelector(), clang::ASTContext::getObjCClassType(), clang::QualType::getObjCLifetime(), clang::ASTContext::getObjCSelRedefinitionType(), clang::ObjCObjectPointerType::getObjectType(), clang::Type::getPointeeType(), clang::CXXScopeSpec::getRange(), clang::CXXScopeSpec::getScopeRep(), clang::Preprocessor::getSelectorTable(), clang::ValueDecl::getType(), clang::Sema::HandleExprPropertyRefExpr(), clang::ASTContext::hasSameUnqualifiedType(), clang::Expr::IgnoreParenCasts(), clang::Expr::IgnoreParenImpCasts(), clang::Sema::ImpCastExprToType(), clang::Type::isDependentType(), clang::CXXScopeSpec::isEmpty(), clang::Type::isExtVectorType(), clang::Type::isFunctionType(), clang::DiagnosticsEngine::isIgnored(), clang::CXXScopeSpec::isInvalid(), clang::Decl::isInvalidDecl(), clang::QualType::isNull(), clang::ObjCObjectType::isObjCClass(), clang::ObjCObjectType::isObjCId(), clang::Type::isObjCSelType(), isPointerToRecordType(), isRecordType(), clang::Type::isRecordType(), clang::Type::isSpecificBuiltinType(), clang::IdentifierInfo::isStr(), clang::ObjCInterfaceDecl::isSuperClassOf(), clang::Sema::IvarBacksCurrentMethodAccessor(), clang::ObjCInterfaceDecl::lookupClassMethod(), clang::ObjCInterfaceDecl::lookupInstanceVariable(), LookupMemberExprInRecord(), clang::Sema::LookupMemberName, clang::ObjCInterfaceDecl::lookupPrivateMethod(), clang::Qualifiers::OCL_Weak, clang::OK_ObjCProperty, clang::OMF_dealloc, clang::OMF_finalize, clang::OMF_init, clang::ObjCIvarDecl::Package, clang::Sema::PDiag(), clang::Sema::PerformMemberExprBaseConversion(), clang::Sema::PP, clang::ObjCIvarDecl::Private, clang::ASTContext::PseudoObjectTy, clang::ObjCIvarDecl::Public, clang::Sema::recordUseOfEvaluatedWeak(), clang::Sema::RequireCompleteType(), ShouldTryAgainWithRedefinitionType(), clang::Sema::tryToRecoverWithCall(), clang::UO_Deref, and clang::VK_LValue.

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

static bool LookupMemberExprInRecord ( Sema SemaRef,
LookupResult R,
Expr BaseExpr,
const RecordType RTy,
SourceLocation  OpLoc,
bool  IsArrow,
CXXScopeSpec SS,
bool  HasTemplateArgs,
TypoExpr *&  TE 
) [static]
static bool ShouldTryAgainWithRedefinitionType ( Sema S,
ExprResult base 
) [static]

Given that normal member access failed on the given expression, and given that the expression's type involves builtin-id or builtin-Class, decide whether substituting in the redefinition types would be profitable. The redefinition type is whatever this translation unit tried to typedef to id/Class; we store it to the side and then re-use it in places like this.

Definition at line 1123 of file SemaExprMember.cpp.

References clang::CK_BitCast, clang::Sema::Context, clang::ActionResult< PtrTy, CompressInvalid >::get(), clang::Type::getAs(), clang::ObjCObjectType::getInterface(), clang::ASTContext::getObjCClassRedefinitionType(), clang::ASTContext::getObjCIdRedefinitionType(), clang::ObjCObjectPointerType::getObjectType(), clang::Expr::getType(), clang::Sema::ImpCastExprToType(), clang::ObjCObjectType::isObjCClass(), and clang::ObjCObjectType::isObjCId().

Referenced by LookupMemberExpr().