linkage-spec.cpp revision 5eab8d733ce7867fda4e6d5f5afa6dfe8a105c79
1// RUN: %clang_cc1 -fsyntax-only -verify %s 2extern "C" { 3 extern "C" void f(int); 4} 5 6extern "C++" { 7 extern "C++" int& g(int); 8 float& g(); 9} 10double& g(double); 11 12void test(int x, double d) { 13 f(x); 14 float &f1 = g(); 15 int& i1 = g(x); 16 double& d1 = g(d); 17} 18 19extern "C" int foo; 20extern "C" int foo; 21 22extern "C" const int bar; 23extern "C" int const bar; 24 25// <rdar://problem/6895431> 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// PR5430 38namespace pr5430 { 39 extern "C" void func(void); 40} 41using namespace pr5430; 42extern "C" void pr5430::func(void) { } 43 44// PR5405 45int f2(char *) // expected-note {{here}} 46{ 47 return 0; 48} 49 50extern "C" 51{ 52 int f2(int) // expected-error {{with C language linkage conflicts with declaration in global scope}} 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); // ok 66 } 67 } 68} 69 70// PR6991 71extern "C" typedef int (*PutcFunc_t)(int); 72 73 74// PR7859 75extern "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 84// <rdar://problem/8318976> 85extern "C" { 86 struct s0 { 87 private: 88 s0(); 89 s0(const s0 &); 90 }; 91} 92 93//PR7754 94extern "C++" template <class T> int pr7754(T param); 95 96namespace N { 97 int value; 98} 99 100extern "C++" using N::value; 101 102// PR7076 103extern "C" const char *Version_string = "2.9"; 104 105extern "C" { 106 extern const char *Version_string2 = "2.9"; 107} 108 109namespace PR9162 { 110 extern "C" { 111 typedef struct _ArtsSink ArtsSink; 112 struct _ArtsSink { 113 int sink; 114 }; 115 } 116 int arts_sink_get_type() 117 { 118 return sizeof(ArtsSink); 119 } 120} 121 122namespace pr14958 { 123 namespace js { extern int ObjectClass; } 124 extern "C" { 125 namespace js {} 126 } 127 int js::ObjectClass; 128} 129 130extern "C" void PR16167; // expected-error {{variable has incomplete type 'void'}} 131extern void PR16167_0; // expected-error {{variable has incomplete type 'void'}} 132 133// PR7927 134enum T_7927 { 135 E_7927 136}; 137 138extern "C" void f_pr7927(int); 139 140namespace { 141 extern "C" void f_pr7927(int); 142 143 void foo_pr7927() { 144 f_pr7927(E_7927); 145 f_pr7927(0); 146 ::f_pr7927(E_7927); 147 ::f_pr7927(0); 148 } 149} 150 151void bar_pr7927() { 152 f_pr7927(E_7927); 153 f_pr7927(0); 154 ::f_pr7927(E_7927); 155 ::f_pr7927(0); 156} 157