From f3e53d35d0ed1a156baf7ccfec65e6a38648c632 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 29 Jul 2009 19:40:11 +0000 Subject: [PATCH] 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 --- lib/Sema/Sema.h | 2 +- lib/Sema/SemaExpr.cpp | 22 ++++++++++++++++++---- 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(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)); } -- 2.40.0