| // ensure that passing asserts do not affect constexpr functions |
| // ensure that failing asserts generate an error in a constexpr function |
| // { dg-do compile } |
| // { dg-options "-std=c++2a -fcontracts" } |
| |
| constexpr int wfun(int a) { |
| [[assert: a > 0]]; |
| return a; |
| } |
| |
| constexpr int ffun(int a) { |
| [[assert: a > 0]]; |
| return a; |
| } |
| |
| template<typename T> |
| constexpr int tfun(T a) { |
| [[assert: a > 0]]; |
| return a; |
| } |
| |
| template<typename T> |
| constexpr int wtfun(T a) { |
| [[assert: a > 0]]; |
| return a; |
| } |
| |
| template<typename T> |
| constexpr int ftfun(T a) { |
| [[assert: a > 0]]; |
| return a; |
| } |
| |
| constexpr int explicitfn(int a) { |
| [[assert ignore: a > 0]]; |
| [[assert check_never_continue: a > 0]]; |
| return a; |
| } |
| |
| int main(int, char **) { |
| constexpr int a = wfun(10); |
| constexpr int b = ffun(-10); // { dg-message "in .constexpr. expansion" } |
| // { dg-error "contract predicate" "" { target *-*-* } 12 } |
| constexpr int c = wtfun(10); |
| constexpr int d = ftfun(-10); // { dg-message "in .constexpr. expansion" } |
| // { dg-error "contract predicate" "" { target *-*-* } 30 } |
| constexpr int e = explicitfn(-10); // { dg-message "in .constexpr. expansion" } |
| // { dg-error "contract predicate" "" { target *-*-* } 36 } |
| return 0; |
| } |
| |