// test that free functions can be redeclared with contracts without affecting // normal default parm handling // { dg-do run } // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" } #include int f(int a, int, int c = 10); int f(int a, int b = 11, int); int f(int a, int b, int c) [[ pre: a < 0 ]] [[ pre: b < 0 ]] [[ pre: c < 0 ]]; int f(int, int, int); int f(int a, int b, int c) { printf("f: a: %d, b: %d, c: %d\n", a, b, c); return a * b - c; } int f(int a = 12, int, int); int main(int, char **) { f(1,1,1); printf("=====\n"); f(1,1); printf("=====\n"); f(1); printf("=====\n"); f(); printf("=====\n"); } // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } } // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" } // { dg-output "f: a: 1, b: 1, c: 1(\n|\r\n|\r)" } // { dg-output "=====(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" } // { dg-output "f: a: 1, b: 1, c: 10(\n|\r\n|\r)" } // { dg-output "=====(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" } // { dg-output "f: a: 1, b: 11, c: 10(\n|\r\n|\r)" } // { dg-output "=====(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:10: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:11: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function f at .*.C:12: .*(\n|\r\n|\r)" } // { dg-output "f: a: 12, b: 11, c: 10(\n|\r\n|\r)" } // { dg-output "=====(\n|\r\n|\r)" }