From: Rafael Espindola Date: Thu, 12 Jul 2012 04:47:34 +0000 (+0000) Subject: Process #pragma visibility early in the parsing of class definitions. Fixes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e06529f3bbb4459be21b57dd918880a02f95cb2;p=clang Process #pragma visibility early in the parsing of class definitions. Fixes pr13338. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160105 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index dfe2882166..47453762d9 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -8919,6 +8919,10 @@ void Sema::ActOnTagStartDefinition(Scope *S, Decl *TagD) { PushDeclContext(S, Tag); ActOnDocumentableDecl(TagD); + + // If there's a #pragma GCC visibility in scope, set the visibility of this + // record. + AddPushedVisibilityAttribute(Tag); } Decl *Sema::ActOnObjCContainerStartDefinition(Decl *IDecl) { @@ -8983,10 +8987,6 @@ void Sema::ActOnTagFinishDefinition(Scope *S, Decl *TagD, if (isa(Tag)) FieldCollector->FinishClass(); - // If there's a #pragma GCC visibility in scope, and this isn't a subclass, - // set the visibility of this record. - AddPushedVisibilityAttribute(Tag); - // Exit this scope of this tag's definition. PopDeclContext(); diff --git a/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index bf6c6eea80..583293be52 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/test/CodeGenCXX/visibility.cpp @@ -1001,3 +1001,20 @@ namespace test53 { // CHECK: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv } + +namespace test54 { + template + struct foo { + static void bar(); + }; +#pragma GCC visibility push(hidden) + class zed { + zed(const zed &); + }; + void bah() { + foo::bar(); + } +#pragma GCC visibility pop + // CHECK: declare hidden void @_ZN6test543fooINS_3zedEE3barEv + // CHECK-HIDDEN: declare hidden void @_ZN6test543fooINS_3zedEE3barEv +}