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
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index f9abb3d..6d21863 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1023,6 +1023,22 @@
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 @@
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 @@
}
MarkDeclarationReferenced(MemberLoc, FD);
+ PerformObjectMemberConversion(BaseExpr, FD);
return Owned(new (Context) MemberExpr(BaseExpr, OpKind == tok::arrow, FD,
MemberLoc, MemberType));
}