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