blob: 16189cdce9de07fb8ce4d8c057094f9277dd234d [file] [log] [blame]
// test that contracts on overriding functions are found correctly
// { dg-do run }
// { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
struct Base
{
virtual int f(int a) [[ pre: a > 0 ]];
};
int Base::f(int a)
{
return a + 10;
}
// inherits original
struct Child0 : Base
{
};
// defined out of line, explicit override
struct Child1 : Base
{
virtual int f(int a) override;
};
int Child1::f(int a)
{
return a + 20;
}
// defined out of line
struct Child2 : Base
{
int f(int a);
};
int Child2::f(int a)
{
return a + 30;
}
// defined inline, explicitly override
struct Child3 : Base
{
virtual int f(int a) override
{
return a + 40;
}
};
// defined inline
struct Child4 : Base
{
int f(int a)
{
return a + 50;
}
};
#include <cstdio>
int main(int, char**)
{
Base b;
Child0 c0;
Child1 c1;
Child2 c2;
Child3 c3;
Child4 c4;
printf("Base: %d\n", b.f(-10));
printf("Child0: %d\n", c0.f(-10));
printf("Child1: %d\n", c1.f(-10));
printf("Child2: %d\n", c2.f(-10));
printf("Child3: %d\n", c3.f(-10));
printf("Child4: %d\n", c4.f(-10));
return 0;
}
// { dg-output "default std::handle_contract_violation called: .*.C 7 Base::f .*(\n|\r\n|\r)*" }
// { dg-output "Base: 0(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 7 Base::f .*(\n|\r\n|\r)*" }
// { dg-output "Child0: 0(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 7 Child1::f .*(\n|\r\n|\r)*" }
// { dg-output "Child1: 10(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 7 Child2::f .*(\n|\r\n|\r)*" }
// { dg-output "Child2: 20(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 7 Child3::f .*(\n|\r\n|\r)*" }
// { dg-output "Child3: 30(\n|\r\n|\r)*" }
// { dg-output "default std::handle_contract_violation called: .*.C 7 Child4::f .*(\n|\r\n|\r)*" }
// { dg-output "Child4: 40(\n|\r\n|\r)*" }