xref: /aosp_15_r20/external/clang/test/CodeGenCXX/attribute_internal_linkage.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void g() {}
64*67e74705SXin Li // CHECK-DAG: define internal void @_ZL1gv()
65*67e74705SXin Li 
use()66*67e74705SXin Li void 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