1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 2a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker// RUN: %clang_cc1 -fsyntax-only -verify -Wretained-language-linkage -DW_RETAINED_LANGUAGE_LINKAGE %s 36c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregorextern "C" { 46c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor extern "C" void f(int); 56c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor} 66c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor 76c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregorextern "C++" { 86c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor extern "C++" int& g(int); 96c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor float& g(); 106c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor} 116c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregordouble& g(double); 126c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor 136c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregorvoid test(int x, double d) { 146c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor f(x); 156c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor float &f1 = g(); 166c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor int& i1 = g(x); 176c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor double& d1 = g(d); 186c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor} 1917a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregor 2017a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" int foo; 2117a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" int foo; 2217a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregor 2317a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" const int bar; 2417a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" int const bar; 25425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlsson 26425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlsson// <rdar://problem/6895431> 27425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlssonextern "C" struct bar d; 28425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlssonextern struct bar e; 29a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor 30a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregorextern "C++" { 31a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor namespace N0 { 32a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor struct X0 { 33a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor int foo(int x) { return x; } 34a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor }; 35a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor } 364fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar} 379770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl 389770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl// PR5430 399770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redlnamespace pr5430 { 409770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl extern "C" void func(void); 419770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl} 429770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redlusing namespace pr5430; 439770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redlextern "C" void pr5430::func(void) { } 441237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor 45aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith// PR5405 466e428a446ed7cc170346430afa7be54e83b2d28cTimur Iskhodzhanovint f2(char *) 471237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor{ 481237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor return 0; 491237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor} 501237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor 511237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregorextern "C" 521237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor{ 536e428a446ed7cc170346430afa7be54e83b2d28cTimur Iskhodzhanov int f2(int) 541237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor { 551237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor return f2((char *)0); 561237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor } 571237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor} 5835f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara 59aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smithnamespace PR5405 { 60aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith int f2b(char *) { 61aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith return 0; 62aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith } 63aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 64aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith extern "C" { 65aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith int f2b(int) { 66aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith return f2b((char *)0); // ok 67aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith } 68aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith } 69aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith} 70aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 7135f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara// PR6991 7235f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnaraextern "C" typedef int (*PutcFunc_t)(int); 737b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 747b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 757b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall// PR7859 767b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_a(int) {} // expected-note {{previous definition}} 777b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_a(int) {} // expected-error {{redefinition}} 787b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 797b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_b() {} // expected-note {{previous definition}} 807b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_b(int) {} // expected-error {{conflicting}} 817b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 827b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_c(short) {} // expected-note {{previous definition}} 837b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_c(int) {} // expected-error {{conflicting}} 8445975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor 8545975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor// <rdar://problem/8318976> 8645975531e3e93033b41e04974340e4e8f7481d61Douglas Gregorextern "C" { 8745975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor struct s0 { 8845975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor private: 8945975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor s0(); 9045975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor s0(const s0 &); 9145975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor }; 9245975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor} 9309a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor 9409a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor//PR7754 9509a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregorextern "C++" template <class T> int pr7754(T param); 9609a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor 9709a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregornamespace N { 9809a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor int value; 9909a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor} 10009a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor 10109a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregorextern "C++" using N::value; 10266c42d443982a0891ce58deb7391d641ca87adc5Douglas Gregor 10366c42d443982a0891ce58deb7391d641ca87adc5Douglas Gregor// PR7076 10466c42d443982a0891ce58deb7391d641ca87adc5Douglas Gregorextern "C" const char *Version_string = "2.9"; 1056d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor 106b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindolaextern "C" { 107b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindola extern const char *Version_string2 = "2.9"; 108b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindola} 109b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindola 1106d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregornamespace PR9162 { 1116d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor extern "C" { 1126d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor typedef struct _ArtsSink ArtsSink; 1136d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor struct _ArtsSink { 1146d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor int sink; 1156d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor }; 1166d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor } 1176d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor int arts_sink_get_type() 1186d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor { 1196d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor return sizeof(ArtsSink); 1206d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor } 1216d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor} 122b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola 123b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindolanamespace pr14958 { 124b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola namespace js { extern int ObjectClass; } 125b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola extern "C" { 126b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola namespace js {} 127b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola } 128b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola int js::ObjectClass; 129b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola} 130aa71567ba4b8a10e9a7d668bf93e35413d7260a8David Majnemer 131aa71567ba4b8a10e9a7d668bf93e35413d7260a8David Majnemerextern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}} 132a3813c9c2cdcdeae4d4e5b6b85493caef1e70ab7David Majnemerextern void PR16167_0; // expected-error {{variable has incomplete type 'void'}} 133aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 134aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith// PR7927 135aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smithenum T_7927 { 136aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith E_7927 137aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith}; 138aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 139aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smithextern "C" void f_pr7927(int); 140aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 141aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smithnamespace { 142aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith extern "C" void f_pr7927(int); 143aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 144aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith void foo_pr7927() { 145aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith f_pr7927(E_7927); 146aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith f_pr7927(0); 147aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith ::f_pr7927(E_7927); 148aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith ::f_pr7927(0); 149aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith } 150aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith} 151aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith 152aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smithvoid bar_pr7927() { 153aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith f_pr7927(E_7927); 154aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith f_pr7927(0); 155aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith ::f_pr7927(E_7927); 156aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith ::f_pr7927(0); 157aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith} 158a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker 159a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Tokernamespace PR17337 { 160a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker extern "C++" { 161a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker class Foo; 162a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker extern "C" int bar3(Foo *y); 163a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker class Foo { 164a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker int x; 165a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker friend int bar3(Foo *y); 166a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker#ifdef W_RETAINED_LANGUAGE_LINKAGE 167a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker// expected-note@-5 {{previous declaration is here}} 168a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker// expected-warning@-3 {{retaining previous language linkage}} 169a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker#endif 170a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker }; 171a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker extern "C" int bar3(Foo *y) { 172a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker return y->x; 173a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker } 174a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker } 175a8a2ebe9e729f69dc5775dee33cde1d5067a880aAlp Toker} 176