aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-07-29 19:40:11 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-07-29 19:40:11 +0000
commitf3e53d35d0ed1a156baf7ccfec65e6a38648c632 (patch)
tree878d4fb13631856d3010f7d3283a7014291c0dc0 /lib
parent3c4972def972f8ca44dcd0561779a12aaa6fec97 (diff)
Check accessibility when converting object to the base
class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77497 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Sema/Sema.h2
-rw-r--r--lib/Sema/SemaExpr.cpp22
2 files changed, 19 insertions, 5 deletions
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 1a2c8217c9..b98f27f37e 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -691,7 +691,7 @@ public:
ImplicitConversionSequence TryContextuallyConvertToBool(Expr *From);
bool PerformContextuallyConvertToBool(Expr *&From);
- void PerformObjectMemberConversion(Expr *&From, NamedDecl *Member);
+ bool 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 6d2186325a..7e82df4437 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1024,7 +1024,7 @@ 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
+bool
Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) {
if (FieldDecl *FD = dyn_cast<FieldDecl>(Member))
if (CXXRecordDecl *RD =
@@ -1033,11 +1033,23 @@ Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) {
Context.getCanonicalType(Context.getTypeDeclType(RD));
if (!DestType->isDependentType() &&
!From->getType()->isDependentType()) {
- if (From->getType()->getAsPointerType())
+ QualType FromRecordType = From->getType();
+ QualType DestRecordType = DestType;
+ if (FromRecordType->getAsPointerType()) {
DestType = Context.getPointerType(DestType);
+ FromRecordType = FromRecordType->getPointeeType();
+ }
+ if (IsDerivedFrom(FromRecordType, DestRecordType) &&
+ CheckDerivedToBaseConversion(FromRecordType,
+ DestRecordType,
+ From->getSourceRange().getBegin(),
+ From->getSourceRange()))
+ return true;
+
ImpCastExprToType(From, DestType, /*isLvalue=*/true);
}
}
+ return false;
}
/// \brief Complete semantic analysis for a reference to the given declaration.
@@ -1130,7 +1142,8 @@ Sema::BuildDeclarationNameExpr(SourceLocation Loc, NamedDecl *D,
Expr *This = new (Context) CXXThisExpr(SourceLocation(),
MD->getThisType(Context));
MarkDeclarationReferenced(Loc, D);
- PerformObjectMemberConversion(This, D);
+ if (PerformObjectMemberConversion(This, D))
+ return ExprError();
return Owned(new (Context) MemberExpr(This, true, D,
Loc, MemberType));
}
@@ -2207,7 +2220,8 @@ Sema::ActOnMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
}
MarkDeclarationReferenced(MemberLoc, FD);
- PerformObjectMemberConversion(BaseExpr, FD);
+ if (PerformObjectMemberConversion(BaseExpr, FD))
+ return ExprError();
return Owned(new (Context) MemberExpr(BaseExpr, OpKind == tok::arrow, FD,
MemberLoc, MemberType));
}