linkage-spec.cpp revision a3813c9c2cdcdeae4d4e5b6b85493caef1e70ab7
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 26c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregorextern "C" { 36c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor extern "C" void f(int); 46c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor} 56c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor 66c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregorextern "C++" { 76c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor extern "C++" int& g(int); 86c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor float& g(); 96c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor} 106c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregordouble& g(double); 116c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor 126c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregorvoid test(int x, double d) { 136c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor f(x); 146c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor float &f1 = g(); 156c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor int& i1 = g(x); 166c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor double& d1 = g(d); 176c6fce03ea12b7b8e812fa1b24cfe5aa8705cecaDouglas Gregor} 1817a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregor 1917a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" int foo; 2017a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" int foo; 2117a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregor 2217a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" const int bar; 2317a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorextern "C" int const bar; 24425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlsson 25425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlsson// <rdar://problem/6895431> 26425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlssonextern "C" struct bar d; 27425bfdee21d7ce13799bb7f9d74805a2d5775762Anders Carlssonextern struct bar e; 28a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor 29a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregorextern "C++" { 30a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor namespace N0 { 31a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor struct X0 { 32a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor int foo(int x) { return x; } 33a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor }; 34a24eb4ef63d5860a5a02f7532e56e84283782984Douglas Gregor } 354fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar} 369770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl 379770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl// PR5430 389770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redlnamespace pr5430 { 399770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl extern "C" void func(void); 409770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redl} 419770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redlusing namespace pr5430; 429770ef0eea1dbebb9cad93b8a564bff789568e62Sebastian Redlextern "C" void pr5430::func(void) { } 431237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor 441237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor// PR5404 451237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregorint f2(char *) 461237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor{ 471237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor return 0; 481237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor} 491237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor 501237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregorextern "C" 511237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor{ 521237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor int f2(int) 531237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor { 541237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor return f2((char *)0); 551237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor } 561237259bda343504cc0bd3cfe2198bdeea2b2fdfDouglas Gregor} 5735f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara 5835f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara// PR6991 5935f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnaraextern "C" typedef int (*PutcFunc_t)(int); 607b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 617b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 627b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall// PR7859 637b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_a(int) {} // expected-note {{previous definition}} 647b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_a(int) {} // expected-error {{redefinition}} 657b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 667b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_b() {} // expected-note {{previous definition}} 677b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_b(int) {} // expected-error {{conflicting}} 687b49202090678f45fa0c0bb5fa560d8a27b0c604John McCall 697b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_c(short) {} // expected-note {{previous definition}} 707b49202090678f45fa0c0bb5fa560d8a27b0c604John McCallextern "C" void pr7859_c(int) {} // expected-error {{conflicting}} 7145975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor 7245975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor// <rdar://problem/8318976> 7345975531e3e93033b41e04974340e4e8f7481d61Douglas Gregorextern "C" { 7445975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor struct s0 { 7545975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor private: 7645975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor s0(); 7745975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor s0(const s0 &); 7845975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor }; 7945975531e3e93033b41e04974340e4e8f7481d61Douglas Gregor} 8009a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor 8109a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor//PR7754 8209a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregorextern "C++" template <class T> int pr7754(T param); 8309a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor 8409a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregornamespace N { 8509a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor int value; 8609a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor} 8709a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregor 8809a63c97b95eb4dc6fd6b2323929e8cf12af03ffDouglas Gregorextern "C++" using N::value; 8966c42d443982a0891ce58deb7391d641ca87adc5Douglas Gregor 9066c42d443982a0891ce58deb7391d641ca87adc5Douglas Gregor// PR7076 9166c42d443982a0891ce58deb7391d641ca87adc5Douglas Gregorextern "C" const char *Version_string = "2.9"; 926d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor 93b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindolaextern "C" { 94b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindola extern const char *Version_string2 = "2.9"; 95b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindola} 96b6bead467640e4d05f6a0a90255eebc939f690a2Rafael Espindola 976d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregornamespace PR9162 { 986d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor extern "C" { 996d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor typedef struct _ArtsSink ArtsSink; 1006d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor struct _ArtsSink { 1016d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor int sink; 1026d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor }; 1036d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor } 1046d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor int arts_sink_get_type() 1056d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor { 1066d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor return sizeof(ArtsSink); 1076d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor } 1086d0468b2d3aa37c699b697922cd991ae83b64a87Douglas Gregor} 109b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola 110b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindolanamespace pr14958 { 111b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola namespace js { extern int ObjectClass; } 112b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola extern "C" { 113b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola namespace js {} 114b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola } 115b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola int js::ObjectClass; 116b98cf79a3add5c80b40a956a4cd3d9b3a23b9b22Rafael Espindola} 117aa71567ba4b8a10e9a7d668bf93e35413d7260a8David Majnemer 118aa71567ba4b8a10e9a7d668bf93e35413d7260a8David Majnemerextern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}} 119a3813c9c2cdcdeae4d4e5b6b85493caef1e70ab7David Majnemerextern void PR16167_0; // expected-error {{variable has incomplete type 'void'}} 120