linkage2.cpp revision 02fb50d54042982bccc04c276ad2342827c8fcd3
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// RUN: %clang_cc1 -fsyntax-only -verify %s 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comnamespace test1 { 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com int x; // expected-note {{previous definition is here}} 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com static int y; 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com void f() {} // expected-note {{previous definition is here}} 7971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com 857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com extern "C" { 957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com extern int x; // expected-error {{declaration of 'x' has a different language linkage}} 1057f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com extern int y; // OK, has internal linkage, so no language linkage. 1157f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com void f(); // expected-error {{declaration of 'f' has a different language linkage}} 1257f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com } 1357f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com} 1457f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 1557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com// This is OK. Both test2_f don't have language linkage since they have 16b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com// internal linkage. 176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comextern "C" { 1837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com static void test2_f() { 197bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com } 2030e6e2af14e84216b1c113fd7500d0822bc81daamtklein static void test2_f(int x) { 21bcbc1788b478b1e54079318ad073e8490aa66faetfarina } 22bcbc1788b478b1e54079318ad073e8490aa66faetfarina} 235f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 24b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comnamespace test3 { 25d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com extern "C" { 268a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com namespace { 274370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com extern int x2; 28971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com void f2(); 295e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 30de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 31c41295d1223136da4f9e4c65b7145360684ede4bcommit-bot@chromium.org namespace { 325af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com int x2; 338015dd83ae37147bb630d4751030868051ad0caereed@android.com void f2() {} 348015dd83ae37147bb630d4751030868051ad0caereed@android.com } 358015dd83ae37147bb630d4751030868051ad0caereed@android.com} 36e3bb3bce3e9c1f3bc8ee779b1b3383c18e560bcecommit-bot@chromium.org 37e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.comnamespace test4 { 380dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org void dummy() { 399875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com void Bar(); 40770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com class A { 41977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com friend void Bar(); 425e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org }; 4372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com } 44f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com} 4511db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com 462a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.comnamespace test5 { 47310478e72c63e639373465216271b81f1e4a9136epoger@google.com static void g(); 480770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com void f() 49515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org { 50515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org void g(); 518065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org } 52515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org} 53515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org 54515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org// pr14898 55515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgnamespace test6 { 56ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com template <class _Rp> 57ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com class __attribute__ ((__visibility__("default"))) shared_future; 58cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com template <class _Rp> 59cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com class future { 60cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com template <class> friend class shared_future; 61cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com shared_future<_Rp> share(); 626f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com }; 636f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com template <class _Rp> future<_Rp> 646f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com get_future(); 65cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com template <class _Rp> 6680724dfeb320d1152128cd33636c9024952432d3epoger@google.com struct shared_future<_Rp&> { 67cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com shared_future(future<_Rp&>&& __f); // expected-warning {{rvalue references are a C++11 extension}} 68123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com }; 69cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com void f() { 7080549fcdd50269d7e069d6db02b395fca128056ckkinnunen typedef int T; 71cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com get_future<int>(); 72cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com typedef int& U; 7376c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com shared_future<int&> f1 = get_future<int&>(); 7476c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com } 755e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org} 768923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com 770770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com// This is OK. The variables have internal linkage and therefore no language 789875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com// linkage. 799875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comextern "C" { 800770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com static int test7_x; 8100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 82e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.comextern "C++" { 83e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com extern int test7_x; 84e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com} 85b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.comextern "C++" { 86b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com static int test7_y; 87b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com} 88b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.comextern "C" { 8946cce91f4859b9c229938d4d649870c0a43b1806reed@google.com extern int test7_y; 9046cce91f4859b9c229938d4d649870c0a43b1806reed@google.com} 9146cce91f4859b9c229938d4d649870c0a43b1806reed@google.comextern "C" { typedef int test7_F(); static test7_F test7_f; } 9246cce91f4859b9c229938d4d649870c0a43b1806reed@google.comextern "C++" { extern test7_F test7_f; } 9300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 9400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com// FIXME: This should be invalid. The function has no language linkage, but 9500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com// the function type has, so this is redeclaring the function with a different 9600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com// type. 9700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C++" { 983914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com static void test8_f(); 993914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com} 1003914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.comextern "C" { 1013914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com extern void test8_f(); 102dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com} 10300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" { 104d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com static void test8_g(); 105dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com} 10600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C++" { 107dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com extern void test8_g(); 10800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 109dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com 11000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" { 11100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com void __attribute__((overloadable)) test9_f(int c); // expected-note {{previous declaration is here}} 11200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 113d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.comextern "C++" { 11400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com void __attribute__((overloadable)) test9_f(int c); // expected-error {{declaration of 'test9_f' has a different language linkage}} 115dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com} 11600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 11700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" { 11800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com void __attribute__((overloadable)) test10_f(int); 11900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com void __attribute__((overloadable)) test10_f(double); 12000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 12100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 12200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" { 123d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com void test11_f() { 12400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com void __attribute__((overloadable)) test11_g(int); 12500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com void __attribute__((overloadable)) test11_g(double); 12600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 12700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 128ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com