]> granicus.if.org Git - clang/commitdiff
Introduce a "Hidden" bit into Decl, to track whether that declaration
authorDouglas Gregor <dgregor@apple.com>
Fri, 6 Jan 2012 16:22:39 +0000 (16:22 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 6 Jan 2012 16:22:39 +0000 (16:22 +0000)
is hidden from name lookup. The previous hack of tweaking the
ModulePrivate bit when loading a declaration from a hidden submodule
was brittle.

Note that we now have 34 bits in Decl. I'll fix that next.

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

include/clang/AST/Decl.h
include/clang/AST/DeclBase.h
include/clang/Sema/Lookup.h
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTReaderDecl.cpp

index f27330b7aca7f57776d9968ed845a9d2fa98914b..bbd3ef3a20599796aa8cd102c9bb2030a92b770f 100644 (file)
@@ -195,6 +195,9 @@ public:
     ModulePrivate = MP;
   }
 
+  /// \brief Determine whether this declaration is hidden from name lookup.
+  bool isHidden() const { return Hidden; }
+  
   /// \brief Determine whether this declaration is a C++ class member.
   bool isCXXClassMember() const {
     const DeclContext *DC = getDeclContext();
index 09e1fdcd63a5e9cdad67ea36e6c28b255481d733..c2303bcf51f8577b19a6734fccb20efe793fd43d 100644 (file)
@@ -263,6 +263,11 @@ protected:
   /// defined.
   unsigned ModulePrivate : 1;
 
+  /// \brief Whether this declaration is hidden from normal name lookup, e.g.,
+  /// because it is was loaded from an AST file is either module-private or
+  /// because its submodule has not been made visible.
+  unsigned Hidden : 1;
+  
   /// IdentifierNamespace - This specifies what IDNS_* namespace this lives in.
   unsigned IdentifierNamespace : 12;
 
@@ -290,7 +295,7 @@ protected:
       Loc(L), DeclKind(DK), InvalidDecl(0),
       HasAttrs(false), Implicit(false), Used(false), Referenced(false),
       TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
-      ModulePrivate(0),
+      ModulePrivate(0), Hidden(0),
       IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
       HasCachedLinkage(0)
   {
@@ -301,7 +306,7 @@ protected:
     : NextDeclInContext(0), DeclKind(DK), InvalidDecl(0),
       HasAttrs(false), Implicit(false), Used(false), Referenced(false),
       TopLevelDeclInObjCContainer(false), Access(AS_none), FromASTFile(0),
-      ModulePrivate(0),
+      ModulePrivate(0), Hidden(0),
       IdentifierNamespace(getIdentifierNamespaceForKind(DK)),
       HasCachedLinkage(0)
   {
index 6486e53bedd00c8233009adf4b22d083f577c3af..1c24d20ee835ceb79429a792d9cd26604006cbaa 100644 (file)
@@ -275,9 +275,8 @@ public:
   /// \brief Determine whether the given declaration is visible to the
   /// program.
   static bool isVisible(NamedDecl *D) {
-    // So long as this declaration is not module-private or was parsed as
-    // part of this translation unit (i.e., in the module), it's visible.
-    if (!D->isModulePrivate() || !D->isFromASTFile())
+    // If this declaration is not hidden, it's visible.
+    if (!D->isHidden())
       return true;
     
     // FIXME: We should be allowed to refer to a module-private name from 
index 2864fcf48ba9b1f4bedb86723b90f898a38c29b7..df158599ded3ae7ba5bb177b534735d838fc27a7 100644 (file)
@@ -2496,7 +2496,7 @@ ASTReader::ASTReadResult ASTReader::validateFileEntries(ModuleFile &M) {
 void ASTReader::makeNamesVisible(const HiddenNames &Names) {
   for (unsigned I = 0, N = Names.size(); I != N; ++I) {
     if (Decl *D = Names[I].dyn_cast<Decl *>())
-      D->ModulePrivate = false;
+      D->Hidden = false;
     else {
       IdentifierInfo *II = Names[I].get<IdentifierInfo *>();
       if (!II->hasMacroDefinition()) {
index 0672129f1e8e1cb784d1bd481148cd24fe24fec0..6a88313f743cfef1d44bc657ef93746449a14de3 100644 (file)
@@ -364,7 +364,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
   D->setAccess((AccessSpecifier)Record[Idx++]);
   D->FromASTFile = true;
   D->ModulePrivate = Record[Idx++];
-
+  D->Hidden = D->ModulePrivate;
+  
   // Determine whether this declaration is part of a (sub)module. If so, it
   // may not yet be visible.
   if (unsigned SubmoduleID = readSubmoduleID(Record, Idx)) {
@@ -372,9 +373,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
     if (!D->ModulePrivate) {
       if (Module *Owner = Reader.getSubmodule(SubmoduleID)) {
         if (Owner->NameVisibility != Module::AllVisible) {
-          // The owning module is not visible. Mark this declaration as
-          // module-private, 
-          D->ModulePrivate = true;
+          // The owning module is not visible. Mark this declaration as hidden.
+          D->Hidden = true;
           
           // Note that this declaration was hidden because its owning module is 
           // not yet visible.