clang  6.0.0svn
Typedefs | Enumerations | Functions
SemaExprMember.cpp File Reference
#include "clang/Sema/Overload.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 "clang/Sema/SemaInternal.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 isProvablyNotDerivedFrom (Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
 Determines if the given class is provably not derived from all of the prospective base classes. More...
 
static IMAKind ClassifyImplicitMemberAccess (Sema &SemaRef, const LookupResult &R)
 The given lookup names class member(s) and is not being used for an address-of-member expression. More...
 
static void diagnoseInstanceReference (Sema &SemaRef, const CXXScopeSpec &SS, NamedDecl *Rep, const DeclarationNameInfo &nameInfo)
 Diagnose a reference to a field with no object available. More...
 
static bool IsRGBA (char c)
 Determine whether input char is from rgba component set. More...
 
static bool IsValidOpenCLComponentSwizzleLength (unsigned len)
 
static QualType CheckExtVectorComponent (Sema &S, QualType baseType, ExprValueKind &VK, SourceLocation OpLoc, const IdentifierInfo *CompName, SourceLocation CompLoc)
 Check an ext-vector component access expression. More...
 
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)
 We know that the given qualified member reference points only to declarations which do not belong to the static type of the base expression. More...
 
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)
 Look up the given member of the given non-type-dependent expression. More...
 
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, SourceLocation OpLoc, 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. More...
 
static bool IsInFnTryBlockHandler (const Scope *S)
 Determine if the given scope is within a function-try-block handler. More...
 
static VarDeclgetVarTemplateSpecialization (Sema &S, VarTemplateDecl *VarTempl, const TemplateArgumentListInfo *TemplateArgs, const DeclarationNameInfo &MemberNameInfo, SourceLocation TemplateKWLoc)
 
static bool ShouldTryAgainWithRedefinitionType (Sema &S, ExprResult &base)
 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. More...
 
static bool isRecordType (QualType T)
 
static bool isPointerToRecordType (QualType T)
 

Typedef Documentation

◆ BaseSet

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

Definition at line 29 of file SemaExprMember.cpp.

Enumeration Type Documentation

◆ IMAKind

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 41 of file SemaExprMember.cpp.

Function Documentation

◆ BuildMemberExpr()

static MemberExpr* BuildMemberExpr ( Sema SemaRef,
ASTContext C,
Expr Base,
bool  isArrow,
SourceLocation  OpLoc,
const CXXScopeSpec SS,
SourceLocation  TemplateKWLoc,
ValueDecl Member,
DeclAccessPair  FoundDecl,
const DeclarationNameInfo MemberNameInfo,
QualType  Ty,
ExprValueKind  VK,
ExprObjectKind  OK,
const TemplateArgumentListInfo TemplateArgs = nullptr 
)
static

Build a MemberExpr AST node.

Definition at line 926 of file SemaExprMember.cpp.

◆ BuildMSPropertyRefExpr()

static ExprResult BuildMSPropertyRefExpr ( Sema S,
Expr BaseExpr,
bool  IsArrow,
const CXXScopeSpec SS,
MSPropertyDecl PD,
const DeclarationNameInfo NameInfo 
)
static

◆ CheckExtVectorComponent()

static QualType CheckExtVectorComponent ( Sema S,
QualType  baseType,
ExprValueKind VK,
SourceLocation  OpLoc,
const IdentifierInfo CompName,
SourceLocation  CompLoc 
)
static

Check an ext-vector component access expression.

VK should be set in advance to the value kind of the base expression.

Definition at line 300 of file SemaExprMember.cpp.

Referenced by LookupMemberExpr().

◆ ClassifyImplicitMemberAccess()

static IMAKind ClassifyImplicitMemberAccess ( Sema SemaRef,
const LookupResult R 
)
static

◆ diagnoseInstanceReference()

static void diagnoseInstanceReference ( Sema SemaRef,
const CXXScopeSpec SS,
NamedDecl Rep,
const DeclarationNameInfo nameInfo 
)
static

◆ DiagnoseQualifiedMemberReference()

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 523 of file SemaExprMember.cpp.

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

◆ FindGetterSetterNameDecl()

static Decl* FindGetterSetterNameDecl ( const ObjCObjectPointerType QIdTy,
IdentifierInfo Member,
const Selector Sel,
ASTContext Context 
)
static

Definition at line 450 of file SemaExprMember.cpp.

Referenced by LookupMemberExpr().

◆ FindGetterSetterNameDeclFromProtocolList()

static Decl* FindGetterSetterNameDeclFromProtocolList ( const ObjCProtocolDecl PDecl,
IdentifierInfo Member,
const Selector Sel,
ASTContext Context 
)
static

Definition at line 431 of file SemaExprMember.cpp.

◆ getVarTemplateSpecialization()

static VarDecl* getVarTemplateSpecialization ( Sema S,
VarTemplateDecl VarTempl,
const TemplateArgumentListInfo TemplateArgs,
const DeclarationNameInfo MemberNameInfo,
SourceLocation  TemplateKWLoc 
)
static

◆ IsInFnTryBlockHandler()

static bool IsInFnTryBlockHandler ( const Scope S)
static

Determine if the given scope is within a function-try-block handler.

Definition at line 941 of file SemaExprMember.cpp.

References clang::Scope::FnTryCatchScope, clang::Scope::getFlags(), clang::Scope::getFnParent(), clang::Scope::getParent(), and clang::Scope::TryScope.

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

◆ isPointerToRecordType()

static bool isPointerToRecordType ( QualType  T)
static

Definition at line 1239 of file SemaExprMember.cpp.

References clang::Type::getAs().

Referenced by LookupMemberExpr().

◆ isProvablyNotDerivedFrom()

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 33 of file SemaExprMember.cpp.

References clang::CXXRecordDecl::forallBases().

Referenced by ClassifyImplicitMemberAccess(), and clang::CXXRecordDecl::isLocalClass().

◆ isRecordType()

static bool isRecordType ( QualType  T)
static

◆ IsRGBA()

static bool IsRGBA ( char  c)
static

Determine whether input char is from rgba component set.

Definition at line 275 of file SemaExprMember.cpp.

◆ IsValidOpenCLComponentSwizzleLength()

static bool IsValidOpenCLComponentSwizzleLength ( unsigned  len)
static

Definition at line 290 of file SemaExprMember.cpp.

◆ LookupMemberExpr()

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 1264 of file SemaExprMember.cpp.

References Category, CheckExtVectorComponent(), 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::ObjCIvarDecl::getUsageType(), 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::OBJC_PR_query_instance, 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(), and clang::VK_LValue.

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

◆ LookupMemberExprInRecord()

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

◆ ShouldTryAgainWithRedefinitionType()

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 1210 of file SemaExprMember.cpp.

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

Referenced by LookupMemberExpr().