diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-26 19:06:56 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-10-26 19:06:56 +0000 |
| commit | cab9a7d51c174b13498ebd75ceda801692198755 (patch) | |
| tree | a504b3bf233bdba62fafff4af467a5e19a8b0502 /clang/lib/Sema/TreeTransform.h | |
| parent | 16133782dc4a94793aa4b0488ac5ea097648a88f (diff) | |
| download | bcm5719-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.h | 50 |
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()); } |

