anonymous-struct-union.c revision c7f811638f8603fa373d2be724e8b1c8ba51ad75
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2struct 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
24void 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
38struct 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
53union { // expected-warning{{declaration does not declare anything}}
54  int int_val;
55  float float_val;
56};
57
58static union { // expected-warning{{declaration does not declare anything}}
59  int int_val2;
60  float float_val2;
61};
62
63void f() {
64  int_val2 = 0; // expected-error{{use of undeclared identifier}}
65  float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
66}
67
68void 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>
78struct s0 { union { int f0; }; };
79
80// <rdar://problem/6481130>
81typedef struct { }; // expected-warning{{typedef requires a name}}
82
83// PR3675
84struct 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
92struct {}; // expected-warning{{declaration does not declare anything}}
93
94struct 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.
101typedef struct {
102  int x;
103} a_struct;
104int 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.
107struct s {
108  struct { int i; };
109  int a[];
110};
111