]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/SemaCXX/linkage2.cpp
Vendor import of clang release_34 branch r197841 (effectively, 3.4 RC3):
[FreeBSD/FreeBSD.git] / test / SemaCXX / linkage2.cpp
1 // RUN: %clang_cc1 -fsyntax-only -verify -std=gnu++11 %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions -Wno-local-type-template-args %s
3 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions -Wno-local-type-template-args -fmodules %s
4
5 namespace test1 {
6   int x; // expected-note {{previous definition is here}}
7   static int y;
8   void f() {} // expected-note {{previous definition is here}}
9
10   extern "C" {
11     extern int x; // expected-error {{declaration of 'x' has a different language linkage}}
12     extern int y; // OK, has internal linkage, so no language linkage.
13     void f(); // expected-error {{declaration of 'f' has a different language linkage}}
14   }
15 }
16
17 // This is OK. Both test2_f don't have language linkage since they have
18 // internal linkage.
19 extern "C" {
20   static void test2_f() {
21   }
22   static void test2_f(int x) {
23   }
24 }
25
26 namespace test3 {
27   extern "C" {
28     namespace {
29       extern int x2;
30       void f2();
31     }
32   }
33   namespace {
34     int x2;
35     void f2() {}
36   }
37 }
38
39 namespace test4 {
40   void dummy() {
41     void Bar();
42     class A {
43       friend void Bar();
44     };
45   }
46 }
47
48 namespace test5 {
49   static void g();
50   void f()
51   {
52     void g();
53   }
54 }
55
56 // pr14898
57 namespace test6 {
58   template <class _Rp>
59   class __attribute__ ((__visibility__("default"))) shared_future;
60   template <class _Rp>
61   class future {
62     template <class> friend class shared_future;
63     shared_future<_Rp> share();
64   };
65   template <class _Rp> future<_Rp>
66   get_future();
67   template <class _Rp>
68   struct shared_future<_Rp&> {
69     shared_future(future<_Rp&>&& __f);
70   };
71   void f() {
72     typedef int T;
73     get_future<int>();
74     typedef int& U;
75     shared_future<int&> f1 = get_future<int&>();
76   }
77 }
78
79 // This is OK. The variables have internal linkage and therefore no language
80 // linkage.
81 extern "C" {
82   static int test7_x;
83 }
84 extern "C++" {
85   extern int test7_x;
86 }
87 extern "C++" {
88   static int test7_y;
89 }
90 extern "C" {
91   extern int test7_y;
92 }
93 extern "C" { typedef int test7_F(); static test7_F test7_f; }
94 extern "C++" { extern test7_F test7_f; }
95
96 // FIXME: This should be invalid. The function has no language linkage, but
97 // the function type has, so this is redeclaring the function with a different
98 // type.
99 extern "C++" {
100   static void test8_f();
101 }
102 extern "C" {
103   extern void test8_f();
104 }
105 extern "C" {
106   static void test8_g();
107 }
108 extern "C++" {
109   extern void test8_g();
110 }
111
112 extern "C" {
113   void __attribute__((overloadable)) test9_f(int c); // expected-note {{previous declaration is here}}
114 }
115 extern "C++" {
116   void __attribute__((overloadable)) test9_f(int c); // expected-error {{declaration of 'test9_f' has a different language linkage}}
117 }
118
119 extern "C" {
120   void __attribute__((overloadable)) test10_f(int);
121   void __attribute__((overloadable)) test10_f(double);
122 }
123
124 extern "C" {
125   void test11_f() {
126     void  __attribute__((overloadable)) test11_g(int);
127     void  __attribute__((overloadable)) test11_g(double);
128   }
129 }
130
131 namespace test12 {
132   const int n = 0;
133   extern const int n;
134   void f() {
135     extern const int n;
136   }
137 }
138
139 namespace test13 {
140   static void a(void);
141   extern void a();
142   static void a(void) {}
143 }
144
145 namespace test14 {
146   namespace {
147     void a(void); // expected-note {{previous declaration is here}}
148     static void a(void) {} // expected-error {{static declaration of 'a' follows non-static declaration}}
149   }
150 }
151
152 namespace test15 {
153   const int a = 5; // expected-note {{previous definition is here}}
154   static const int a; // expected-error {{redefinition of 'a'}}
155 }
156
157 namespace test16 {
158   extern "C" {
159     class Foo {
160       int x;
161       friend int bar(Foo *y);
162     };
163     int bar(Foo *y) {
164       return y->x;
165     }
166   }
167 }
168
169 namespace test17 {
170   namespace {
171     struct I {
172     };
173   }
174   template <typename T1, typename T2> void foo() {}
175   template <typename T, T x> void bar() {} // expected-note {{candidate function}}
176   inline void *g() {
177     struct L {
178     };
179     // foo<L, I>'s linkage should be the merge of UniqueExternalLinkage (or
180     // InternalLinkage in c++11) and VisibleNoLinkage. The correct answer is
181     // NoLinkage in both cases. This means that using foo<L, I> as a template
182     // argument should fail.
183     return reinterpret_cast<void*>(bar<typeof(foo<L, I>), foo<L, I> >); // expected-error {{reinterpret_cast cannot resolve overloaded function 'bar' to type 'void *}}
184   }
185   void h() {
186     g();
187   }
188 }
189
190 namespace test18 {
191   template <typename T> struct foo {
192     template <T *P> static void f() {}
193     static void *g() { return (void *)f<&x>; }
194     static T x;
195   };
196   template <typename T> T foo<T>::x;
197   inline void *f() {
198     struct S {
199     };
200     return foo<S>::g();
201   }
202   void *h() { return f(); }
203 }
204
205 extern "C" void pr16247_foo(int);
206 static void pr16247_foo(double);
207 void pr16247_foo(int) {}
208 void pr16247_foo(double) {}
209
210 namespace PR16247 {
211   extern "C" void pr16247_bar(int);
212   static void pr16247_bar(double);
213   void pr16247_bar(int) {}
214   void pr16247_bar(double) {}
215 }