xref: /aosp_15_r20/external/clang/test/SemaCXX/linkage-spec.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -Wretained-language-linkage -DW_RETAINED_LANGUAGE_LINKAGE  %s
3*67e74705SXin Li extern "C" {
4*67e74705SXin Li   extern "C" void f(int);
5*67e74705SXin Li }
6*67e74705SXin Li 
7*67e74705SXin Li extern "C++" {
8*67e74705SXin Li   extern "C++" int& g(int);
9*67e74705SXin Li   float& g();
10*67e74705SXin Li }
11*67e74705SXin Li double& g(double);
12*67e74705SXin Li 
test(int x,double d)13*67e74705SXin Li void test(int x, double d) {
14*67e74705SXin Li   f(x);
15*67e74705SXin Li   float &f1 = g();
16*67e74705SXin Li   int& i1 = g(x);
17*67e74705SXin Li   double& d1 = g(d);
18*67e74705SXin Li }
19*67e74705SXin Li 
20*67e74705SXin Li extern "C" int foo;
21*67e74705SXin Li extern "C" int foo;
22*67e74705SXin Li 
23*67e74705SXin Li extern "C" const int bar;
24*67e74705SXin Li extern "C" int const bar;
25*67e74705SXin Li 
26*67e74705SXin Li // <rdar://problem/6895431>
27*67e74705SXin Li extern "C" struct bar d;
28*67e74705SXin Li extern struct bar e;
29*67e74705SXin Li 
30*67e74705SXin Li extern "C++" {
31*67e74705SXin Li   namespace N0 {
32*67e74705SXin Li     struct X0 {
fooN0::X033*67e74705SXin Li       int foo(int x) { return x; }
34*67e74705SXin Li     };
35*67e74705SXin Li   }
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li // PR5430
39*67e74705SXin Li namespace pr5430 {
40*67e74705SXin Li   extern "C" void func(void);
41*67e74705SXin Li }
42*67e74705SXin Li using namespace pr5430;
func(void)43*67e74705SXin Li extern "C" void pr5430::func(void) { }
44*67e74705SXin Li 
45*67e74705SXin Li // PR5405
f2(char *)46*67e74705SXin Li int f2(char *)
47*67e74705SXin Li {
48*67e74705SXin Li         return 0;
49*67e74705SXin Li }
50*67e74705SXin Li 
51*67e74705SXin Li extern "C"
52*67e74705SXin Li {
f2(int)53*67e74705SXin Li     int f2(int)
54*67e74705SXin Li     {
55*67e74705SXin Li         return f2((char *)0);
56*67e74705SXin Li     }
57*67e74705SXin Li }
58*67e74705SXin Li 
59*67e74705SXin Li namespace PR5405 {
f2b(char *)60*67e74705SXin Li   int f2b(char *) {
61*67e74705SXin Li     return 0;
62*67e74705SXin Li   }
63*67e74705SXin Li 
64*67e74705SXin Li   extern "C" {
f2b(int)65*67e74705SXin Li     int f2b(int) {
66*67e74705SXin Li       return f2b((char *)0); // ok
67*67e74705SXin Li     }
68*67e74705SXin Li   }
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li // PR6991
72*67e74705SXin Li extern "C" typedef int (*PutcFunc_t)(int);
73*67e74705SXin Li 
74*67e74705SXin Li 
75*67e74705SXin Li // PR7859
pr7859_a(int)76*67e74705SXin Li extern "C" void pr7859_a(int) {} // expected-note {{previous definition}}
pr7859_a(int)77*67e74705SXin Li extern "C" void pr7859_a(int) {} // expected-error {{redefinition}}
78*67e74705SXin Li 
pr7859_b()79*67e74705SXin Li extern "C" void pr7859_b() {} // expected-note {{previous definition}}
pr7859_b(int)80*67e74705SXin Li extern "C" void pr7859_b(int) {} // expected-error {{conflicting}}
81*67e74705SXin Li 
pr7859_c(short)82*67e74705SXin Li extern "C" void pr7859_c(short) {} // expected-note {{previous definition}}
pr7859_c(int)83*67e74705SXin Li extern "C" void pr7859_c(int) {} // expected-error {{conflicting}}
84*67e74705SXin Li 
85*67e74705SXin Li // <rdar://problem/8318976>
86*67e74705SXin Li extern "C" {
87*67e74705SXin Li   struct s0 {
88*67e74705SXin Li   private:
89*67e74705SXin Li     s0();
90*67e74705SXin Li     s0(const s0 &);
91*67e74705SXin Li   };
92*67e74705SXin Li }
93*67e74705SXin Li 
94*67e74705SXin Li //PR7754
95*67e74705SXin Li extern "C++" template <class T> int pr7754(T param);
96*67e74705SXin Li 
97*67e74705SXin Li namespace N {
98*67e74705SXin Li   int value;
99*67e74705SXin Li }
100*67e74705SXin Li 
101*67e74705SXin Li extern "C++" using N::value;
102*67e74705SXin Li 
103*67e74705SXin Li // PR7076
104*67e74705SXin Li extern "C" const char *Version_string = "2.9";
105*67e74705SXin Li 
106*67e74705SXin Li extern "C" {
107*67e74705SXin Li   extern const char *Version_string2 = "2.9";
108*67e74705SXin Li }
109*67e74705SXin Li 
110*67e74705SXin Li namespace PR9162 {
111*67e74705SXin Li   extern "C" {
112*67e74705SXin Li     typedef struct _ArtsSink ArtsSink;
113*67e74705SXin Li     struct _ArtsSink {
114*67e74705SXin Li       int sink;
115*67e74705SXin Li     };
116*67e74705SXin Li   }
arts_sink_get_type()117*67e74705SXin Li   int arts_sink_get_type()
118*67e74705SXin Li   {
119*67e74705SXin Li     return sizeof(ArtsSink);
120*67e74705SXin Li   }
121*67e74705SXin Li }
122*67e74705SXin Li 
123*67e74705SXin Li namespace pr14958 {
124*67e74705SXin Li   namespace js { extern int ObjectClass; }
125*67e74705SXin Li   extern "C" {
126*67e74705SXin Li     namespace js {}
127*67e74705SXin Li   }
128*67e74705SXin Li   int js::ObjectClass;
129*67e74705SXin Li }
130*67e74705SXin Li 
131*67e74705SXin Li extern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}}
132*67e74705SXin Li extern void PR16167_0; // expected-error {{variable has incomplete type 'void'}}
133*67e74705SXin Li 
134*67e74705SXin Li // PR7927
135*67e74705SXin Li enum T_7927 {
136*67e74705SXin Li   E_7927
137*67e74705SXin Li };
138*67e74705SXin Li 
139*67e74705SXin Li extern "C" void f_pr7927(int);
140*67e74705SXin Li 
141*67e74705SXin Li namespace {
142*67e74705SXin Li   extern "C" void f_pr7927(int);
143*67e74705SXin Li 
foo_pr7927()144*67e74705SXin Li   void foo_pr7927() {
145*67e74705SXin Li     f_pr7927(E_7927);
146*67e74705SXin Li     f_pr7927(0);
147*67e74705SXin Li     ::f_pr7927(E_7927);
148*67e74705SXin Li     ::f_pr7927(0);
149*67e74705SXin Li   }
150*67e74705SXin Li }
151*67e74705SXin Li 
bar_pr7927()152*67e74705SXin Li void bar_pr7927() {
153*67e74705SXin Li   f_pr7927(E_7927);
154*67e74705SXin Li   f_pr7927(0);
155*67e74705SXin Li   ::f_pr7927(E_7927);
156*67e74705SXin Li   ::f_pr7927(0);
157*67e74705SXin Li }
158*67e74705SXin Li 
159*67e74705SXin Li namespace PR17337 {
160*67e74705SXin Li   extern "C++" {
161*67e74705SXin Li     class Foo;
162*67e74705SXin Li     extern "C" int bar3(Foo *y);
163*67e74705SXin Li     class Foo {
164*67e74705SXin Li       int x;
165*67e74705SXin Li       friend int bar3(Foo *y);
166*67e74705SXin Li #ifdef W_RETAINED_LANGUAGE_LINKAGE
167*67e74705SXin Li // expected-note@-5 {{previous declaration is here}}
168*67e74705SXin Li // expected-warning@-3 {{retaining previous language linkage}}
169*67e74705SXin Li #endif
170*67e74705SXin Li     };
bar3(Foo * y)171*67e74705SXin Li     extern "C" int bar3(Foo *y) {
172*67e74705SXin Li       return y->x;
173*67e74705SXin Li     }
174*67e74705SXin Li   }
175*67e74705SXin Li }
176