linkage2.cpp revision 02fb50d54042982bccc04c276ad2342827c8fcd3
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// RUN: %clang_cc1 -fsyntax-only -verify %s
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comnamespace test1 {
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com  int x; // expected-note {{previous definition is here}}
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com  static int y;
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com  void f() {} // expected-note {{previous definition is here}}
7971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com
857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  extern "C" {
957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com    extern int x; // expected-error {{declaration of 'x' has a different language linkage}}
1057f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com    extern int y; // OK, has internal linkage, so no language linkage.
1157f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com    void f(); // expected-error {{declaration of 'f' has a different language linkage}}
1257f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  }
1357f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com}
1457f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com
1557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com// This is OK. Both test2_f don't have language linkage since they have
16b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com// internal linkage.
176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comextern "C" {
1837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com  static void test2_f() {
197bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com  }
2030e6e2af14e84216b1c113fd7500d0822bc81daamtklein  static void test2_f(int x) {
21bcbc1788b478b1e54079318ad073e8490aa66faetfarina  }
22bcbc1788b478b1e54079318ad073e8490aa66faetfarina}
235f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com
24b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.comnamespace test3 {
25d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com  extern "C" {
268a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com    namespace {
274370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com      extern int x2;
28971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com      void f2();
295e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    }
30de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com  }
31c41295d1223136da4f9e4c65b7145360684ede4bcommit-bot@chromium.org  namespace {
325af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com    int x2;
338015dd83ae37147bb630d4751030868051ad0caereed@android.com    void f2() {}
348015dd83ae37147bb630d4751030868051ad0caereed@android.com  }
358015dd83ae37147bb630d4751030868051ad0caereed@android.com}
36e3bb3bce3e9c1f3bc8ee779b1b3383c18e560bcecommit-bot@chromium.org
37e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.comnamespace test4 {
380dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org  void dummy() {
399875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com    void Bar();
40770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com    class A {
41977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com      friend void Bar();
425e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    };
4372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com  }
44f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com}
4511db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com
462a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.comnamespace test5 {
47310478e72c63e639373465216271b81f1e4a9136epoger@google.com  static void g();
480770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com  void f()
49515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org  {
50515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org    void g();
518065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org  }
52515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org}
53515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org
54515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org// pr14898
55515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgnamespace test6 {
56ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com  template <class _Rp>
57ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com  class __attribute__ ((__visibility__("default"))) shared_future;
58cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com  template <class _Rp>
59cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com  class future {
60cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    template <class> friend class shared_future;
61cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    shared_future<_Rp> share();
626f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com  };
636f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com  template <class _Rp> future<_Rp>
646f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com  get_future();
65cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com  template <class _Rp>
6680724dfeb320d1152128cd33636c9024952432d3epoger@google.com  struct shared_future<_Rp&> {
67cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    shared_future(future<_Rp&>&& __f); // expected-warning {{rvalue references are a C++11 extension}}
68123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com  };
69cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com  void f() {
7080549fcdd50269d7e069d6db02b395fca128056ckkinnunen    typedef int T;
71cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    get_future<int>();
72cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    typedef int& U;
7376c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com    shared_future<int&> f1 = get_future<int&>();
7476c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com  }
755e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org}
768923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com
770770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com// This is OK. The variables have internal linkage and therefore no language
789875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com// linkage.
799875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comextern "C" {
800770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com  static int test7_x;
8100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}
82e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.comextern "C++" {
83e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com  extern int test7_x;
84e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com}
85b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.comextern "C++" {
86b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com  static int test7_y;
87b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com}
88b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.comextern "C" {
8946cce91f4859b9c229938d4d649870c0a43b1806reed@google.com  extern int test7_y;
9046cce91f4859b9c229938d4d649870c0a43b1806reed@google.com}
9146cce91f4859b9c229938d4d649870c0a43b1806reed@google.comextern "C" { typedef int test7_F(); static test7_F test7_f; }
9246cce91f4859b9c229938d4d649870c0a43b1806reed@google.comextern "C++" { extern test7_F test7_f; }
9300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com
9400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com// FIXME: This should be invalid. The function has no language linkage, but
9500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com// the function type has, so this is redeclaring the function with a different
9600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com// type.
9700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C++" {
983914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com  static void test8_f();
993914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com}
1003914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.comextern "C" {
1013914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com  extern void test8_f();
102dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com}
10300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" {
104d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com  static void test8_g();
105dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com}
10600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C++" {
107dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com  extern void test8_g();
10800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}
109dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com
11000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" {
11100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com  void __attribute__((overloadable)) test9_f(int c); // expected-note {{previous declaration is here}}
11200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}
113d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.comextern "C++" {
11400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com  void __attribute__((overloadable)) test9_f(int c); // expected-error {{declaration of 'test9_f' has a different language linkage}}
115dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com}
11600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com
11700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" {
11800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com  void __attribute__((overloadable)) test10_f(int);
11900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com  void __attribute__((overloadable)) test10_f(double);
12000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}
12100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com
12200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comextern "C" {
123d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com  void test11_f() {
12400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com    void  __attribute__((overloadable)) test11_g(int);
12500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com    void  __attribute__((overloadable)) test11_g(double);
12600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com  }
12700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}
128ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com