| // 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}} |
| } |
| |
| typedef float float4 __attribute__((ext_vector_type(4))); |
| struct OhNo { |
| float4 v; |
| void AssignMe() const { v.x = 1; } // expected-error {{cannot assign to non-static data member within const member function 'AssignMe'}} \ |
| expected-note {{member function 'OhNo::AssignMe' is declared const here}} |
| }; |
| |
| typedef float float4_2 __attribute__((__vector_size__(16))); |
| struct OhNo2 { |
| float4_2 v; |
| void AssignMe() const { v[0] = 1; } // expected-error {{cannot assign to non-static data member within const member function 'AssignMe'}} \ |
| expected-note {{member function 'OhNo2::AssignMe' is declared const here}} |
| }; |
| |
| struct OhNo3 { |
| float v[4]; |
| void AssignMe() const { v[0] = 1; } // expected-error {{cannot assign to non-static data member within const member function 'AssignMe'}} \ |
| expected-note {{member function 'OhNo3::AssignMe' is declared const here}} |
| }; |