158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s 258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarconst int global = 5; // expected-note{{variable 'global' declared const here}} 458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test1() { 558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar global = 2; // expected-error{{cannot assign to variable 'global' with const-qualified type 'const int'}} 658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test2 () { 958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int local = 5; // expected-note{{variable 'local' declared const here}} 1058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar local = 0; // expected-error{{cannot assign to variable 'local' with const-qualified type 'const int'}} 1158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 1258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 1358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test2 (const int parameter) { // expected-note{{variable 'parameter' declared const here}} 1458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar parameter = 2; // expected-error{{cannot assign to variable 'parameter' with const-qualified type 'const int'}} 1558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 1658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 1758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarclass test3 { 1858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar int field; 1958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int const_field = 1; // expected-note 2{{non-static data member 'const_field' declared const here}} 2058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar static const int static_const_field = 1; // expected-note 2{{variable 'static_const_field' declared const here}} 2158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar void test() { 2258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const_field = 4; // expected-error{{cannot assign to non-static data member 'const_field' with const-qualified type 'const int'}} 2358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar static_const_field = 4; // expected-error{{cannot assign to variable 'static_const_field' with const-qualified type 'const int'}} 2458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 2558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar void test_const() const { // expected-note 2{{member function 'test3::test_const' is declared const here}} 2658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar field = 4; // expected-error{{cannot assign to non-static data member within const member function 'test_const'}} 2758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const_field = 4 ; // expected-error{{cannot assign to non-static data member 'const_field' with const-qualified type 'const int'}} 2858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar static_const_field = 4; // expected-error{{cannot assign to variable 'static_const_field' with const-qualified type 'const int'}} 2958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 3058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 3158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 3258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarconst int &return_const_ref(); // expected-note{{function 'return_const_ref' which returns const-qualified type 'const int &' declared here}} 3358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 3458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test4() { 3558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar return_const_ref() = 10; // expected-error{{cannot assign to return value because function 'return_const_ref' returns a const value}} 3658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 3758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 3858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct S5 { 3958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar int field; 4058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int const_field = 4; // expected-note {{non-static data member 'const_field' declared const here}} 4158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 4258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 4358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test5() { 4458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar S5 s5; 4558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar s5.field = 5; 4658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar s5.const_field = 5; // expected-error{{cannot assign to non-static data member 'const_field' with const-qualified type 'const int'}} 4758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 4858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 4958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct U1 { 5058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar int a = 5; 5158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 5258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 5358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct U2 { 5458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar U1 u1; 5558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 5658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 5758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct U3 { 5858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const U2 u2 = U2(); // expected-note{{non-static data member 'u2' declared const here}} 5958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 6058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 6158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct U4 { 6258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar U3 u3; 6358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 6458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 6558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test6() { 6658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar U4 u4; 6758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar u4.u3.u2.u1.a = 5; // expected-error{{cannot assign to non-static data member 'u2' with const-qualified type 'const U2'}} 6858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 6958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 7058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct A { 7158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar int z; 7258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 7358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct B { 7458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar A a; 7558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 7658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct C { 7758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar B b; 7858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar C(); 7958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 8058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarconst C &getc(); // expected-note{{function 'getc' which returns const-qualified type 'const C &' declared here}} 8158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test7() { 8258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const C c; // expected-note{{variable 'c' declared const here}} 8358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar c.b.a.z = 5; // expected-error{{cannot assign to variable 'c' with const-qualified type 'const C'}} 8458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 8558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar getc().b.a.z = 5; // expected-error{{cannot assign to return value because function 'getc' returns a const value}} 8658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 8758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 8858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct D { const int n; }; // expected-note 2{{non-static data member 'n' declared const here}} 8958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct E { D *const d = 0; }; 9058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test8() { 9158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar extern D *const d; 9258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar d->n = 0; // expected-error{{cannot assign to non-static data member 'n' with const-qualified type 'const int'}} 9358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 9458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar E e; 9558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar e.d->n = 0; // expected-error{{cannot assign to non-static data member 'n' with const-qualified type 'const int'}} 9658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 9758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 9858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct F { int n; }; 9958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct G { const F *f; }; // expected-note{{non-static data member 'f' declared const here}} 10058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test10() { 10158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const F *f; // expected-note{{variable 'f' declared const here}} 10258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar f->n = 0; // expected-error{{cannot assign to variable 'f' with const-qualified type 'const F *'}} 10358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 10458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar G g; 10558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar g.f->n = 0; // expected-error{{cannot assign to non-static data member 'f' with const-qualified type 'const F *'}} 10658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 10758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 10858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test11( 10958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int x, // expected-note{{variable 'x' declared const here}} 11058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int& y // expected-note{{variable 'y' declared const here}} 11158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar ) { 11258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar x = 5; // expected-error{{cannot assign to variable 'x' with const-qualified type 'const int'}} 11358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar y = 5; // expected-error{{cannot assign to variable 'y' with const-qualified type 'const int &'}} 11458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 11558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 11658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct H { 11758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int a = 0; // expected-note{{non-static data member 'a' declared const here}} 11858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar const int &b = a; // expected-note{{non-static data member 'b' declared const here}} 11958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}; 12058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar 12158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid test12(H h) { 12258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar h.a = 1; // expected-error {{cannot assign to non-static data member 'a' with const-qualified type 'const int'}} 12358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar h.b = 2; // expected-error {{cannot assign to non-static data member 'b' with const-qualified type 'const int &'}} 12458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar} 12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid test() { 12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar typedef const int &Func(); 12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Func &bar(); 13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar bar()() = 0; // expected-error {{read-only variable is not assignable}} 13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 132