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/SemaCXX | |
| 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/SemaCXX')
| -rw-r--r-- | clang/test/SemaCXX/internal_linkage.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/internal_linkage.cpp b/clang/test/SemaCXX/internal_linkage.cpp new file mode 100644 index 00000000000..d5cc6767392 --- /dev/null +++ b/clang/test/SemaCXX/internal_linkage.cpp @@ -0,0 +1,47 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s + +int f() __attribute__((internal_linkage)); + +class A; +class __attribute__((internal_linkage)) A { +public: + int x __attribute__((internal_linkage)); // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}} + static int y __attribute__((internal_linkage)); + void f1() __attribute__((internal_linkage)); + void f2() __attribute__((internal_linkage)) {} + static void f3() __attribute__((internal_linkage)) {} + void f4(); // expected-note{{previous definition is here}} + static int zz; // expected-note{{previous definition is here}} + A() __attribute__((internal_linkage)) {} + ~A() __attribute__((internal_linkage)) {} + A& operator=(const A&) __attribute__((internal_linkage)) { return *this; } + struct { + int z __attribute__((internal_linkage)); // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}} + }; +}; + +__attribute__((internal_linkage)) void A::f4() {} // expected-error{{'internal_linkage' attribute does not appear on the first declaration of 'f4'}} + +__attribute__((internal_linkage)) int A::zz; // expected-error{{'internal_linkage' attribute does not appear on the first declaration of 'zz'}} + +namespace Z __attribute__((internal_linkage)) { // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}} +} + +__attribute__((internal_linkage("foo"))) int g() {} // expected-error{{'internal_linkage' attribute takes no arguments}} + +[[clang::internal_linkage]] int h() {} + +enum struct __attribute__((internal_linkage)) E { // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}} + a = 1, + b = 2 +}; + +int A::y; + +void A::f1() { +} + +void g(int a [[clang::internal_linkage]]) { // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}} + int x [[clang::internal_linkage]]; // expected-warning{{'internal_linkage' attribute on a non-static local variable is ignored}} + static int y [[clang::internal_linkage]]; +} |

