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