|  | // RUN: %clang_cc1 -fsyntax-only -verify -std=gnu++11 %s | 
|  | // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions -Wno-local-type-template-args %s | 
|  | // RUN: %clang_cc1 -fsyntax-only -verify -Wno-c++11-extensions -Wno-local-type-template-args -fmodules %s | 
|  |  | 
|  | namespace test1 { | 
|  | int x; // expected-note {{previous definition is here}} | 
|  | static int y; | 
|  | void f() {} // expected-note {{previous definition is here}} | 
|  |  | 
|  | extern "C" { | 
|  | extern int x; // expected-error {{declaration of 'x' has a different language linkage}} | 
|  | extern int y; // OK, has internal linkage, so no language linkage. | 
|  | void f(); // expected-error {{declaration of 'f' has a different language linkage}} | 
|  | } | 
|  | } | 
|  |  | 
|  | // This is OK. Both test2_f don't have language linkage since they have | 
|  | // internal linkage. | 
|  | extern "C" { | 
|  | static void test2_f() { | 
|  | } | 
|  | static void test2_f(int x) { | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test3 { | 
|  | extern "C" { | 
|  | namespace { | 
|  | extern int x2; | 
|  | void f2(); | 
|  | } | 
|  | } | 
|  | namespace { | 
|  | int x2; | 
|  | void f2() {} | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test4 { | 
|  | void dummy() { | 
|  | void Bar(); | 
|  | class A { | 
|  | friend void Bar(); | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test5 { | 
|  | static void g(); | 
|  | void f() | 
|  | { | 
|  | void g(); | 
|  | } | 
|  | } | 
|  |  | 
|  | // pr14898 | 
|  | namespace test6 { | 
|  | template <class _Rp> | 
|  | class __attribute__ ((__visibility__("default"))) shared_future; | 
|  | template <class _Rp> | 
|  | class future { | 
|  | template <class> friend class shared_future; | 
|  | shared_future<_Rp> share(); | 
|  | }; | 
|  | template <class _Rp> future<_Rp> | 
|  | get_future(); | 
|  | template <class _Rp> | 
|  | struct shared_future<_Rp&> { | 
|  | shared_future(future<_Rp&>&& __f); | 
|  | }; | 
|  | void f() { | 
|  | typedef int T; | 
|  | get_future<int>(); | 
|  | typedef int& U; | 
|  | shared_future<int&> f1 = get_future<int&>(); | 
|  | } | 
|  | } | 
|  |  | 
|  | // This is OK. The variables have internal linkage and therefore no language | 
|  | // linkage. | 
|  | extern "C" { | 
|  | static int test7_x; | 
|  | } | 
|  | extern "C++" { | 
|  | extern int test7_x; | 
|  | } | 
|  | extern "C++" { | 
|  | static int test7_y; | 
|  | } | 
|  | extern "C" { | 
|  | extern int test7_y; | 
|  | } | 
|  | extern "C" { typedef int test7_F(); static test7_F test7_f; } | 
|  | extern "C++" { extern test7_F test7_f; } | 
|  |  | 
|  | // FIXME: This should be invalid. The function has no language linkage, but | 
|  | // the function type has, so this is redeclaring the function with a different | 
|  | // type. | 
|  | extern "C++" { | 
|  | static void test8_f(); | 
|  | } | 
|  | extern "C" { | 
|  | extern void test8_f(); | 
|  | } | 
|  | extern "C" { | 
|  | static void test8_g(); | 
|  | } | 
|  | extern "C++" { | 
|  | extern void test8_g(); | 
|  | } | 
|  |  | 
|  | extern "C" { | 
|  | void __attribute__((overloadable)) test9_f(int c); // expected-note {{previous declaration is here}} | 
|  | } | 
|  | extern "C++" { | 
|  | void __attribute__((overloadable)) test9_f(int c); // expected-error {{declaration of 'test9_f' has a different language linkage}} | 
|  | } | 
|  |  | 
|  | extern "C" { | 
|  | void __attribute__((overloadable)) test10_f(int); | 
|  | void __attribute__((overloadable)) test10_f(double); | 
|  | } | 
|  |  | 
|  | extern "C" { | 
|  | void test11_f() { | 
|  | void  __attribute__((overloadable)) test11_g(int); | 
|  | void  __attribute__((overloadable)) test11_g(double); | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test12 { | 
|  | const int n = 0; | 
|  | extern const int n; | 
|  | void f() { | 
|  | extern const int n; | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test13 { | 
|  | static void a(void); | 
|  | extern void a(); | 
|  | static void a(void) {} | 
|  | } | 
|  |  | 
|  | namespace test14 { | 
|  | // Anonymous namespace implies internal linkage, so 'static' has no effect. | 
|  | namespace { | 
|  | void a(void); | 
|  | static void a(void) {} | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test15 { | 
|  | const int a = 5; // expected-note {{previous definition is here}} | 
|  | static const int a; // expected-error {{redefinition of 'a'}} | 
|  | } | 
|  |  | 
|  | namespace test16 { | 
|  | extern "C" { | 
|  | class Foo { | 
|  | int x; | 
|  | friend int bar(Foo *y); | 
|  | }; | 
|  | int bar(Foo *y) { | 
|  | return y->x; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test17 { | 
|  | namespace { | 
|  | struct I { | 
|  | }; | 
|  | } | 
|  | template <typename T1, typename T2> void foo() {} | 
|  | template <typename T, T x> void bar() {} // expected-note {{candidate function}} | 
|  | inline void *g() { | 
|  | struct L { | 
|  | }; | 
|  | // foo<L, I>'s linkage should be the merge of UniqueExternalLinkage (or | 
|  | // InternalLinkage in c++11) and VisibleNoLinkage. The correct answer is | 
|  | // NoLinkage in both cases. This means that using foo<L, I> as a template | 
|  | // argument should fail. | 
|  | return reinterpret_cast<void*>(bar<typeof(foo<L, I>), foo<L, I> >); // expected-error {{reinterpret_cast cannot resolve overloaded function 'bar' to type 'void *}} | 
|  | } | 
|  | void h() { | 
|  | g(); | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test18 { | 
|  | template <typename T> struct foo { | 
|  | template <T *P> static void f() {} | 
|  | static void *g() { return (void *)f<&x>; } | 
|  | static T x; | 
|  | }; | 
|  | template <typename T> T foo<T>::x; | 
|  | inline void *f() { | 
|  | struct S { | 
|  | }; | 
|  | return foo<S>::g(); | 
|  | } | 
|  | void *h() { return f(); } | 
|  | } | 
|  |  | 
|  | extern "C" void pr16247_foo(int); | 
|  | static void pr16247_foo(double); | 
|  | void pr16247_foo(int) {} | 
|  | void pr16247_foo(double) {} | 
|  |  | 
|  | namespace PR16247 { | 
|  | extern "C" void pr16247_bar(int); | 
|  | static void pr16247_bar(double); | 
|  | void pr16247_bar(int) {} | 
|  | void pr16247_bar(double) {} | 
|  | } | 
|  | namespace PR18964 { | 
|  | unsigned &*foo; //expected-error{{'foo' declared as a pointer to a reference of type}} | 
|  | extern struct {} *foo; // don't assert | 
|  | } | 
|  |  | 
|  | namespace typedef_name_for_linkage { | 
|  | template<typename T> struct Use {}; | 
|  |  | 
|  | struct A { A(); A(const A&); ~A(); }; | 
|  |  | 
|  | typedef struct { | 
|  | A a; | 
|  | } B; | 
|  |  | 
|  | struct C { | 
|  | typedef struct { | 
|  | A a; | 
|  | } D; | 
|  | }; | 
|  |  | 
|  | typedef struct { | 
|  | void f() { static int n; struct Inner {};} | 
|  | } E; | 
|  |  | 
|  | // FIXME: Ideally this would be accepted in all modes. In C++98, we trigger a | 
|  | // linkage calculation to drive the "internal linkage type as template | 
|  | // argument" warning. | 
|  | typedef struct { | 
|  | void f() { struct Inner {}; Use<Inner> ui; } | 
|  | } F; | 
|  | #if __cplusplus < 201103L | 
|  | // expected-error@-2 {{unsupported: typedef changes linkage of anonymous type, but linkage was already computed}} | 
|  | // expected-note@-5 {{use a tag name here}} | 
|  | #endif | 
|  | } |