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   // expected-note@-1 3{{variable 'xc' declared const here}}
     26   x.i = 0;
     27   x.f = 0.0;
     28   x.f2 = x.f;
     29   x.d = x.f;
     30   x.f3 = 0; // expected-error{{no member named 'f3'}}
     31   x.a = 0;
     32 
     33   xc.d = 0.0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}}
     34   xc.f = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}}
     35   xc.a = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}}
     36 }
     37 
     38 
     39 struct Redecl {
     40   int x; // expected-note{{previous declaration is here}}
     41   struct y { }; // expected-warning{{declaration does not declare anything}}
     42 
     43   union {
     44     int x; // expected-error{{member of anonymous union redeclares 'x'}}
     45     float y;
     46     double z; // expected-note{{previous declaration is here}}
     47     double zz; // expected-note{{previous declaration is here}}
     48   };
     49 
     50   int z; // expected-error{{duplicate member 'z'}}
     51   void zz(); // expected-error{{duplicate member 'zz'}}
     52 };
     53 
     54 union { // expected-warning{{declaration does not declare anything}}
     55   int int_val;
     56   float float_val;
     57 };
     58 
     59 static union { // expected-warning{{declaration does not declare anything}}
     60   int int_val2;
     61   float float_val2;
     62 };
     63 
     64 void f() {
     65   int_val2 = 0; // expected-error{{use of undeclared identifier}}
     66   float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
     67 }
     68 
     69 void g() {
     70   union { // expected-warning{{declaration does not declare anything}}
     71     int i;
     72     float f2;
     73   };
     74   i = 0; // expected-error{{use of undeclared identifier}}
     75   f2 = 0.0; // expected-error{{use of undeclared identifier}}
     76 }
     77 
     78 // <rdar://problem/6483159>
     79 struct s0 { union { int f0; }; };
     80 
     81 // <rdar://problem/6481130>
     82 typedef struct { }; // expected-warning{{typedef requires a name}}
     83 
     84 // PR3675
     85 struct s1 {
     86   int f0; // expected-note{{previous declaration is here}}
     87   union {
     88     int f0; // expected-error{{member of anonymous union redeclares 'f0'}}
     89   };
     90 };
     91 
     92 // PR3680
     93 struct {}; // expected-warning{{declaration does not declare anything}}
     94 
     95 struct s2 {
     96   union {
     97     int a;
     98   } // expected-warning{{expected ';' at end of declaration list}}
     99 }; // expected-error{{expected member name or ';' after declaration specifiers}}
    100 
    101 // Make sure we don't a.k.a. anonymous structs.
    102 typedef struct {
    103   int x;
    104 } a_struct;
    105 int tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}}
    106 
    107 // This example comes out of the C11 standard; make sure we don't accidentally reject it.
    108 struct s {
    109   struct { int i; };
    110   int a[];
    111 };
    112 
    113 // PR20930
    114 struct s3 {
    115   struct { int A __attribute__((deprecated)); }; // expected-note {{'A' has been explicitly marked deprecated here}}
    116 };
    117 
    118 void deprecated_anonymous_struct_member(void) {
    119   struct s3 s;
    120   s.A = 1; // expected-warning {{'A' is deprecated}}
    121 }
    122