linkage2.cpp revision 950fee2555f7a6bd193e588d6b6a941fd182391a
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// RUN: %clang_cc1 -fsyntax-only -verify %s 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test1 { 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int x; // expected-note {{previous definition is here}} 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static int y; 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void f() {} // expected-note {{previous definition is here}} 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern "C" { 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern int x; // expected-error {{declaration of 'x' has a different language linkage}} 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern int y; // OK, has internal linkage, so no language linkage. 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void f(); // expected-error {{declaration of 'f' has a different language linkage}} 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This is OK. Both test2_f don't have language linkage since they have 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// internal linkage. 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void test2_f() { 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void test2_f(int x) { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test3 { 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern "C" { 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch namespace { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern int x2; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void f2(); 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch namespace { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int x2; 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void f2() {} 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test4 { 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void dummy() { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void Bar(); 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class A { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch friend void Bar(); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test5 { 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void g(); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void f() 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void g(); 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// pr14898 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test6 { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <class _Rp> 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class __attribute__ ((__visibility__("default"))) shared_future; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <class _Rp> 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class future { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <class> friend class shared_future; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shared_future<_Rp> share(); 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <class _Rp> future<_Rp> 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch get_future(); 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <class _Rp> 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct shared_future<_Rp&> { 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shared_future(future<_Rp&>&& __f); // expected-warning {{rvalue references are a C++11 extension}} 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void f() { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef int T; 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch get_future<int>(); 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef int& U; 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shared_future<int&> f1 = get_future<int&>(); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This is OK. The variables have internal linkage and therefore no language 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// linkage. 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static int test7_x; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" { 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern int test7_x; 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static int test7_y; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern int test7_y; 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { typedef int test7_F(); static test7_F test7_f; } 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" { extern test7_F test7_f; } 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// FIXME: This should be invalid. The function has no language linkage, but 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// the function type has, so this is redeclaring the function with a different 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// type. 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" { 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void test8_f(); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern void test8_f(); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static void test8_g(); 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" { 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extern void test8_g(); 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch