diff options
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 8 |
3 files changed, 17 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 5123601d8a6..5215a7e0dc4 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1834,8 +1834,7 @@ static void filterNonConflictingPreviousTypedefDecls(Sema &S, continue; } - if (!Old->isExternallyVisible()) - Filter.erase(); + Filter.erase(); } Filter.done(); @@ -3344,6 +3343,9 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) { if (New->isInvalidDecl()) return; + if (!shouldLinkPossiblyHiddenDecl(Previous, New)) + return; + VarTemplateDecl *NewTemplate = New->getDescribedVarTemplate(); // Verify the old decl was also a variable or variable template. @@ -3375,9 +3377,6 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) { return New->setInvalidDecl(); } - if (!shouldLinkPossiblyHiddenDecl(Old, New)) - return; - // Ensure the template parameters are compatible. if (NewTemplate && !TemplateParameterListsAreEqual(NewTemplate->getTemplateParameters(), diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index b7278904185..eb010e9e39a 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -8684,9 +8684,11 @@ Decl *Sema::ActOnNamespaceAliasDef(Scope *S, SourceLocation NamespaceLoc, assert(!R.isAmbiguous() && !R.empty()); // Check if we have a previous declaration with the same name. - NamedDecl *PrevDecl = LookupSingleName(S, Alias, AliasLoc, LookupOrdinaryName, - ForRedeclaration); - if (PrevDecl && !isDeclInScope(PrevDecl, CurContext, S)) + LookupResult PrevR(*this, Alias, AliasLoc, LookupOrdinaryName, + ForRedeclaration); + LookupQualifiedName(PrevR, CurContext->getRedeclContext()); + NamedDecl *PrevDecl = PrevR.getAsSingle<NamedDecl>(); + if (PrevDecl && !isVisible(PrevDecl)) PrevDecl = nullptr; NamedDecl *ND = R.getFoundDecl(); diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 7236e99942b..9b5d511818e 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -1547,6 +1547,14 @@ bool Sema::isVisibleSlow(const NamedDecl *D) { return LookupResult::isVisible(*this, const_cast<NamedDecl*>(D)); } +bool Sema::shouldLinkPossiblyHiddenDecl(LookupResult &R, const NamedDecl *New) { + for (auto *D : R) { + if (isVisible(D)) + return true; + } + return New->isExternallyVisible(); +} + /// \brief Retrieve the visible declaration corresponding to D, if any. /// /// This routine determines whether the declaration D is visible in the current |