Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -fsyntax-only -verify %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 {
     13       float f2;
     14       double d;
     15     };
     16   };
     17 
     18   struct {
     19     int a;
     20     float b;
     21   };
     22 };
     23 
     24 void test_unqual_references(struct X x, const struct X xc) {
     25   x.i = 0;
     26   x.f = 0.0;
     27   x.f2 = x.f;
     28   x.d = x.f;
     29   x.f3 = 0; // expected-error{{no member named 'f3'}}
     30   x.a = 0;
     31 
     32   xc.d = 0.0; // expected-error{{read-only variable is not assignable}}
     33   xc.f = 0; // expected-error{{read-only variable is not assignable}}
     34   xc.a = 0; // expected-error{{read-only variable is not assignable}}
     35 }
     36 
     37 
     38 struct Redecl {
     39   int x; // expected-note{{previous declaration is here}}
     40   struct y { };
     41 
     42   union {
     43     int x; // expected-error{{member of anonymous union redeclares 'x'}}
     44     float y;
     45     double z; // expected-note{{previous declaration is here}}
     46     double zz; // expected-note{{previous declaration is here}}
     47   };
     48 
     49   int z; // expected-error{{duplicate member 'z'}}
     50   void zz(); // expected-error{{duplicate member 'zz'}}
     51 };
     52 
     53 union { // expected-warning{{declaration does not declare anything}}
     54   int int_val;
     55   float float_val;
     56 };
     57 
     58 static union { // expected-warning{{declaration does not declare anything}}
     59   int int_val2;
     60   float float_val2;
     61 };
     62 
     63 void f() {
     64   int_val2 = 0; // expected-error{{use of undeclared identifier}}
     65   float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
     66 }
     67 
     68 void g() {
     69   union { // expected-warning{{declaration does not declare anything}}
     70     int i;
     71     float f2;
     72   };
     73   i = 0; // expected-error{{use of undeclared identifier}}
     74   f2 = 0.0; // expected-error{{use of undeclared identifier}}
     75 }
     76 
     77 // <rdar://problem/6483159>
     78 struct s0 { union { int f0; }; };
     79 
     80 // <rdar://problem/6481130>
     81 typedef struct { }; // expected-warning{{typedef requires a name}}
     82 
     83 // PR3675
     84 struct s1 {
     85   int f0; // expected-note{{previous declaration is here}}
     86   union {
     87     int f0; // expected-error{{member of anonymous union redeclares 'f0'}}
     88   };
     89 };
     90 
     91 // PR3680
     92 struct {}; // expected-warning{{declaration does not declare anything}}
     93 
     94 struct s2 {
     95   union {
     96     int a;
     97   } // expected-warning{{expected ';' at end of declaration list}}
     98 }; // expected-error{{expected member name or ';' after declaration specifiers}}
     99 
    100 // Make sure we don't a.k.a. anonymous structs.
    101 typedef struct {
    102   int x;
    103 } a_struct;
    104 int tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}}
    105 
    106 // This example comes out of the C11 standard; make sure we don't accidentally reject it.
    107 struct s {
    108   struct { int i; };
    109   int a[];
    110 };
    111