]> granicus.if.org Git - clang/commitdiff
Add a stubbed out CheckBaseClassAccess method.
authorAnders Carlsson <andersca@mac.com>
Fri, 27 Mar 2009 05:05:05 +0000 (05:05 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 27 Mar 2009 05:05:05 +0000 (05:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67821 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaAccess.cpp
lib/Sema/SemaInherit.cpp

index 8c8cae2c8c18a7f343d7a26609968d2483595cd8..ac260c2e202dc6a0cd5bceb30f316257467f50f9 100644 (file)
@@ -1616,13 +1616,6 @@ public:
                                  FunctionDecl::StorageClass& SC);
   DeclTy *ActOnConversionDeclarator(CXXConversionDecl *Conversion);
 
-  /// SetMemberAccessSpecifier - Set the access specifier of a member.
-  /// Returns true on error (when the previous member decl access specifier
-  /// is different from the new member decl access specifier).
-  bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, 
-                                NamedDecl *PrevMemberDecl,
-                                AccessSpecifier LexicalAS);
-  
   //===--------------------------------------------------------------------===//
   // C++ Derived Classes
   //
@@ -1652,6 +1645,18 @@ public:
                                     SourceLocation Loc, SourceRange Range);
   std::string getAmbiguousPathsDisplayString(BasePaths &Paths);
 
+  //===--------------------------------------------------------------------===//
+  // C++ Access Control
+  //
+  
+  bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, 
+                                NamedDecl *PrevMemberDecl,
+                                AccessSpecifier LexicalAS);
+  
+  bool CheckBaseClassAccess(QualType Derived, QualType Base, 
+                            BasePaths& Paths, SourceLocation AccessLoc);
+  
+  
   enum AbstractDiagSelID {
     AbstractNone = -1,
     AbstractReturnType,
index 2ac9a539f3e9a5a2a02f4d76b3c91b12d987276c..e44ef5f9ea48a88c7ebea4c5521a79709f2b65e1 100644 (file)
@@ -1,4 +1,4 @@
-//===---- SemaInherit.cpp - C++ Access Control ------------------*- C++ -*-===//
+//===---- SemaAccess.cpp - C++ Access Control -------------------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -14,6 +14,9 @@
 #include "Sema.h"
 using namespace clang;
 
+/// SetMemberAccessSpecifier - Set the access specifier of a member.
+/// Returns true on error (when the previous member decl access specifier
+/// is different from the new member decl access specifier).
 bool Sema::SetMemberAccessSpecifier(NamedDecl *MemberDecl, 
                                     NamedDecl *PrevMemberDecl,
                                     AccessSpecifier LexicalAS) {
@@ -37,3 +40,10 @@ bool Sema::SetMemberAccessSpecifier(NamedDecl *MemberDecl,
   MemberDecl->setAccess(PrevMemberDecl->getAccess());
   return false;
 }
+
+/// CheckBaseClassAccess - Check that a derived class can access its base class
+/// and report an error if it can't. [class.access.base]
+bool Sema::CheckBaseClassAccess(QualType Derived, QualType Base, 
+                                BasePaths& Paths, SourceLocation AccessLoc) {
+  return false;
+}
index ce95a1e614aa7c139c05d489b8c8bc66519358d5..c572f62d611b46503eb809f41844c2e615d2c352 100644 (file)
@@ -202,7 +202,7 @@ bool Sema::LookupInBases(CXXRecordDecl *Class,
 /// CheckDerivedToBaseConversion - Check whether the Derived-to-Base
 /// conversion (where Derived and Base are class types) is
 /// well-formed, meaning that the conversion is unambiguous (and
-/// FIXME: that all of the base classes are accessible). Returns true
+/// that all of the base classes are accessible). Returns true
 /// and emits a diagnostic if the code is ill-formed, returns false
 /// otherwise. Loc is the location where this routine should point to
 /// if there is an error, and Range is the source range to highlight
@@ -214,15 +214,17 @@ Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base,
   // ambiguous. This is slightly more expensive than checking whether
   // the Derived to Base conversion exists, because here we need to
   // explore multiple paths to determine if there is an ambiguity.
-  BasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/false,
+  BasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
                   /*DetectVirtual=*/false);
   bool DerivationOkay = IsDerivedFrom(Derived, Base, Paths);
   assert(DerivationOkay &&
          "Can only be used with a derived-to-base conversion");
   (void)DerivationOkay;
 
-  if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType()))
-    return false;
+  if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType())) {
+    // Check that the base class can be accessed.
+    return CheckBaseClassAccess(Derived, Base, Paths, Loc);
+  }
 
   // We know that the derived-to-base conversion is ambiguous, and
   // we're going to produce a diagnostic. Perform the derived-to-base