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