aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-07-29 18:40:24 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-07-29 18:40:24 +0000
commit98a541e80848d3b7d1131237ac04e698faffd151 (patch)
tree80af2e9ff7e3c1648ea83f11e16ac210131f4d86 /lib/Sema
parentd99cbe66403ee39c2ee58024b9582b95649a4fc5 (diff)
Patch to provide cast of objects in member access
excpression, if needed, and remove some ir-gen code now unnencessary. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77490 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r--lib/Sema/Sema.h2
-rw-r--r--lib/Sema/SemaExpr.cpp18
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 79ea3e1303..1a2c8217c9 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -690,6 +690,8 @@ public:
ImplicitConversionSequence TryContextuallyConvertToBool(Expr *From);
bool PerformContextuallyConvertToBool(Expr *&From);
+
+ void PerformObjectMemberConversion(Expr *&From, NamedDecl *Member);
/// OverloadingResult - Capture the result of performing overload
/// resolution.
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index f9abb3dbd9..6d2186325a 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1023,6 +1023,22 @@ Sema::ActOnDeclarationNameExpr(Scope *S, SourceLocation Loc,
return BuildDeclarationNameExpr(Loc, D, HasTrailingLParen, SS, isAddressOfOperand);
}
+/// \brief Cast member's object to its own class if necessary.
+void
+Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) {
+ if (FieldDecl *FD = dyn_cast<FieldDecl>(Member))
+ if (CXXRecordDecl *RD =
+ dyn_cast<CXXRecordDecl>(FD->getDeclContext())) {
+ QualType DestType =
+ Context.getCanonicalType(Context.getTypeDeclType(RD));
+ if (!DestType->isDependentType() &&
+ !From->getType()->isDependentType()) {
+ if (From->getType()->getAsPointerType())
+ DestType = Context.getPointerType(DestType);
+ ImpCastExprToType(From, DestType, /*isLvalue=*/true);
+ }
+ }
+}
/// \brief Complete semantic analysis for a reference to the given declaration.
Sema::OwningExprResult
@@ -1114,6 +1130,7 @@ Sema::BuildDeclarationNameExpr(SourceLocation Loc, NamedDecl *D,
Expr *This = new (Context) CXXThisExpr(SourceLocation(),
MD->getThisType(Context));
MarkDeclarationReferenced(Loc, D);
+ PerformObjectMemberConversion(This, D);
return Owned(new (Context) MemberExpr(This, true, D,
Loc, MemberType));
}
@@ -2190,6 +2207,7 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
}
MarkDeclarationReferenced(MemberLoc, FD);
+ PerformObjectMemberConversion(BaseExpr, FD);
return Owned(new (Context) MemberExpr(BaseExpr, OpKind == tok::arrow, FD,
MemberLoc, MemberType));
}