зеркало из https://github.com/microsoft/clang-1.git
Introduce a "Hidden" bit into Decl, to track whether that declaration
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
This commit is contained in:
Родитель
9b8b20f7a4
Коммит
f143ffc4a9
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче