From: John McCall Date: Wed, 2 Sep 2009 02:15:17 +0000 (+0000) Subject: When adding a friend class declaration to the lookup tables, use the access specifier X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=53489322f6574413d906f6a4c66033223e6b1e3f;p=clang 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 86222ffe14..113283a644 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -4331,6 +4331,11 @@ CreateNewDecl: 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)) diff --git a/test/CXX/class/class.friend/p1.cpp b/test/CXX/class/class.friend/p1.cpp index 9ba02727a0..3f8778885c 100644 --- a/test/CXX/class/class.friend/p1.cpp +++ b/test/CXX/class/class.friend/p1.cpp @@ -61,6 +61,10 @@ class A { typedef void ftypedef(); friend ftypedef typedeffed_function; // okay (because it's not declared as a member) + + class facet; + friend class facet; // should not assert + class facet {}; }; A::UndeclaredSoFar y; // expected-error {{ unknown type name 'UndeclaredSoFar' }}