From becfc2325c9b645d2208b2a5389b709fd3d75576 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 17 Jul 2012 04:22:25 +0000 Subject: [PATCH] Record visibility pragmas when we see a tag declaration. We might use it to build a type before seeing the definition. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160339 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 4 ++++ test/CodeGenCXX/visibility.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 17b120bc86..342acf825b 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -8880,6 +8880,10 @@ CreateNewDecl: if (Attr) ProcessDeclAttributeList(S, New, Attr); + // If there's a #pragma GCC visibility in scope, set the visibility of this + // record. + AddPushedVisibilityAttribute(New); + // If we're declaring or defining a tag in function prototype scope // in C, note that this type can only be used within the function. if (Name && S->isFunctionPrototypeScope() && !getLangOpts().CPlusPlus) diff --git a/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index 3ea232dc00..590c06e4d0 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/test/CodeGenCXX/visibility.cpp @@ -1061,3 +1061,19 @@ namespace test57 { // CHECK: declare hidden void @_ZN6test573fooIiE3zedEv // CHECK-HIDDEN: declare hidden void @_ZN6test573fooIiE3zedEv } + +namespace test58 { +#pragma GCC visibility push(hidden) + struct foo; + template + struct __attribute__((visibility("default"))) bar { + static void zed() { + } + }; + void bah() { + bar::zed(); + } +#pragma GCC visibility pop + // CHECK: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv + // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv +} -- 2.40.0