diff options
| -rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 12 | ||||
| -rw-r--r-- | clang/test/Modules/local-visibility.cpp | 15 |
2 files changed, 24 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index d2d4171c937..984247bacc6 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -1452,6 +1452,8 @@ template<typename Filter> static bool hasVisibleDeclarationImpl(Sema &S, const NamedDecl *D, llvm::SmallVectorImpl<Module *> *Modules, Filter F) { + bool HasFilteredRedecls = false; + for (auto *Redecl : D->redecls()) { auto *R = cast<NamedDecl>(Redecl); if (!F(R)) @@ -1460,6 +1462,8 @@ static bool hasVisibleDeclarationImpl(Sema &S, const NamedDecl *D, if (S.isVisible(R)) return true; + HasFilteredRedecls = true; + if (Modules) { Modules->push_back(R->getOwningModule()); const auto &Merged = S.Context.getModulesWithMergedDefinition(R); @@ -1467,7 +1471,11 @@ static bool hasVisibleDeclarationImpl(Sema &S, const NamedDecl *D, } } - return false; + // Only return false if there is at least one redecl that is not filtered out. + if (HasFilteredRedecls) + return false; + + return true; } bool Sema::hasVisibleExplicitSpecialization( @@ -1497,8 +1505,6 @@ bool Sema::hasVisibleMemberSpecialization( // class definition? return D->getLexicalDeclContext()->isFileContext(); }); - - return false; } /// Determine whether a declaration is visible to name lookup. diff --git a/clang/test/Modules/local-visibility.cpp b/clang/test/Modules/local-visibility.cpp new file mode 100644 index 00000000000..fa2d20c4336 --- /dev/null +++ b/clang/test/Modules/local-visibility.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -fmodules %s -verify +// RUN: %clang_cc1 -fsyntax-only %s -verify + +// expected-no-diagnostics +template <typename Var> +struct S { + template <unsigned N> + struct Inner { }; + + template <> + struct Inner<0> { }; +}; + +S<int>::Inner<1> I1; +S<int>::Inner<0> I0; |

