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