Record visibility pragmas when we see a tag declaration. We might use it

to build a type before seeing the definition.

llvm-svn: 160339
This commit is contained in:
Rafael Espindola 2012-07-17 04:22:25 +00:00
parent 23f59509a8
commit f97c636812
2 changed files with 20 additions and 0 deletions
clang
lib/Sema
test/CodeGenCXX

View File

@ -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)

View File

@ -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<typename T>
struct __attribute__((visibility("default"))) bar {
static void zed() {
}
};
void bah() {
bar<foo>::zed();
}
#pragma GCC visibility pop
// CHECK: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
// CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
}