diff options
| author | Anders Carlsson <andersca@mac.com> | 2010-04-21 18:47:17 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2010-04-21 18:47:17 +0000 |
| commit | a01874bf44d7b2cdd2f2189ef07d68e1dc4c9b65 (patch) | |
| tree | 4c391de423a9715dcfdafa971afc25048cdfdfac /clang/lib/Sema/SemaAccess.cpp | |
| parent | 4c7f50afb8f23509d38f98012326a1a367f77284 (diff) | |
| download | bcm5719-llvm-a01874bf44d7b2cdd2f2189ef07d68e1dc4c9b65.tar.gz bcm5719-llvm-a01874bf44d7b2cdd2f2189ef07d68e1dc4c9b65.zip | |
Pass the InitializedEntity to Sema::CheckConstructorAccess and use it to report different diagnostics depending on which entity is being initialized.
llvm-svn: 102010
Diffstat (limited to 'clang/lib/Sema/SemaAccess.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaAccess.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaAccess.cpp b/clang/lib/Sema/SemaAccess.cpp index 352477b8590..1658b699c6b 100644 --- a/clang/lib/Sema/SemaAccess.cpp +++ b/clang/lib/Sema/SemaAccess.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "Sema.h" +#include "SemaInit.h" #include "Lookup.h" #include "clang/AST/ASTContext.h" #include "clang/AST/CXXInheritance.h" @@ -1127,18 +1128,28 @@ Sema::AccessResult Sema::CheckDestructorAccess(SourceLocation Loc, /// Checks access to a constructor. Sema::AccessResult Sema::CheckConstructorAccess(SourceLocation UseLoc, CXXConstructorDecl *Constructor, + const InitializedEntity &Entity, AccessSpecifier Access) { if (!getLangOptions().AccessControl || Access == AS_public) return AR_accessible; CXXRecordDecl *NamingClass = Constructor->getParent(); - AccessTarget Entity(Context, AccessTarget::Member, NamingClass, - DeclAccessPair::make(Constructor, Access), - QualType()); - Entity.setDiag(diag::err_access_ctor); + AccessTarget AccessEntity(Context, AccessTarget::Member, NamingClass, + DeclAccessPair::make(Constructor, Access), + QualType()); + switch (Entity.getKind()) { + default: + AccessEntity.setDiag(diag::err_access_ctor); + break; + + case InitializedEntity::EK_Base: + AccessEntity.setDiag(PDiag(diag::err_access_ctor_base) + << Entity.getBaseSpecifier()->getType()); + break; + } - return CheckAccess(*this, UseLoc, Entity); + return CheckAccess(*this, UseLoc, AccessEntity); } /// Checks direct (i.e. non-inherited) access to an arbitrary class |

