linkage2.cpp revision 950fee2555f7a6bd193e588d6b6a941fd182391a
1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// RUN: %clang_cc1 -fsyntax-only -verify %s
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test1 {
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int x; // expected-note {{previous definition is here}}
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static int y;
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void f() {} // expected-note {{previous definition is here}}
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extern "C" {
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extern int x; // expected-error {{declaration of 'x' has a different language linkage}}
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extern int y; // OK, has internal linkage, so no language linkage.
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void f(); // expected-error {{declaration of 'f' has a different language linkage}}
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This is OK. Both test2_f don't have language linkage since they have
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// internal linkage.
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" {
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void test2_f() {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void test2_f(int x) {
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test3 {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extern "C" {
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    namespace {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extern int x2;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      void f2();
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  namespace {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int x2;
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void f2() {}
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test4 {
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void dummy() {
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void Bar();
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    class A {
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      friend void Bar();
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    };
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test5 {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void g();
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void f()
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void g();
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// pr14898
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test6 {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <class _Rp>
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class __attribute__ ((__visibility__("default"))) shared_future;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <class _Rp>
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class future {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    template <class> friend class shared_future;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    shared_future<_Rp> share();
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <class _Rp> future<_Rp>
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  get_future();
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <class _Rp>
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  struct shared_future<_Rp&> {
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    shared_future(future<_Rp&>&& __f); // expected-warning {{rvalue references are a C++11 extension}}
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void f() {
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    typedef int T;
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    get_future<int>();
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    typedef int& U;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    shared_future<int&> f1 = get_future<int&>();
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This is OK. The variables have internal linkage and therefore no language
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// linkage.
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" {
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static int test7_x;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" {
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extern int test7_x;
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" {
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static int test7_y;
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" {
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extern int test7_y;
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" { typedef int test7_F(); static test7_F test7_f; }
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" { extern test7_F test7_f; }
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// FIXME: This should be invalid. The function has no language linkage, but
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// the function type has, so this is redeclaring the function with a different
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// type.
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" {
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void test8_f();
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" {
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extern void test8_f();
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C" {
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static void test8_g();
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern "C++" {
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extern void test8_g();
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch