1ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// RUN: %clang_cc1 %s -triple i386-unknown-unknown -fvisibility default -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-DEFAULT
2ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// RUN: %clang_cc1 %s -triple i386-unknown-unknown -fvisibility protected -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-PROTECTED
3ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// RUN: %clang_cc1 %s -triple i386-unknown-unknown -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
403abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbar
5ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-DEFAULT: @g_def = global i32 0
6ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-DEFAULT: @g_com = common global i32 0
7ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-DEFAULT: @g_ext = external global i32
8ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-DEFAULT: @g_deferred = internal global
9ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-PROTECTED: @g_def = protected global i32 0
10ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-PROTECTED: @g_com = common protected global i32 0
11ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-PROTECTED: @g_ext = external global i32
12ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-PROTECTED: @g_deferred = internal global
13ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-HIDDEN: @g_def = hidden global i32 0
14ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-HIDDEN: @g_com = common hidden global i32 0
15ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-HIDDEN: @g_ext = external global i32
16ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-HIDDEN: @g_deferred = internal global
1703abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbarint g_com;
1803abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbarint g_def = 0;
1903abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbarextern int g_ext;
207e714cd931fa3a90bfd728318a92485aa3e95748Daniel Dunbarstatic char g_deferred[] = "hello";
2103abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbar
2235cebc3eea898637057b10b5cf7dd08b1d788980John McCall// CHECK-DEFAULT: @test4 = hidden global i32 10
2335cebc3eea898637057b10b5cf7dd08b1d788980John McCall// CHECK-PROTECTED: @test4 = hidden global i32 10
2435cebc3eea898637057b10b5cf7dd08b1d788980John McCall// CHECK-HIDDEN: @test4 = hidden global i32 10
2535cebc3eea898637057b10b5cf7dd08b1d788980John McCall
2693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-DEFAULT-LABEL: define i32 @f_def()
27ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-DEFAULT: declare void @f_ext()
2893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-DEFAULT-LABEL: define internal void @f_deferred()
2993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-PROTECTED-LABEL: define protected i32 @f_def()
30ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-PROTECTED: declare void @f_ext()
3193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-PROTECTED-LABEL: define internal void @f_deferred()
3293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-HIDDEN-LABEL: define hidden i32 @f_def()
33ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-HIDDEN: declare void @f_ext()
3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-HIDDEN-LABEL: define internal void @f_deferred()
35ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall
3603abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbarextern void f_ext(void);
3703abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbar
387e714cd931fa3a90bfd728318a92485aa3e95748Daniel Dunbarstatic void f_deferred(void) {
397e714cd931fa3a90bfd728318a92485aa3e95748Daniel Dunbar}
407e714cd931fa3a90bfd728318a92485aa3e95748Daniel Dunbar
4103abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbarint f_def(void) {
4203abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbar  f_ext();
437e714cd931fa3a90bfd728318a92485aa3e95748Daniel Dunbar  f_deferred();
447e714cd931fa3a90bfd728318a92485aa3e95748Daniel Dunbar  return g_com + g_def + g_ext + g_deferred[0];
4503abc9ec05e8edce5e8d0c7f08a05027b9e04170Daniel Dunbar}
46ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall
47ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// PR8457
4893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-DEFAULT-LABEL: define void @test1(
4993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-PROTECTED-LABEL: define void @test1(
5093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-HIDDEN-LABEL: define void @test1(
51ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCallstruct Test1 { int field; };
52ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCallvoid  __attribute__((visibility("default"))) test1(struct Test1 *v) { }
53e7bc9722c807030409178d4af8ce8d1260bbd821John McCall
54e7bc9722c807030409178d4af8ce8d1260bbd821John McCall// rdar://problem/8595231
5593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-DEFAULT-LABEL: define void @test2()
5693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-PROTECTED-LABEL: define void @test2()
5793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-HIDDEN-LABEL: define void @test2()
58e7bc9722c807030409178d4af8ce8d1260bbd821John McCallvoid test2(void);
59e7bc9722c807030409178d4af8ce8d1260bbd821John McCallvoid __attribute__((visibility("default"))) test2(void) {}
6035cebc3eea898637057b10b5cf7dd08b1d788980John McCall
6193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-DEFAULT-LABEL: define hidden void @test3()
6293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-PROTECTED-LABEL: define hidden void @test3()
6393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-HIDDEN-LABEL: define hidden void @test3()
6435cebc3eea898637057b10b5cf7dd08b1d788980John McCallextern void test3(void);
6535cebc3eea898637057b10b5cf7dd08b1d788980John McCall__private_extern__ void test3(void) {}
6635cebc3eea898637057b10b5cf7dd08b1d788980John McCall
6735cebc3eea898637057b10b5cf7dd08b1d788980John McCall// Top of file.
6835cebc3eea898637057b10b5cf7dd08b1d788980John McCallextern int test4;
6935cebc3eea898637057b10b5cf7dd08b1d788980John McCall__private_extern__ int test4 = 10;
701c8278b4bc83fafd29eead80ff4e5814fce7fd9bJohn McCall
711c8278b4bc83fafd29eead80ff4e5814fce7fd9bJohn McCall// rdar://12399248
7293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-DEFAULT-LABEL: define hidden void @test5()
7393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-PROTECTED-LABEL: define hidden void @test5()
7493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-HIDDEN-LABEL: define hidden void @test5()
751c8278b4bc83fafd29eead80ff4e5814fce7fd9bJohn McCall__attribute__((availability(macosx,introduced=10.5,deprecated=10.6)))
761c8278b4bc83fafd29eead80ff4e5814fce7fd9bJohn McCall__private_extern__ void test5(void) {}
77