// P0595R1 // { dg-do run { target c++14 } } constexpr inline bool is_constant_evaluated () noexcept { return __builtin_is_constant_evaluated (); } template struct X { int v = N; }; X x; // type X int y = 4; int a = is_constant_evaluated () ? y : 1; // initializes a to 1 int b = is_constant_evaluated () ? 2 : y; // initializes b to 2 int c = y + (is_constant_evaluated () ? 2 : y); // initializes c to 2*y int d = is_constant_evaluated (); // initializes d to 1 int e = d + is_constant_evaluated (); // initializes e to 1 + 0 struct false_type { static constexpr bool value = false; }; struct true_type { static constexpr bool value = true; }; template struct is_same : false_type {}; template struct is_same : true_type {}; constexpr int foo (int x) { const int n = is_constant_evaluated () ? 13 : 17; // n == 13 int m = is_constant_evaluated () ? 13 : 17; // m might be 13 or 17 (see below) char arr[n] = {}; // char[13] return m + sizeof (arr) + x; } constexpr int bar () { const int n = is_constant_evaluated() ? 13 : 17; X x1; X x2; static_assert (is_same::value, "x1/x2's type"); return x1.v + x2.v; } int p = foo (0); // m == 13; initialized to 26 int q = p + foo (0); // m == 17 for this call; initialized to 56 static_assert (bar () == 26, "bar"); struct S { int a, b; }; S s = { is_constant_evaluated () ? 2 : 3, y }; S t = { is_constant_evaluated () ? 2 : 3, 4 }; static_assert (is_same >::value, "x's type"); int main () { if (a != 1 || b != 2 || c != 8 || d != 1 || e != 1 || p != 26 || q != 56) __builtin_abort (); if (s.a != 3 || s.b != 4 || t.a != 2 || t.b != 4) __builtin_abort (); if (foo (y) != 34) __builtin_abort (); #if __cplusplus >= 201703L if constexpr (foo (0) != 26) __builtin_abort (); #endif constexpr int w = foo (0); if (w != 26) __builtin_abort (); }