1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
24920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregorstruct X {
34920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  union {
44920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    float f3;
54920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    double d2;
64920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  } named;
74920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
84920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  union {
94920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    int i;
104920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    float f;
114920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
124920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    union {
134920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor      float f2;
144920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor      double d;
154920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    };
164920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  };
174920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
184920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  struct {
194920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    int a;
204920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    float b;
214920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  };
224920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor};
234920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
244920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregorvoid test_unqual_references(struct X x, const struct X xc) {
254920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  x.i = 0;
264920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  x.f = 0.0;
274920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  x.f2 = x.f;
284920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  x.d = x.f;
294920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  x.f3 = 0; // expected-error{{no member named 'f3'}}
304920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  x.a = 0;
314920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
324920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  xc.d = 0.0; // expected-error{{read-only variable is not assignable}}
334920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  xc.f = 0; // expected-error{{read-only variable is not assignable}}
344920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  xc.a = 0; // expected-error{{read-only variable is not assignable}}
354920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor}
364920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
374920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
384920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregorstruct Redecl {
394920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  int x; // expected-note{{previous declaration is here}}
404920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  struct y { };
414920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
424920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  union {
434920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    int x; // expected-error{{member of anonymous union redeclares 'x'}}
444920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    float y;
454920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    double z; // expected-note{{previous declaration is here}}
464920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    double zz; // expected-note{{previous declaration is here}}
474920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  };
484920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
494920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  int z; // expected-error{{duplicate member 'z'}}
501829a6db2ec19e08061f0bb2f4c52a8e5e4efaf0Chris Lattner  void zz(); // expected-error{{duplicate member 'zz'}}
514920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor};
524920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
53cb821d045f5e445384f34d05a526955036073c4aDouglas Gregorunion { // expected-warning{{declaration does not declare anything}}
544920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  int int_val;
554920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  float float_val;
564920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor};
574920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
58cb821d045f5e445384f34d05a526955036073c4aDouglas Gregorstatic union { // expected-warning{{declaration does not declare anything}}
594920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  int int_val2;
604920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  float float_val2;
614920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor};
624920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
634920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregorvoid f() {
644920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  int_val2 = 0; // expected-error{{use of undeclared identifier}}
654920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
664920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor}
674920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
684920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregorvoid g() {
69cb821d045f5e445384f34d05a526955036073c4aDouglas Gregor  union { // expected-warning{{declaration does not declare anything}}
704920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    int i;
714920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor    float f2;
724920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  };
734920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  i = 0; // expected-error{{use of undeclared identifier}}
744920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor  f2 = 0.0; // expected-error{{use of undeclared identifier}}
754920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor}
764920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
774920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor// <rdar://problem/6483159>
784920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregorstruct s0 { union { int f0; }; };
794920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor
804920f1ffb62b13b88e579476803c093f97f3e17fDouglas Gregor// <rdar://problem/6481130>
81cb821d045f5e445384f34d05a526955036073c4aDouglas Gregortypedef struct { }; // expected-warning{{declaration does not declare anything}}
82c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar
83c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar// PR3675
84c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbarstruct s1 {
85c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar  int f0; // expected-note{{previous declaration is here}}
86c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar  union {
87c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar    int f0; // expected-error{{member of anonymous union redeclares 'f0'}}
88c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar  };
89c8d8fa965e3d34335959923b0079f1d23ca5767dDaniel Dunbar};
90a71c129fb8052a143cbf548963a8db2150b0078eDouglas Gregor
91e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8Douglas Gregor// PR3680
92cb821d045f5e445384f34d05a526955036073c4aDouglas Gregorstruct {}; // expected-warning{{declaration does not declare anything}}
93e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8Douglas Gregor
94e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8Douglas Gregorstruct s2 {
95e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8Douglas Gregor  union {
96e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8Douglas Gregor    int a;
97e224ba7e3e604113aa160c379293bcb6425e8f36Carl Norum  } // expected-warning{{expected ';' at end of declaration list}}
98e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8Douglas Gregor}; // expected-error{{expected member name or ';' after declaration specifiers}}
9964f7e258e9c43eefb7f82dfcd600abeed48dc395John McCall
10064f7e258e9c43eefb7f82dfcd600abeed48dc395John McCall// Make sure we don't a.k.a. anonymous structs.
10164f7e258e9c43eefb7f82dfcd600abeed48dc395John McCalltypedef struct {
10264f7e258e9c43eefb7f82dfcd600abeed48dc395John McCall  int x;
10364f7e258e9c43eefb7f82dfcd600abeed48dc395John McCall} a_struct;
10408a41901e18aeb91b87d031b93df70374af02564Douglas Gregorint tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}}
10511e70d7fe2eb11874c3619ad26dc2b525b81074fEli Friedman
10611e70d7fe2eb11874c3619ad26dc2b525b81074fEli Friedman// This example comes out of the C11 standard; make sure we don't accidentally reject it.
10711e70d7fe2eb11874c3619ad26dc2b525b81074fEli Friedmanstruct s {
10811e70d7fe2eb11874c3619ad26dc2b525b81074fEli Friedman  struct { int i; };
10911e70d7fe2eb11874c3619ad26dc2b525b81074fEli Friedman  int a[];
11011e70d7fe2eb11874c3619ad26dc2b525b81074fEli Friedman};
111