]> granicus.if.org Git - clang/commitdiff
Change return value of trivial visibility check.
authorRichard Trieu <rtrieu@google.com>
Thu, 7 Jun 2018 03:20:30 +0000 (03:20 +0000)
committerRichard Trieu <rtrieu@google.com>
Thu, 7 Jun 2018 03:20:30 +0000 (03:20 +0000)
Previous, if no Decl's were checked, visibility was set to false.  Switch it
so that in cases of no Decl's, return true.  These are the Decl's after being
filtered.  Also remove an unreachable return statement since it is directly
after another return statement.

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

lib/Sema/SemaLookup.cpp
test/Modules/local-visibility.cpp [new file with mode: 0644]

index d2d4171c9371828e8855ec076ff3afe7f7225ec3..984247bacc6ebcc5439bab160dae9c18e47fae3a 100644 (file)
@@ -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/test/Modules/local-visibility.cpp b/test/Modules/local-visibility.cpp
new file mode 100644 (file)
index 0000000..fa2d20c
--- /dev/null
@@ -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;