blob: da9c019f10aab83f38fcf205ba68149dbef967a7 [file] [log] [blame]
// check that contracts work around deduced return types
// { dg-do run }
// { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
auto g0(int a) [[ pre: a < 0 ]] [[ post r: r > 0 ]]
{
return -a * 1.2;
}
int g1(int m) [[ post r: r == m ]];
int g1(int n) [[ post s: s == n ]]
{
return -n;
}
int g2(int z)
{
return -z;
}
int g3(int z)
[[ pre: sizeof(decltype(g2(5))) > 4 ]]
{
return -z;
}
auto g4(int m) [[ post: m ]];
auto g4(int m) [[ post: m ]]
{
return -m;
}
auto g5(int m) [[ pre: m ]];
auto g5(int m) [[ pre: m ]]
{
return -m;
}
template<typename T>
auto g6(T t) [[ post r: r == t ]];
template<typename S>
auto g6(S s) [[ post q: q == s ]]
{
return -s;
}
// template<typename T>
// T g7(T t) [[ post r: r == t ]];
template<typename S>
S g7(S s) [[ post q: q == s ]]
{
return -s;
}
int main(int, char**) {
g0(5);
g1(6);
g2(1);
g3(1);
g4(0);
g5(0);
g6(5);
g6(5.5);
g7(5);
g7(6.6);
return 0;
}
// { dg-output "default std::handle_contract_violation called: .*.C 5 g0 .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 5 g0 .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 12 g1 .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 23 g3 .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 30 g4 .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 37 g5 .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 46 g6<int> .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 46 g6<double> .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 55 g7<int> .*(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 55 g7<double> .*(\n|\r\n|\r)*" }