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