blob: d88abc3c3b9e9385ceb6a6c72ed5ba5e4fa17cee [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregor4920f1f2009-01-12 22:49:06 +00002struct 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'}}
Chris Lattner1829a6d2009-02-23 22:00:08 +000050 void zz(); // expected-error{{duplicate member 'zz'}}
Douglas Gregor4920f1f2009-01-12 22:49:06 +000051};
52
Douglas Gregorcb821d02010-04-08 21:33:23 +000053union { // expected-warning{{declaration does not declare anything}}
Douglas Gregor4920f1f2009-01-12 22:49:06 +000054 int int_val;
55 float float_val;
56};
57
Douglas Gregorcb821d02010-04-08 21:33:23 +000058static union { // expected-warning{{declaration does not declare anything}}
Douglas Gregor4920f1f2009-01-12 22:49:06 +000059 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() {
Douglas Gregorcb821d02010-04-08 21:33:23 +000069 union { // expected-warning{{declaration does not declare anything}}
Douglas Gregor4920f1f2009-01-12 22:49:06 +000070 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>
Douglas Gregorcb821d02010-04-08 21:33:23 +000081typedef struct { }; // expected-warning{{declaration does not declare anything}}
Daniel Dunbarc8d8fa92009-02-27 17:07:01 +000082
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};
Douglas Gregora71c1292009-03-06 23:06:59 +000090
Douglas Gregore950d4b2009-03-06 23:28:18 +000091// PR3680
Douglas Gregorcb821d02010-04-08 21:33:23 +000092struct {}; // expected-warning{{declaration does not declare anything}}
Douglas Gregore950d4b2009-03-06 23:28:18 +000093
94struct s2 {
95 union {
96 int a;
Carl Norume224ba72011-03-07 22:57:45 +000097 } // expected-warning{{expected ';' at end of declaration list}}
Douglas Gregore950d4b2009-03-06 23:28:18 +000098}; // expected-error{{expected member name or ';' after declaration specifiers}}
John McCall64f7e252010-01-13 22:07:44 +000099
100// Make sure we don't a.k.a. anonymous structs.
101typedef struct {
102 int x;
103} a_struct;
Douglas Gregor08a41902010-04-09 17:53:29 +0000104int tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}}