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