]> granicus.if.org Git - clang/commitdiff
Abandon the type-visibility optimization for functions. GCC doesn't do it,
authorJohn McCall <rjmccall@apple.com>
Thu, 28 Oct 2010 07:07:52 +0000 (07:07 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 28 Oct 2010 07:07:52 +0000 (07:07 +0000)
and it's too much trouble to push for.  Fixes PR8478.

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

lib/AST/Decl.cpp
test/CodeGenCXX/visibility.cpp

index 2069054b3a7dd143e7609fcbb55d392f39beeecf..8526eccd6581145da5d9db1ddc3ab7ca95a4be7d 100644 (file)
@@ -268,15 +268,10 @@ static LVPair getLVForNamespaceScopeDecl(const NamedDecl *D) {
 
   //     - a function, unless it has internal linkage; or
   } else if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
-    // Modify the function's LV by the LV of its type unless this is
-    // C or extern "C".  See the comment above about variables.
-    if (Context.getLangOptions().CPlusPlus && !Function->isExternC() &&
-        !ExplicitVisibility) {
-      LVPair TypeLV = Function->getType()->getLinkageAndVisibility();
-      if (TypeLV.first != ExternalLinkage)
-        return LVPair(UniqueExternalLinkage, DefaultVisibility);
-      LV.second = minVisibility(LV.second, TypeLV.second);
-    }
+    // In theory, we can modify the function's LV by the LV of its
+    // type unless it has C linkage (see comment above about variables
+    // for justification).  In practice, GCC doesn't do this, so it's
+    // just too painful to make work.
 
     // C99 6.2.2p5:
     //   If the declaration of an identifier for a function has no
@@ -437,11 +432,11 @@ static LVPair getLVForClassMember(const NamedDecl *D) {
   const VisibilityAttr *VA = GetExplicitVisibility(D);
   if (VA) LV.second = minVisibility(LV.second, GetVisibilityFromAttr(VA));
 
-  // If it's a value declaration and we don't have an explicit visibility
-  // attribute, apply the LV from its type.
+  // If it's a variable declaration and we don't have an explicit
+  // visibility attribute, apply the LV from its type.
   // See the comment about namespace-scope variable decls above.
-  if (!VA && isa<ValueDecl>(D)) {
-    LVPair TypeLV = cast<ValueDecl>(D)->getType()->getLinkageAndVisibility();
+  if (!VA && isa<VarDecl>(D)) {
+    LVPair TypeLV = cast<VarDecl>(D)->getType()->getLinkageAndVisibility();
     if (TypeLV.first != ExternalLinkage)
       LV.first = minLinkage(LV.first, UniqueExternalLinkage);
     LV.second = minVisibility(LV.second, TypeLV.second);
index 9e61af1397591520b263752c034a72d46512c82e..61f4d8ad8dbd92c31aee0eae36955d930f71992b 100644 (file)
@@ -133,3 +133,16 @@ namespace Test9 {
     test9_fun(&a);
   }
 }
+
+// PR8478
+namespace Test10 {
+  struct A;
+
+  DEFAULT class B {
+    void foo(A*);
+  };
+
+  // CHECK: define void @_ZN6Test101B3fooEPNS_1AE(
+  // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE(
+  void B::foo(A*) {}
+}