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