// RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: %clang_cc1 -fsyntax-only -verify -Wretained-language-linkage -DW_RETAINED_LANGUAGE_LINKAGE %s extern "C" { extern "C" void f(int); } extern "C++" { extern "C++" int& g(int); float& g(); } double& g(double); void test(int x, double d) { f(x); float &f1 = g(); int& i1 = g(x); double& d1 = g(d); } extern "C" int foo; extern "C" int foo; extern "C" const int bar; extern "C" int const bar; // <rdar://problem/6895431> extern "C" struct bar d; extern struct bar e; extern "C++" { namespace N0 { struct X0 { int foo(int x) { return x; } }; } } // PR5430 namespace pr5430 { extern "C" void func(void); } using namespace pr5430; extern "C" void pr5430::func(void) { } // PR5405 int f2(char *) { return 0; } extern "C" { int f2(int) { return f2((char *)0); } } namespace PR5405 { int f2b(char *) { return 0; } extern "C" { int f2b(int) { return f2b((char *)0); // ok } } } // PR6991 extern "C" typedef int (*PutcFunc_t)(int); // PR7859 extern "C" void pr7859_a(int) {} // expected-note {{previous definition}} extern "C" void pr7859_a(int) {} // expected-error {{redefinition}} extern "C" void pr7859_b() {} // expected-note {{previous definition}} extern "C" void pr7859_b(int) {} // expected-error {{conflicting}} extern "C" void pr7859_c(short) {} // expected-note {{previous definition}} extern "C" void pr7859_c(int) {} // expected-error {{conflicting}} // <rdar://problem/8318976> extern "C" { struct s0 { private: s0(); s0(const s0 &); }; } //PR7754 extern "C++" template <class T> int pr7754(T param); namespace N { int value; } extern "C++" using N::value; // PR7076 extern "C" const char *Version_string = "2.9"; extern "C" { extern const char *Version_string2 = "2.9"; } namespace PR9162 { extern "C" { typedef struct _ArtsSink ArtsSink; struct _ArtsSink { int sink; }; } int arts_sink_get_type() { return sizeof(ArtsSink); } } namespace pr14958 { namespace js { extern int ObjectClass; } extern "C" { namespace js {} } int js::ObjectClass; } extern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}} extern void PR16167_0; // expected-error {{variable has incomplete type 'void'}} // PR7927 enum T_7927 { E_7927 }; extern "C" void f_pr7927(int); namespace { extern "C" void f_pr7927(int); void foo_pr7927() { f_pr7927(E_7927); f_pr7927(0); ::f_pr7927(E_7927); ::f_pr7927(0); } } void bar_pr7927() { f_pr7927(E_7927); f_pr7927(0); ::f_pr7927(E_7927); ::f_pr7927(0); } namespace PR17337 { extern "C++" { class Foo; extern "C" int bar3(Foo *y); class Foo { int x; friend int bar3(Foo *y); #ifdef W_RETAINED_LANGUAGE_LINKAGE // expected-note@-5 {{previous declaration is here}} // expected-warning@-3 {{retaining previous language linkage}} #endif }; extern "C" int bar3(Foo *y) { return y->x; } } }