fortran/openmp.cc: Fix var init and locus use to avoid uninit values [PR fortran...
[official-gcc.git] / gcc / testsuite / g++.dg / cpp1y / constexpr-tracking-const1.C
blobe081a5356595a0241a460f2f5a8018a9dfef2f5f
1 // PR c++/91264
2 // { dg-do compile { target c++14 } }
4 constexpr void
5 mod (int &r)
7   r = 99; // { dg-error "modifying a const object" }
10 constexpr int
11 fn1 ()
13   const int i = 0; // { dg-message "originally declared" }
14   mod (const_cast<int &>(i)); // { dg-message "in .constexpr. expansion of " }
15   return i;
18 constexpr int i1 = fn1 (); // { dg-message "in .constexpr. expansion of " }
20 constexpr int
21 fn2 ()
23   const int i = 5; // { dg-message "originally declared" }
24   const_cast<int &>(i) = 10; // { dg-error "modifying a const object" }
25   return i;
28 constexpr int i2 = fn2 (); // { dg-message "in .constexpr. expansion of " }
30 constexpr int
31 fn3 ()
33   const int i = 5; // { dg-message "originally declared" }
34   ++const_cast<int &>(i); // { dg-error "modifying a const object" }
35   return i;
38 constexpr int i3 = fn3 (); // { dg-message "in .constexpr. expansion of " }
40 constexpr int
41 fn4 ()
43   const int i = 5; // { dg-message "originally declared" }
44   const_cast<int &>(i)--; // { dg-error "modifying a const object" }
45   return i;
48 constexpr int i4 = fn4 (); // { dg-message "in .constexpr. expansion of " }
50 constexpr int
51 fn5 ()
53   const int i = 5; // { dg-message "originally declared" }
54   const_cast<int &>(i) += 2; // { dg-error "modifying a const object" }
55   return i;
58 constexpr int i5 = fn5 (); // { dg-message "in .constexpr. expansion of " }
60 constexpr int
61 fn6 ()
63   // This is OK.
64   int i = 3;
65   const int *cip = &i;
66   int *ip = const_cast<int *>(cip);
67   *ip = 4;
68   return i;
71 constexpr int i6 = fn6 ();
72 static_assert(i6 == 4, "");