1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++11 -emit-llvm -o - %s | FileCheck %s 2*67e74705SXin Li f()3*67e74705SXin Li__attribute__((internal_linkage)) void f() {} 4*67e74705SXin Li // CHECK-DAG: define internal void @_ZL1fv 5*67e74705SXin Li 6*67e74705SXin Li class A { 7*67e74705SXin Li public: 8*67e74705SXin Li static int y __attribute__((internal_linkage)); 9*67e74705SXin Li static int y2 [[clang::internal_linkage]]; 10*67e74705SXin Li // CHECK-DAG: @_ZN1A1yE = internal global 11*67e74705SXin Li // CHECK-DAG: @_ZN1A2y2E = internal global 12*67e74705SXin Li void f1() __attribute__((internal_linkage)); 13*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1A2f1Ev f2()14*67e74705SXin Li void f2() __attribute__((internal_linkage)) {} 15*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1A2f2Ev f4()16*67e74705SXin Li static void f4() __attribute__((internal_linkage)) {} 17*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1A2f4Ev A()18*67e74705SXin Li A() __attribute__((internal_linkage)) {} 19*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1AC1Ev 20*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1AC2Ev ~A()21*67e74705SXin Li ~A() __attribute__((internal_linkage)) {} 22*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1AD1Ev 23*67e74705SXin Li // CHECK-DAG: define internal void @_ZN1AD2Ev 24*67e74705SXin Li }; 25*67e74705SXin Li 26*67e74705SXin Li int A::y; 27*67e74705SXin Li int A::y2; 28*67e74705SXin Li f1()29*67e74705SXin Livoid A::f1() { 30*67e74705SXin Li } 31*67e74705SXin Li 32*67e74705SXin Li // Forward declaration w/o an attribute. 33*67e74705SXin Li class B; 34*67e74705SXin Li 35*67e74705SXin Li // Internal_linkage on a class affects all its members. 36*67e74705SXin Li class __attribute__((internal_linkage)) B { 37*67e74705SXin Li public: B()38*67e74705SXin Li B() {} 39*67e74705SXin Li // CHECK-DAG: define internal void @_ZNL1BC1Ev 40*67e74705SXin Li // CHECK-DAG: define internal void @_ZNL1BC2Ev ~B()41*67e74705SXin Li ~B() {} 42*67e74705SXin Li // CHECK-DAG: define internal void @_ZNL1BD1Ev 43*67e74705SXin Li // CHECK-DAG: define internal void @_ZNL1BD2Ev f()44*67e74705SXin Li void f() {}; 45*67e74705SXin Li // CHECK-DAG: define internal void @_ZNL1B1fEv 46*67e74705SXin Li static int x; 47*67e74705SXin Li // CHECK-DAG: @_ZNL1B1xE = internal global 48*67e74705SXin Li }; 49*67e74705SXin Li 50*67e74705SXin Li int B::x; 51*67e74705SXin Li 52*67e74705SXin Li // Forward declaration with the attribute. 53*67e74705SXin Li class __attribute__((internal_linkage)) C; 54*67e74705SXin Li class C { 55*67e74705SXin Li public: 56*67e74705SXin Li static int x; 57*67e74705SXin Li // CHECK-DAG: @_ZNL1C1xE = internal global 58*67e74705SXin Li }; 59*67e74705SXin Li 60*67e74705SXin Li int C::x; 61*67e74705SXin Li 62*67e74705SXin Li __attribute__((internal_linkage)) void g(); g()63*67e74705SXin Livoid g() {} 64*67e74705SXin Li // CHECK-DAG: define internal void @_ZL1gv() 65*67e74705SXin Li use()66*67e74705SXin Livoid use() { 67*67e74705SXin Li A a; 68*67e74705SXin Li a.f1(); 69*67e74705SXin Li a.f2(); 70*67e74705SXin Li A::f4(); 71*67e74705SXin Li f(); 72*67e74705SXin Li int &Y = A::y; 73*67e74705SXin Li int &Y2 = A::y2; 74*67e74705SXin Li B b; 75*67e74705SXin Li b.f(); 76*67e74705SXin Li int &XX2 = B::x; 77*67e74705SXin Li g(); 78*67e74705SXin Li int &XX3 = C::x; 79*67e74705SXin Li } 80