diff options
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 38 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/visibility.cpp | 12 | 
2 files changed, 19 insertions, 31 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index ef833d8c7db..a3196b22f07 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -273,6 +273,25 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {    LinkageInfo LV;    LV.mergeVisibility(Context.getLangOpts().getVisibilityMode()); +  if (F.ConsiderVisibilityAttributes) { +    if (llvm::Optional<Visibility> Vis = D->getExplicitVisibility()) { +      LV.setVisibility(*Vis, true); +    } else { +      // If we're declared in a namespace with a visibility attribute, +      // use that namespace's visibility, but don't call it explicit. +      for (const DeclContext *DC = D->getDeclContext(); +           !isa<TranslationUnitDecl>(DC); +           DC = DC->getParent()) { +        const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC); +        if (!ND) continue; +        if (llvm::Optional<Visibility> Vis = ND->getExplicitVisibility()) { +          LV.setVisibility(*Vis, true); +          break; +        } +      } +    } +  } +    // C++ [basic.link]p4:    //   A name having namespace scope has external linkage if it is the @@ -443,25 +462,6 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {      return LinkageInfo::none();    } -  if (F.ConsiderVisibilityAttributes) { -    if (llvm::Optional<Visibility> Vis = D->getExplicitVisibility()) { -      LV.setVisibility(*Vis, true); -    } else { -      // If we're declared in a namespace with a visibility attribute, -      // use that namespace's visibility, but don't call it explicit. -      for (const DeclContext *DC = D->getDeclContext(); -           !isa<TranslationUnitDecl>(DC); -           DC = DC->getParent()) { -        const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC); -        if (!ND) continue; -        if (llvm::Optional<Visibility> Vis = ND->getExplicitVisibility()) { -          LV.setVisibility(*Vis, true); -          break; -        } -      } -    } -  } -    // If we ended up with non-external linkage, visibility should    // always be default.    if (LV.linkage() != ExternalLinkage) diff --git a/clang/test/CodeGenCXX/visibility.cpp b/clang/test/CodeGenCXX/visibility.cpp index 88a456fe571..59fd7c26f0d 100644 --- a/clang/test/CodeGenCXX/visibility.cpp +++ b/clang/test/CodeGenCXX/visibility.cpp @@ -28,18 +28,6 @@ namespace test28 {    // CHECK-HIDDEN: @_ZN6test285myvecE = hidden global  } -namespace test29 { -#pragma GCC visibility push(hidden) -  struct RECT { -    int top; -  }; -  __attribute__ ((visibility ("default"))) extern RECT data_rect; -  RECT data_rect = { -1}; -#pragma GCC visibility pop -  // CHECK: @_ZN6test299data_rectE = global -  // CHECK-HIDDEN: @_ZN6test299data_rectE = global -} -  // CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10  // CHECK: @_ZN5Test71aE = hidden global  // CHECK: @_ZN5Test71bE = global  | 

