From: Rafael Espindola Date: Mon, 16 Apr 2012 18:46:26 +0000 (+0000) Subject: Revert r154749 for now at John McCall's request. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9836a27cf93a58305ff3cf6d75ddc399c7d8ebf;p=clang Revert r154749 for now at John McCall's request. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154846 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index ef833d8c7d..a3196b22f0 100644 --- a/lib/AST/Decl.cpp +++ b/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 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(DC); + DC = DC->getParent()) { + const NamespaceDecl *ND = dyn_cast(DC); + if (!ND) continue; + if (llvm::Optional 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 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(DC); - DC = DC->getParent()) { - const NamespaceDecl *ND = dyn_cast(DC); - if (!ND) continue; - if (llvm::Optional 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/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index 88a456fe57..59fd7c26f0 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/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