From: Douglas Gregor Date: Thu, 3 Nov 2011 16:51:37 +0000 (+0000) Subject: Refactor Sema::IsSimplyAccessible slightly, to work on a DeclContext rather than... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=17015eff2b3166e445377b15913474b472775e7c;p=clang Refactor Sema::IsSimplyAccessible slightly, to work on a DeclContext rather than a class git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143615 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 9720295613..b5ef30a6f4 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -3754,7 +3754,7 @@ public: bool ForceCheck = false, bool ForceUnprivileged = false); void CheckLookupAccess(const LookupResult &R); - bool IsSimplyAccessible(NamedDecl *decl, CXXRecordDecl *Class); + bool IsSimplyAccessible(NamedDecl *decl, DeclContext *Ctx); void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs); diff --git a/lib/Sema/SemaAccess.cpp b/lib/Sema/SemaAccess.cpp index 6cd9230326..83ca553aa6 100644 --- a/lib/Sema/SemaAccess.cpp +++ b/lib/Sema/SemaAccess.cpp @@ -1651,19 +1651,24 @@ void Sema::CheckLookupAccess(const LookupResult &R) { /// \param Decl the declaration to check if it can be accessed /// \param Class the class/context from which to start the search /// \return true if the Decl is accessible from the Class, false otherwise. -bool Sema::IsSimplyAccessible(NamedDecl *Decl, CXXRecordDecl *Class) { - if (!Class || !Decl->isCXXClassMember()) - return true; +bool Sema::IsSimplyAccessible(NamedDecl *Decl, DeclContext *Ctx) { + if (CXXRecordDecl *Class = dyn_cast(Ctx)) { + if (!Class || !Decl->isCXXClassMember()) + return true; - QualType qType = Class->getTypeForDecl()->getCanonicalTypeInternal(); - AccessTarget Entity(Context, AccessedEntity::Member, Class, - DeclAccessPair::make(Decl, Decl->getAccess()), - qType); - if (Entity.getAccess() == AS_public) - return true; + QualType qType = Class->getTypeForDecl()->getCanonicalTypeInternal(); + AccessTarget Entity(Context, AccessedEntity::Member, Class, + DeclAccessPair::make(Decl, Decl->getAccess()), + qType); + if (Entity.getAccess() == AS_public) + return true; - EffectiveContext EC(CurContext); - return ::IsAccessible(*this, EC, Entity) != ::AR_inaccessible; + EffectiveContext EC(CurContext); + return ::IsAccessible(*this, EC, Entity) != ::AR_inaccessible; + } + + // FIXME: Check access for Objective-C ivars. + return true; } void Sema::ActOnStartSuppressingAccessChecks() { diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index f964ec1483..2bff705060 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -1189,11 +1189,9 @@ namespace { virtual void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx, bool InBaseClass) { bool Accessible = true; - if (Ctx) { - if (CXXRecordDecl *Class = dyn_cast(Ctx)) - Accessible = Results.getSema().IsSimplyAccessible(ND, Class); - // FIXME: ObjC access checks are missing. - } + if (Ctx) + Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx); + ResultBuilder::Result Result(ND, 0, false, Accessible); Results.AddResult(Result, CurContext, Hiding, InBaseClass); }