]> granicus.if.org Git - clang/commitdiff
Check accessibility when converting object to the base
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 29 Jul 2009 19:40:11 +0000 (19:40 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 29 Jul 2009 19:40:11 +0000 (19:40 +0000)
class.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77497 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaExpr.cpp

index 1a2c8217c904d1593a59e032ea1d2ab691ef443d..b98f27f37e7462057df9393167436e5212f30bde 100644 (file)
@@ -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.
index 6d2186325a6125203108d61ac55ec41074622eec..7e82df44377aa555c1ae13372a8ae9b7ad5c3d8e 100644 (file)
@@ -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));
     }