Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s
      2 struct X {
      3   union {
      4     float f3;
      5     double d2;
      6   } named;
      7 
      8   union {
      9     int i;
     10     float f;
     11 
     12     union { // expected-warning{{anonymous types declared in an anonymous union are an extension}}
     13       float f2;
     14       mutable double d;
     15     };
     16   };
     17 
     18   void test_unqual_references();
     19 
     20   struct { // expected-warning{{anonymous structs are a GNU extension}}
     21     int a;
     22     float b;
     23   };
     24 
     25   void test_unqual_references_const() const;
     26 
     27   mutable union { // expected-error{{anonymous union at class scope must not have a storage specifier}}
     28     float c1;
     29     double c2;
     30   };
     31 };
     32 
     33 void X::test_unqual_references() {
     34   i = 0;
     35   f = 0.0;
     36   f2 = f;
     37   d = f;
     38   f3 = 0; // expected-error{{use of undeclared identifier 'f3'}}
     39   a = 0;
     40 }
     41 
     42 void X::test_unqual_references_const() const { // expected-note 2{{member function 'X::test_unqual_references_const' is declared const here}}
     43   d = 0.0;
     44   f2 = 0; // expected-error{{cannot assign to non-static data member within const member function 'test_unqual_references_const'}}
     45   a = 0; // expected-error{{cannot assign to non-static data member within const member function 'test_unqual_references_const'}}
     46 }
     47 
     48 void test_unqual_references(X x, const X xc) {
     49   // expected-note@-1 2{{variable 'xc' declared const here}}
     50   x.i = 0;
     51   x.f = 0.0;
     52   x.f2 = x.f;
     53   x.d = x.f;
     54   x.f3 = 0; // expected-error{{no member named 'f3'}}
     55   x.a = 0;
     56 
     57   xc.d = 0.0;
     58   xc.f = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const X'}}
     59   xc.a = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const X'}}
     60 }
     61 
     62 
     63 struct Redecl {
     64   int x; // expected-note{{previous declaration is here}}
     65   class y { }; // expected-note{{previous declaration is here}}
     66 
     67   union {
     68     int x; // expected-error{{member of anonymous union redeclares 'x'}}
     69     float y; // expected-error{{member of anonymous union redeclares 'y'}}
     70     double z; // expected-note{{previous declaration is here}}
     71     double zz; // expected-note{{previous definition is here}}
     72   };
     73 
     74   int z; // expected-error{{duplicate member 'z'}}
     75   void zz(); // expected-error{{redefinition of 'zz' as different kind of symbol}}
     76 };
     77 
     78 union { // expected-error{{anonymous unions at namespace or global scope must be declared 'static'}}
     79   int int_val;
     80   float float_val;
     81 };
     82 
     83 static union {
     84   int int_val2; // expected-note{{previous definition is here}}
     85   float float_val2;
     86 };
     87 
     88 void PR21858() {
     89   void int_val2(); // expected-error{{redefinition of 'int_val2' as different kind of symbol}}
     90 }
     91 
     92 void f() {
     93   int_val2 = 0;
     94   float_val2 = 0.0;
     95 }
     96 
     97 void g() {
     98   union {
     99     int i;
    100     float f2;
    101   };
    102   i = 0;
    103   f2 = 0.0;
    104 }
    105 
    106 struct BadMembers {
    107   union {
    108     struct X { }; // expected-error {{types cannot be declared in an anonymous union}}
    109     struct { int x; int y; } y; // expected-warning{{anonymous types declared in an anonymous union are an extension}}
    110 
    111     void f(); // expected-error{{functions cannot be declared in an anonymous union}}
    112   private: int x1; // expected-error{{anonymous union cannot contain a private data member}}
    113   protected: float x2; // expected-error{{anonymous union cannot contain a protected data member}}
    114   };
    115 };
    116 
    117 // <rdar://problem/6481130>
    118 typedef union { }; // expected-warning{{typedef requires a name}}
    119 
    120 // <rdar://problem/7562438>
    121 typedef struct objc_module *Foo ;
    122 
    123 typedef struct _s {
    124     union {
    125         int a;
    126         int Foo;
    127     };
    128 } s, *ps;
    129 
    130 // <rdar://problem/7987650>
    131 namespace test4 {
    132   class A {
    133     struct { // expected-warning{{anonymous structs are a GNU extension}}
    134       int s0; // expected-note {{declared private here}}
    135       double s1; // expected-note {{declared private here}}
    136       union { // expected-warning{{anonymous types declared in an anonymous struct are an extension}}
    137         int su0; // expected-note {{declared private here}}
    138         double su1; // expected-note {{declared private here}}
    139       };
    140     };
    141     union {
    142       int u0; // expected-note {{declared private here}}
    143       double u1; // expected-note {{declared private here}}
    144       struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{anonymous types declared in an anonymous union are an extension}}
    145         int us0; // expected-note {{declared private here}}
    146         double us1; // expected-note {{declared private here}}
    147       };
    148     };
    149   };
    150 
    151   void test() {
    152     A a;
    153     (void) a.s0;  // expected-error {{private member}}
    154     (void) a.s1;  // expected-error {{private member}}
    155     (void) a.su0; // expected-error {{private member}}
    156     (void) a.su1; // expected-error {{private member}}
    157     (void) a.u0;  // expected-error {{private member}}
    158     (void) a.u1;  // expected-error {{private member}}
    159     (void) a.us0; // expected-error {{private member}}
    160     (void) a.us1; // expected-error {{private member}}
    161   }
    162 }
    163 
    164 typedef void *voidPtr;
    165 
    166 void f2() {
    167     union { int **ctxPtr; void **voidPtr; };
    168 }
    169 
    170 void foo_PR6741() {
    171     union {
    172         char *m_a;
    173         int *m_b;
    174     };
    175 
    176     if(1) {
    177         union {
    178             char *m_a;
    179             int *m_b;
    180         };
    181     }
    182 }
    183 
    184 namespace PR8326 {
    185   template <class T>
    186   class Foo {
    187   public:
    188     Foo()
    189       : x(0)
    190       , y(1){
    191     }
    192 
    193   private:
    194     const union { // expected-warning{{anonymous union cannot be 'const'}}
    195       struct { // expected-warning{{anonymous structs are a GNU extension}} expected-warning{{declared in an anonymous union}}
    196         T x;
    197         T y;
    198       };
    199       T v[2];
    200     };
    201   };
    202 
    203   Foo<int> baz;
    204 }
    205 
    206 namespace PR16630 {
    207   struct A { union { int x; float y; }; }; // expected-note {{member is declared here}}
    208   struct B : private A { using A::x; } b; // expected-note 2 {{private}}
    209   void foo () {
    210     b.x = 10;
    211     b.y = 0; // expected-error {{cannot cast 'struct B' to its private base class 'PR16630::A'}} expected-error {{'y' is a private member of 'PR16630::A'}}
    212   }
    213 }
    214