diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2015-11-10 21:28:44 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2015-11-10 21:28:44 +0000 |
commit | ae6ebd3af525c23c6216b76dd28a282790dce78f (patch) | |
tree | 2a5c4d4171297adb8b9edadf927bed30bae45563 /clang/test/CodeGenCXX/attribute_internal_linkage.cpp | |
parent | 2d5fb8cac4ec7b6f763c6f91b52f6a954ad99942 (diff) | |
download | bcm5719-llvm-ae6ebd3af525c23c6216b76dd28a282790dce78f.tar.gz bcm5719-llvm-ae6ebd3af525c23c6216b76dd28a282790dce78f.zip |
Implement __attribute__((internal_linkage)).
The attrubite is applicable to functions and variables and changes
the linkage of the subject to internal.
This is the same functionality as C-style "static", but applicable to
class methods; and the same as anonymouns namespaces, but can apply
to individual methods of a class.
Following the proposal in
http://lists.llvm.org/pipermail/cfe-dev/2015-October/045580.html
llvm-svn: 252648
Diffstat (limited to 'clang/test/CodeGenCXX/attribute_internal_linkage.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/attribute_internal_linkage.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/attribute_internal_linkage.cpp b/clang/test/CodeGenCXX/attribute_internal_linkage.cpp new file mode 100644 index 00000000000..21cd44e916f --- /dev/null +++ b/clang/test/CodeGenCXX/attribute_internal_linkage.cpp @@ -0,0 +1,79 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++11 -emit-llvm -o - %s | FileCheck %s + +__attribute__((internal_linkage)) void f() {} +// CHECK-DAG: define internal void @_ZL1fv + +class A { +public: + static int y __attribute__((internal_linkage)); + static int y2 [[clang::internal_linkage]]; +// CHECK-DAG: @_ZN1A1yE = internal global +// CHECK-DAG: @_ZN1A2y2E = internal global + void f1() __attribute__((internal_linkage)); +// CHECK-DAG: define internal void @_ZN1A2f1Ev + void f2() __attribute__((internal_linkage)) {} +// CHECK-DAG: define internal void @_ZN1A2f2Ev + static void f4() __attribute__((internal_linkage)) {} +// CHECK-DAG: define internal void @_ZN1A2f4Ev + A() __attribute__((internal_linkage)) {} +// CHECK-DAG: define internal void @_ZN1AC1Ev +// CHECK-DAG: define internal void @_ZN1AC2Ev + ~A() __attribute__((internal_linkage)) {} +// CHECK-DAG: define internal void @_ZN1AD1Ev +// CHECK-DAG: define internal void @_ZN1AD2Ev +}; + +int A::y; +int A::y2; + +void A::f1() { +} + +// Forward declaration w/o an attribute. +class B; + +// Internal_linkage on a class affects all its members. +class __attribute__((internal_linkage)) B { +public: + B() {} + // CHECK-DAG: define internal void @_ZNL1BC1Ev + // CHECK-DAG: define internal void @_ZNL1BC2Ev + ~B() {} + // CHECK-DAG: define internal void @_ZNL1BD1Ev + // CHECK-DAG: define internal void @_ZNL1BD2Ev + void f() {}; + // CHECK-DAG: define internal void @_ZNL1B1fEv + static int x; + // CHECK-DAG: @_ZNL1B1xE = internal global +}; + +int B::x; + +// Forward declaration with the attribute. +class __attribute__((internal_linkage)) C; +class C { +public: + static int x; + // CHECK-DAG: @_ZNL1C1xE = internal global +}; + +int C::x; + +__attribute__((internal_linkage)) void g(); +void g() {} +// CHECK-DAG: define internal void @_ZL1gv() + +void use() { + A a; + a.f1(); + a.f2(); + A::f4(); + f(); + int &Y = A::y; + int &Y2 = A::y2; + B b; + b.f(); + int &XX2 = B::x; + g(); + int &XX3 = C::x; +} |