summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-10-26 19:06:56 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-10-26 19:06:56 +0000
commitcab9a7d51c174b13498ebd75ceda801692198755 (patch)
treea504b3bf233bdba62fafff4af467a5e19a8b0502 /clang/lib/Sema/TreeTransform.h
parent16133782dc4a94793aa4b0488ac5ea097648a88f (diff)
downloadbcm5719-llvm-cab9a7d51c174b13498ebd75ceda801692198755.tar.gz
bcm5719-llvm-cab9a7d51c174b13498ebd75ceda801692198755.zip
Pull out conversion on LHS of -> and . into its own function. This happens
implicitly in LookupMemberExpr and explicitly in cases where template instantiation doesn't redo the lookup. llvm-svn: 143046
Diffstat (limited to 'clang/lib/Sema/TreeTransform.h')
-rw-r--r--clang/lib/Sema/TreeTransform.h50
1 files changed, 15 insertions, 35 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 6fb1315c2ed..5596a9a6caa 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -1468,6 +1468,8 @@ public:
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
@@ -1476,17 +1478,12 @@ public:
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 =
@@ -1500,14 +1497,6 @@ public:
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();
@@ -2134,30 +2123,16 @@ public:
///
/// 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,
@@ -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());
}
OpenPOWER on IntegriCloud