xref: /aosp_15_r20/external/clang/test/SemaCXX/internal_linkage.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li int f() __attribute__((internal_linkage));
4*67e74705SXin Li 
5*67e74705SXin Li class A;
6*67e74705SXin Li class __attribute__((internal_linkage)) A {
7*67e74705SXin Li public:
8*67e74705SXin Li   int x __attribute__((internal_linkage)); // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}}
9*67e74705SXin Li   static int y __attribute__((internal_linkage));
10*67e74705SXin Li   void f1() __attribute__((internal_linkage));
f2()11*67e74705SXin Li   void f2() __attribute__((internal_linkage)) {}
f3()12*67e74705SXin Li   static void f3() __attribute__((internal_linkage)) {}
13*67e74705SXin Li   void f4(); // expected-note{{previous definition is here}}
14*67e74705SXin Li   static int zz; // expected-note{{previous definition is here}}
A()15*67e74705SXin Li   A() __attribute__((internal_linkage)) {}
~A()16*67e74705SXin Li   ~A() __attribute__((internal_linkage)) {}
operator =(const A &)17*67e74705SXin Li   A& operator=(const A&) __attribute__((internal_linkage)) { return *this; }
18*67e74705SXin Li   struct {
19*67e74705SXin Li     int z  __attribute__((internal_linkage)); // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}}
20*67e74705SXin Li   };
21*67e74705SXin Li };
22*67e74705SXin Li 
f4()23*67e74705SXin Li __attribute__((internal_linkage)) void A::f4() {} // expected-error{{'internal_linkage' attribute does not appear on the first declaration of 'f4'}}
24*67e74705SXin Li 
25*67e74705SXin Li __attribute__((internal_linkage)) int A::zz; // expected-error{{'internal_linkage' attribute does not appear on the first declaration of 'zz'}}
26*67e74705SXin Li 
27*67e74705SXin Li namespace Z __attribute__((internal_linkage)) { // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}}
28*67e74705SXin Li }
29*67e74705SXin Li 
g()30*67e74705SXin Li __attribute__((internal_linkage("foo"))) int g() {} // expected-error{{'internal_linkage' attribute takes no arguments}}
31*67e74705SXin Li 
h()32*67e74705SXin Li [[clang::internal_linkage]] int h() {}
33*67e74705SXin Li 
34*67e74705SXin Li enum struct __attribute__((internal_linkage)) E { // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}}
35*67e74705SXin Li   a = 1,
36*67e74705SXin Li   b = 2
37*67e74705SXin Li };
38*67e74705SXin Li 
39*67e74705SXin Li int A::y;
40*67e74705SXin Li 
f1()41*67e74705SXin Li void A::f1() {
42*67e74705SXin Li }
43*67e74705SXin Li 
g(int a)44*67e74705SXin Li void g(int a [[clang::internal_linkage]]) { // expected-warning{{'internal_linkage' attribute only applies to variables, functions and classes}}
45*67e74705SXin Li   int x [[clang::internal_linkage]]; // expected-warning{{'internal_linkage' attribute on a non-static local variable is ignored}}
46*67e74705SXin Li   static int y [[clang::internal_linkage]];
47*67e74705SXin Li }
48