]> granicus.if.org Git - clang/commitdiff
When adding a friend class declaration to the lookup tables, use the access specifier
authorJohn McCall <rjmccall@apple.com>
Wed, 2 Sep 2009 02:15:17 +0000 (02:15 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 2 Sep 2009 02:15:17 +0000 (02:15 +0000)
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

lib/Sema/SemaDecl.cpp
test/CXX/class/class.friend/p1.cpp

index 86222ffe14727324d067b7f40b2bb8eaa3eab662..113283a64464b10ac7f01afad3dcfd5f0e78cdb8 100644 (file)
@@ -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))
index 9ba02727a0682cb76d3fbe8fab0c4eab6060cc5a..3f8778885ce27a51797129f75572975cf8266836 100644 (file)
@@ -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' }}