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