diff options
author | John McCall <rjmccall@apple.com> | 2010-12-10 02:59:44 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-12-10 02:59:44 +0000 |
commit | 90f1450c109fbbd333001165bbd986061f7c4513 (patch) | |
tree | eecf97a3097543529850ba046c5b0440d645f668 /lib/AST/Decl.cpp | |
parent | f0d9d8b79389e398ea0c44cde9d7b9020e0ccb65 (diff) |
Treat visibility on an enclosing namespace as a non-explicit source of
visibility. Fixes PR8713.
I've disabled a test which was testing that you can #pragma pop visibility
to get out of a namespace's visibility attribute. We should probably just
diagnose that as an error unless it's instrumental to someone's system
headers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121459 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index d59fc7a344..f40907cb73 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -249,6 +249,20 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) { if (const VisibilityAttr *VA = GetExplicitVisibility(D)) { LV.setVisibility(GetVisibilityFromAttr(VA), true); F.ConsiderGlobalVisibility = false; + } 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()) { + if (!isa<NamespaceDecl>(DC)) continue; + if (const VisibilityAttr *VA = + cast<NamespaceDecl>(DC)->getAttr<VisibilityAttr>()) { + LV.setVisibility(GetVisibilityFromAttr(VA), false); + F.ConsiderGlobalVisibility = false; + break; + } + } } } |