annotate gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated1.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // P0595R1
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 // { dg-do run { target c++14 } }
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 template<int N> struct X { int v = N; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 X<__builtin_is_constant_evaluated ()> x; // type X<true>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 int y = 4;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 int a = __builtin_is_constant_evaluated () ? y : 1; // initializes a to 1
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 int b = __builtin_is_constant_evaluated () ? 2 : y; // initializes b to 2
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 int c = y + (__builtin_is_constant_evaluated () ? 2 : y); // initializes c to 2*y
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 int d = __builtin_is_constant_evaluated (); // initializes d to 1
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
11 int e = d + __builtin_is_constant_evaluated (); // initializes e to 1 + 0
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 struct false_type { static constexpr bool value = false; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 struct true_type { static constexpr bool value = true; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 template<class T, class U>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 struct is_same : false_type {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 template<class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 struct is_same<T, T> : true_type {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 constexpr int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 foo (int x)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 const int n = __builtin_is_constant_evaluated () ? 13 : 17; // n == 13
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 int m = __builtin_is_constant_evaluated () ? 13 : 17; // m might be 13 or 17 (see below)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 char arr[n] = {}; // char[13]
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 return m + sizeof (arr) + x;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 constexpr int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 bar ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 const int n = __builtin_is_constant_evaluated() ? 13 : 17;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 X<n> x1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 X<__builtin_is_constant_evaluated() ? 13 : 17> x2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 static_assert (is_same<decltype (x1), decltype (x2)>::value, "x1/x2's type");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 return x1.v + x2.v;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 int p = foo (0); // m == 13; initialized to 26
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 int q = p + foo (0); // m == 17 for this call; initialized to 56
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 static_assert (bar () == 26, "bar");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 struct S { int a, b; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 S s = { __builtin_is_constant_evaluated () ? 2 : 3, y };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 S t = { __builtin_is_constant_evaluated () ? 2 : 3, 4 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 static_assert (is_same<decltype (x), X<true> >::value, "x's type");
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 int
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 main ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 if (a != 1 || b != 2 || c != 8 || d != 1 || e != 1 || p != 26 || q != 56)
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 __builtin_abort ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 if (s.a != 3 || s.b != 4 || t.a != 2 || t.b != 4)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 __builtin_abort ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 if (foo (y) != 34)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 __builtin_abort ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 #if __cplusplus >= 201703L
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 if constexpr (foo (0) != 26)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 __builtin_abort ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 constexpr int w = foo (0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 if (w != 26)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 __builtin_abort ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 }