// basic test to ensure pre contracts work for free templates // { dg-do run } // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" } #include template int body(int a) [[ pre: a > 0 ]] { T t = a * 2.5; return t; } template int none(int a) [[ pre: a > 0 ]] { return -a; } template int arg0(T t) [[ pre: t > 0 ]] { return -t - 10; } template int arg1(int a, T t) [[ pre: a > 0 ]] [[ pre: t > 0 ]] { return -t * a; } template T ret(int a) [[ pre: a > 0 ]] { return -a; } int main(int, char**) { printf("%d\n", body(-1)); printf("%d\n", body(-2)); printf("%d\n", none(-1)); printf("%d\n", none(-2)); printf("%d\n", arg0(-1)); printf("%d\n", arg0(-2.9)); printf("%d\n", arg1(-3, -1)); printf("%d\n", arg1(-4, -2.9)); printf("%d\n", (int)ret(-3)); printf("%d\n", (int)ret(-4.9)); return 0; } // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } } // { dg-output "contract violation in function body at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "-2(\n|\r\n|\r)" } // { dg-output "contract violation in function body at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "-5(\n|\r\n|\r)" } // { dg-output "contract violation in function none at .*.C:16: .*(\n|\r\n|\r)" } // { dg-output "1(\n|\r\n|\r)" } // { dg-output "contract violation in function none at .*.C:16: .*(\n|\r\n|\r)" } // { dg-output "2(\n|\r\n|\r)" } // { dg-output "contract violation in function arg0 at .*.C:23: .*(\n|\r\n|\r)" } // { dg-output "-9(\n|\r\n|\r)" } // { dg-output "contract violation in function arg0 at .*.C:23: .*(\n|\r\n|\r)" } // { dg-output "-7(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:30: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:31: .*(\n|\r\n|\r)" } // { dg-output "-3(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:30: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:31: .*(\n|\r\n|\r)" } // { dg-output "-11(\n|\r\n|\r)" } // { dg-output "contract violation in function ret at .*.C:38: .*(\n|\r\n|\r)" } // { dg-output "3(\n|\r\n|\r)" } // { dg-output "contract violation in function ret at .*.C:38: .*(\n|\r\n|\r)" } // { dg-output "4(\n|\r\n|\r)" }