// 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; }