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 Decl * FindGetterSetterNameDeclFromProtocolList (const ObjCProtocolDecl *PDecl, IdentifierInfo *Member, const Selector &Sel, ASTContext &Context)
static Decl * FindGetterSetterNameDecl (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 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)
 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().