1 // P1774R8 - Portable assumptions
2 // { dg-do run { target c++11 } }
8 { return __builtin_isfinite (x); }
12 { return __builtin_isfinite (x); }
15 isfinite (long double x)
16 { return __builtin_isfinite (x); }
20 { return __builtin_sqrtf (x); }
24 { return __builtin_sqrt (x); }
28 { return __builtin_sqrtl (x); }
37 #if __cpp_constexpr >= 201603L
38 auto f = [=] { [[__assume__ (i == 0)]]; };
48 static_assert (f1 (0) >= sizeof (int), "");
54 [[gnu::assume (i == 42)]];
61 __attribute__ ((assume (++i == 44)));
78 #if __cpp_constexpr >= 201304L
79 [[__assume__ (f5 ())]];
84 template <int ...args>
88 #if __cpp_fold_expressions >= 201411L
89 [[__gnu__::__assume__ (((args >= 0) && ...))]];
90 return ((args >= 0) && ...);
99 [[gnu::assume (std::isfinite (x) && x >= 0.0)]];
100 return std::isfinite (std::sqrt (x));
106 __attribute__((assume (std::isfinite (std::sqrt (x)))));
107 return std::sqrt (x);
110 template <typename T, T N>
114 [[__assume__ (x == N)]];
121 [[gnu::assume (x == 93 ? true : throw 1)]];
128 #if __cpp_constexpr >= 201304L
129 __attribute__((assume (++x == 43)));
134 static_assert (f12 (42) == 42, "");
138 operator bool () { return true; }
145 [[__gnu__::__assume__ (s)]];
149 template <typename T>
154 __attribute__((assume (t)));
162 double d = 42.0, e = 43.0;
164 [[__assume__ (f5 ())]];
167 [[gnu::assume (++b == 43)]];
168 if (b != 42 || *c != 42)
170 static_assert (f6 () == 1, "");
175 if (!f7 <0> () || !f7 <1, 2, 3, 4> ())
177 __attribute__((assume (d < e)));
178 if (f10 <int, 45> (45) != 45
179 || f10 <long long, 128LL> (128LL) != 128LL
180 #if __cpp_nontype_template_args >= 201911L
181 || f10 <long double, -42.0L> (-42.0L) != -42.0L
185 int i = 90, j = 91, k = 92;
186 [[__assume__ (i == 90), gnu::assume (j <= 91)]]
187 #if __cplusplus >= 201703L
188 [[using gnu:assume (k >= 92)]]
190 [[gnu::assume (k >= 92)]]
193 __attribute__((__assume__ (i == 90), assume (j <= 91))) __attribute__((assume (k >= 92)));