blob: 01217807bc194b7aaa0d6e253027f1bd1da89a67 [file] [log] [blame]
// ensure that passing asserts do not affect constexpr functions
// ensure that failing asserts generate an error at runtime in constexpr funcs
// { dg-do run }
// { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
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_maybe_continue: a > 0]];
return a;
}
int main(int, char **) {
int a = wfun(10);
int b = ffun(-10);
int c = wtfun(10);
int d = ftfun(-10);
int e = explicitfn(-10);
int z = ftfun(-10.0);
return 0;
}
// { dg-output "default std::handle_contract_violation called: .*.C 12 ffun .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 30 ftfun<int> .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 36 explicitfn .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 30 ftfun<double> .*(\n|\r\n|\r)*" }