174 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2// RUN: %clang_cc1 -fsyntax-only -verify -Wretained-language-linkage -DW_RETAINED_LANGUAGE_LINKAGE %s3extern "C" {4 extern "C" void f(int);5}6 7extern "C++" {8 extern "C++" int& g(int);9 float& g();10}11double& g(double);12 13void test(int x, double d) {14 f(x);15 float &f1 = g();16 int& i1 = g(x);17 double& d1 = g(d);18}19 20extern "C" int foo;21extern "C" int foo;22 23extern "C" const int bar;24extern "C" int const bar;25 26extern "C" struct bar d;27extern struct bar e;28 29extern "C++" {30 namespace N0 {31 struct X0 {32 int foo(int x) { return x; }33 };34 }35}36 37// PR543038namespace pr5430 {39 extern "C" void func(void);40}41using namespace pr5430;42extern "C" void pr5430::func(void) { }43 44// PR540545int f2(char *)46{47 return 0;48}49 50extern "C"51{52 int f2(int)53 {54 return f2((char *)0);55 }56}57 58namespace PR5405 {59 int f2b(char *) {60 return 0;61 }62 63 extern "C" {64 int f2b(int) {65 return f2b((char *)0); // ok66 }67 }68}69 70// PR699171extern "C" typedef int (*PutcFunc_t)(int);72 73 74// PR785975extern "C" void pr7859_a(int) {} // expected-note {{previous definition}}76extern "C" void pr7859_a(int) {} // expected-error {{redefinition}}77 78extern "C" void pr7859_b() {} // expected-note {{previous definition}}79extern "C" void pr7859_b(int) {} // expected-error {{conflicting}}80 81extern "C" void pr7859_c(short) {} // expected-note {{previous definition}}82extern "C" void pr7859_c(int) {} // expected-error {{conflicting}}83 84extern "C" {85 struct s0 {86 private:87 s0();88 s0(const s0 &);89 };90}91 92//PR775493extern "C++" template <class T> int pr7754(T param);94 95namespace N {96 int value;97}98 99extern "C++" using N::value;100 101// PR7076102extern "C" const char *Version_string = "2.9";103 104extern "C" {105 extern const char *Version_string2 = "2.9";106}107 108namespace PR9162 {109 extern "C" {110 typedef struct _ArtsSink ArtsSink;111 struct _ArtsSink {112 int sink;113 };114 }115 int arts_sink_get_type()116 {117 return sizeof(ArtsSink);118 }119}120 121namespace pr14958 {122 namespace js { extern int ObjectClass; }123 extern "C" {124 namespace js {}125 }126 int js::ObjectClass;127}128 129extern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}}130extern void PR16167_0; // expected-error {{variable has incomplete type 'void'}}131 132// PR7927133enum T_7927 {134 E_7927135};136 137extern "C" void f_pr7927(int);138 139namespace {140 extern "C" void f_pr7927(int);141 142 void foo_pr7927() {143 f_pr7927(E_7927);144 f_pr7927(0);145 ::f_pr7927(E_7927);146 ::f_pr7927(0);147 }148}149 150void bar_pr7927() {151 f_pr7927(E_7927);152 f_pr7927(0);153 ::f_pr7927(E_7927);154 ::f_pr7927(0);155}156 157namespace PR17337 {158 extern "C++" {159 class Foo;160 extern "C" int bar3(Foo *y);161 class Foo {162 int x;163 friend int bar3(Foo *y);164#ifdef W_RETAINED_LANGUAGE_LINKAGE165// expected-note@-5 {{previous declaration is here}}166// expected-warning@-3 {{retaining previous language linkage}}167#endif168 };169 extern "C" int bar3(Foo *y) {170 return y->x;171 }172 }173}174