Skip to content

Commit

Permalink
Pull out conversion on LHS of -> and . into its own function. This ha…
Browse files Browse the repository at this point in the history
…ppens

implicitly in LookupMemberExpr and explicitly in cases where template
instantiation doesn't redo the lookup.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143046 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
zygoloid committed Oct 26, 2011
1 parent d488b3a commit 9138b4e
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 42 deletions.
1 change: 1 addition & 0 deletions include/clang/Sema/Sema.h
Expand Up @@ -2443,6 +2443,7 @@ class Sema {
const TemplateArgumentListInfo *TemplateArgs,
bool SuppressQualifierCheck = false);

ExprResult PerformMemberExprBaseConversion(Expr *Base, bool IsArrow);
ExprResult LookupMemberExpr(LookupResult &R, ExprResult &Base,
bool &IsArrow, SourceLocation OpLoc,
CXXScopeSpec &SS,
Expand Down
19 changes: 12 additions & 7 deletions lib/Sema/SemaExprMember.cpp
Expand Up @@ -970,6 +970,17 @@ static bool isPointerToRecordType(QualType T) {
return false;
}

/// Perform conversions on the LHS of a member access expression.
ExprResult
Sema::PerformMemberExprBaseConversion(Expr *Base, bool IsArrow) {
ExprResult BaseResult = DefaultFunctionArrayConversion(Base);

if (!BaseResult.isInvalid() && IsArrow)
BaseResult = DefaultLvalueConversion(BaseResult.take());

return BaseResult;
}

/// 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
Expand All @@ -988,16 +999,10 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr,
assert(BaseExpr.get() && "no base expression");

// Perform default conversions.
BaseExpr = DefaultFunctionArrayConversion(BaseExpr.take());
BaseExpr = PerformMemberExprBaseConversion(BaseExpr.take(), IsArrow);
if (BaseExpr.isInvalid())
return ExprError();

if (IsArrow) {
BaseExpr = DefaultLvalueConversion(BaseExpr.take());
if (BaseExpr.isInvalid())
return ExprError();
}

QualType BaseType = BaseExpr.get()->getType();
assert(!BaseType->isDependentType());

Expand Down
50 changes: 15 additions & 35 deletions lib/Sema/TreeTransform.h
Expand Up @@ -1468,6 +1468,8 @@ class TreeTransform {
NamedDecl *FoundDecl,
const TemplateArgumentListInfo *ExplicitTemplateArgs,
NamedDecl *FirstQualifierInScope) {
ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
isArrow);
if (!Member->getDeclName()) {
// We have a reference to an unnamed field. This is always the
// base of an anonymous struct/union member access, i.e. the
Expand All @@ -1476,17 +1478,12 @@ class TreeTransform {
assert(Member->getType()->isRecordType() &&
"unnamed member not of record type?");

ExprResult BaseResult =
getSema().PerformObjectMemberConversion(Base,
BaseResult =
getSema().PerformObjectMemberConversion(BaseResult.take(),
QualifierLoc.getNestedNameSpecifier(),
FoundDecl, Member);
if (BaseResult.isInvalid())
return ExprError();
if (isArrow) {
BaseResult = getSema().DefaultLvalueConversion(BaseResult.take());
if (BaseResult.isInvalid())
return ExprError();
}
Base = BaseResult.take();
ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
MemberExpr *ME =
Expand All @@ -1500,14 +1497,6 @@ class TreeTransform {
CXXScopeSpec SS;
SS.Adopt(QualifierLoc);

ExprResult BaseResult = getSema().DefaultFunctionArrayConversion(Base);
if (BaseResult.isInvalid())
return ExprError();
if (isArrow) {
BaseResult = getSema().DefaultLvalueConversion(BaseResult.get());
if (BaseResult.isInvalid())
return ExprError();
}
Base = BaseResult.take();
QualType BaseType = Base->getType();

Expand Down Expand Up @@ -2134,30 +2123,16 @@ class TreeTransform {
///
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE,
QualType BaseType,
SourceLocation OperatorLoc,
bool IsArrow,
NestedNameSpecifierLoc QualifierLoc,
NamedDecl *FirstQualifierInScope,
LookupResult &R,
ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
SourceLocation OperatorLoc,
bool IsArrow,
NestedNameSpecifierLoc QualifierLoc,
NamedDecl *FirstQualifierInScope,
LookupResult &R,
const TemplateArgumentListInfo *TemplateArgs) {
CXXScopeSpec SS;
SS.Adopt(QualifierLoc);

if (BaseE) {
ExprResult BaseResult = getSema().DefaultFunctionArrayConversion(BaseE);
if (BaseResult.isInvalid())
return ExprError();
if (IsArrow) {
BaseResult = getSema().DefaultLvalueConversion(BaseResult.take());
if (BaseResult.isInvalid())
return ExprError();
}
BaseE = BaseResult.take();
BaseType = BaseE->getType();
}

return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
OperatorLoc, IsArrow,
SS, FirstQualifierInScope,
Expand Down Expand Up @@ -7707,6 +7682,11 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)
Base = getDerived().TransformExpr(Old->getBase());
if (Base.isInvalid())
return ExprError();
Base = getSema().PerformMemberExprBaseConversion(Base.take(),
Old->isArrow());
if (Base.isInvalid())
return ExprError();
BaseType = Base.get()->getType();
} else {
BaseType = getDerived().TransformType(Old->getBaseType());
}
Expand Down

0 comments on commit 9138b4e

Please sign in to comment.