When adding a friend class declaration to the lookup tables, use the access specifier
of any previous declaration in case we replace it in a class's declaration table.
Fixes bug 4858.  This sort of thing makes me reconsider putting friend declarations in
declaration lists.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80750 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 86222ff..113283a 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -4331,6 +4331,11 @@
   if (TUK == TUK_Friend) {
     // Friend tag decls are visible in fairly strange ways.
     if (!CurContext->isDependentContext()) {
+      // We might be replacing an existing declaration in the lookup tables;
+      // if so, borrow its access specifier.
+      if (PrevDecl)
+        New->setAccess(PrevDecl->getAccess());
+
       DeclContext *DC = New->getDeclContext()->getLookupContext();
       DC->makeDeclVisibleInContext(New, /* Recoverable = */ false);
       if (Scope *EnclosingScope = getScopeForDeclContext(S, DC))