// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s const int global = 5; // expected-note{{variable 'global' declared const here}} void test1() { global = 2; // expected-error{{cannot assign to variable 'global' with const-qualified type 'const int'}} } void test2 () { const int local = 5; // expected-note{{variable 'local' declared const here}} local = 0; // expected-error{{cannot assign to variable 'local' with const-qualified type 'const int'}} } void test2 (const int parameter) { // expected-note{{variable 'parameter' declared const here}} parameter = 2; // expected-error{{cannot assign to variable 'parameter' with const-qualified type 'const int'}} } class test3 { int field; const int const_field = 1; // expected-note 2{{non-static data member 'const_field' declared const here}} static const int static_const_field = 1; // expected-note 2{{variable 'static_const_field' declared const here}} void test() { const_field = 4; // expected-error{{cannot assign to non-static data member 'const_field' with const-qualified type 'const int'}} static_const_field = 4; // expected-error{{cannot assign to variable 'static_const_field' with const-qualified type 'const int'}} } void test_const() const { // expected-note 2{{member function 'test3::test_const' is declared const here}} field = 4; // expected-error{{cannot assign to non-static data member within const member function 'test_const'}} const_field = 4 ; // expected-error{{cannot assign to non-static data member 'const_field' with const-qualified type 'const int'}} static_const_field = 4; // expected-error{{cannot assign to variable 'static_const_field' with const-qualified type 'const int'}} } }; const int &return_const_ref(); // expected-note{{function 'return_const_ref' which returns const-qualified type 'const int &' declared here}} void test4() { return_const_ref() = 10; // expected-error{{cannot assign to return value because function 'return_const_ref' returns a const value}} } struct S5 { int field; const int const_field = 4; // expected-note {{non-static data member 'const_field' declared const here}} }; void test5() { S5 s5; s5.field = 5; s5.const_field = 5; // expected-error{{cannot assign to non-static data member 'const_field' with const-qualified type 'const int'}} } struct U1 { int a = 5; }; struct U2 { U1 u1; }; struct U3 { const U2 u2 = U2(); // expected-note{{non-static data member 'u2' declared const here}} }; struct U4 { U3 u3; }; void test6() { U4 u4; u4.u3.u2.u1.a = 5; // expected-error{{cannot assign to non-static data member 'u2' with const-qualified type 'const U2'}} } struct A { int z; }; struct B { A a; }; struct C { B b; C(); }; const C &getc(); // expected-note{{function 'getc' which returns const-qualified type 'const C &' declared here}} void test7() { const C c; // expected-note{{variable 'c' declared const here}} c.b.a.z = 5; // expected-error{{cannot assign to variable 'c' with const-qualified type 'const C'}} getc().b.a.z = 5; // expected-error{{cannot assign to return value because function 'getc' returns a const value}} } struct D { const int n; }; // expected-note 2{{non-static data member 'n' declared const here}} struct E { D *const d = 0; }; void test8() { extern D *const d; d->n = 0; // expected-error{{cannot assign to non-static data member 'n' with const-qualified type 'const int'}} E e; e.d->n = 0; // expected-error{{cannot assign to non-static data member 'n' with const-qualified type 'const int'}} } struct F { int n; }; struct G { const F *f; }; // expected-note{{non-static data member 'f' declared const here}} void test10() { const F *f; // expected-note{{variable 'f' declared const here}} f->n = 0; // expected-error{{cannot assign to variable 'f' with const-qualified type 'const F *'}} G g; g.f->n = 0; // expected-error{{cannot assign to non-static data member 'f' with const-qualified type 'const F *'}} } void test11( const int x, // expected-note{{variable 'x' declared const here}} const int& y // expected-note{{variable 'y' declared const here}} ) { x = 5; // expected-error{{cannot assign to variable 'x' with const-qualified type 'const int'}} y = 5; // expected-error{{cannot assign to variable 'y' with const-qualified type 'const int &'}} } struct H { const int a = 0; // expected-note{{non-static data member 'a' declared const here}} const int &b = a; // expected-note{{non-static data member 'b' declared const here}} }; void test12(H h) { h.a = 1; // expected-error {{cannot assign to non-static data member 'a' with const-qualified type 'const int'}} h.b = 2; // expected-error {{cannot assign to non-static data member 'b' with const-qualified type 'const int &'}} } void test() { typedef const int &Func(); Func &bar(); bar()() = 0; // expected-error {{read-only variable is not assignable}} }